HTTP概述
1、 telnet的使用
在一般的场景中,我们都使用telnet来测试一个端口的连通性,但是也是可以使用telnet来进行发送HTTP请求,如下所示:
[root@rsyncserver~]# netstat -tnlp|grep httpd(httpd监听了80端口)
tcp 0 0 :::80 :::* LISTEN 1368/httpd
[root@rsyncserver~]# telnet 192.168.1.70 80 (使用telnet来连接80端口)
Trying192.168.1.70...
Connected to192.168.1.70.
Escape characteris '^]'. (已连接上80端口)
GET / HTTP/1.1 (发送HTTP请求)
HOST:www.kel.com(区分不同的虚拟主机)
HTTP/1.1 200 OK (收到HTTP的响应报文)
Date: Mon, 19Dec 2016 16:59:04 GMT
Server: Apache/2.4.23(Unix)
X-Powered-By:PHP/5.5.38
Transfer-Encoding:chunked
Content-Type:text/html
c (响应的内容主体)
susceess
0
Connectionclosed by foreign host.
在进行查看连接的时候,显示如下:
[root@rsyncserverkel.com]# netstat -an |grep "192.168.1.70:80"(表示连接上端口,等待发送请求)
tcp 0 0 192.168.1.70:80 192.168.1.11:49592 SYN_RECV
[root@rsyncserverkel.com]# netstat -an |grep "192.168.1.70:80" (建立连接之后,收到请求,回复请求)
tcp 0 0 ::ffff:192.168.1.70:80 ::ffff:192.168.1.11:49592 ESTABLISHED
[root@rsyncserverkel.com]# netstat -an |grep "192.168.1.70:80" (连接即将断开)
tcp 0 0 ::ffff:192.168.1.70:80 ::ffff:192.168.1.11:49592 TIME_WAIT
2、 关于HTTP协议
在使用telnet的时候,使用了HTTP协议的请求与响应,HTTP的请求格式如下:
<method><url> <version>
报文首部
空行
请求的主体
HTTP响应的格式如下:
<version><status> <reason-message>
报文首部
空行
返回的信息主体
报文的第一行称之为起始行,首部域的格式主要是name:value,使用冒号进行分割,空行主要用来表示报文首部结束,响应报文还有响应的报文的主体,在上面telnel中,也就是httpd进程返回的html文档。
Method方法一般如下所示:
GET:服务器向客户端发送请求的资源
PUT:将客户端的数据存储到服务器的资源中
DELETE:将服务器中删除一些资源
POST:将客户端数据发送到服务器网关程序
HEAD:仅发送资源响应中的首部信息
状态码:
200:表示成功类型信息,一般显示为OK
3XX:重定向类的信息,例如301永久重定向,302临时重定向,304使用缓存
4XX:客户端错误信息,例如404表示页面未找到
5XX:服务端错误信息,例如500服务器内部错误
3、 虚拟主机
在一般的场景中,都是一台物理机部署一个站点,就是使用IP和端口标识唯一的主机,但是在虚拟主机中,也就是一太物理机上部署很多个虚拟站点,使用虚拟站点的时候,可以使用三种方式:
HTTP协议是建立在TCP/IP协议之上的,TCP/IP协议主要是根据IP地址和PORT来唯一确定一台主机的通信,那么基于域名的虚拟主机的实现,怎么来区分不同的虚拟站点(两个站点的IP地址和端口完全一样)?
查看如下的telnet例子:
[root@rsyncserver~]# telnet 192.168.1.70 80
Trying192.168.1.70...
Connected to192.168.1.70.
Escape characteris '^]'.
GET / HTTP/1.1 (未指定虚拟主机的域名,无法找到相应的站点)
HTTP/1.1 400 Bad Request
Date: Mon, 19Dec 2016 17:56:03 GMT
Server:Apache/2.4.23 (Unix)
Content-Length:226
Connection:close
Content-Type:text/html; charset=iso-8859-1
<!DOCTYPEHTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>BadRequest</h1>
<p>Yourbrowser sent a request that this server could not understand.<br />
</p>
</body></html>
Connectionclosed by foreign host.
可以看到,在使用HTTP协议的时候,请求报文的首部会包含一个HOST:www.kel.com,也就是指定虚拟主机名称,从而根据HTTP协议的首部HOST找到对应的站点,从而访问对应的资源。
4、 服务器处理模型
第一种处理模型为,单进程/单线程来处理请求(会阻塞其他的请求):
第二个处理模型为,多进程/多线程处理一个请求:
第三个处理模型为,一个进程处理多个请求,这个进程为管理进程,而真正工作的为线程:
第四个处理模型为,多个进程处理多个请求,会启动几个管理进程,每个进程又启动多个线程:
当一个进程里有多个线程的时候,那么怎么来判断线程是否空闲,主要就是使用到事件驱动的方式,也就是当一个线程处理请求完成之后,这个线程的状态发生改变,通知进程,线程在空闲中。
在WEB服务器中,服务器主要做的操作如下所示:
1、建立连接--接受或拒绝客户端连接请求
2、接受请求--通过网络读取HTTP请求报文
3、处理请求--解析请求
4、访问资源--访问请求中的相关资源
5、构建响应--使用正确的首部生成HTTP响应报文
6、发送相应--向客户端发送生成的响应报文
7、记录日志--把已经完成的HTTP日志信息记录在日志文件中
更多相关文章
- 带你深入熟悉你所不知道的ICMP
- Nginx Ingress的一些奇巧淫技
- 让DNS运行在容器中
- 控制器访问与参数解析类以及api天气接口实现输入城市查询天气
- PHP: 解析pathinfo(从url解析控制器和方法) 和 cUrl的简单应用
- jqueryDom操作与ajax请求
- 面试官:说说你之前负责的系统,QPS 能达到多少?
- 阿里问题定位神器 Arthas 的骚操作,定位线上BUG,超给力!
- 扎心一问:前后端分离开发,RESTful 接口要怎样设计?