目录
2.head of line blocking 队头阻塞问题
HTTP协议过程
HTTP协议是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑。。)之间进行任何一种通信都必须按照HTTP协议进行,否则无法连接。
基于HTTP协议的客户端/服务器请求响应机制的信息交换过程包含下面几个步骤:
1) 建立连接:客户端与服务器建立TCP连接(三次握手)
2) 客户端发送请求:打开一个连接后,客户端把请求信息发送到服务器的相应端口上,完成请求动作提交。
3) 服务器发送响应:服务器在处理完客户端请求之后,要向客户端发送响应消息。
4) 关闭连接:客户端和服务器端都可以关闭套接字来结束TCP/IP对话(四次挥手)
下面针对每一步进行讲解:
一、客户端发送请求:
1.一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
(1)请求行
请求行由请求方法、请求地址和协议版本三部分组成。
HTTP协议的常用请求方法有以下几种:
HTTP请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URL所标识的资源(向服务器请求资源)
POST 在Request-URL所标识的资源后附加新的数据(常用于提交表单)
HEAD 请求获取由Request-URL所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URL作为其标识
DELETE 请求服务器删除Request-URL所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
GET与POST的区别
1、get在浏览器回退时是无害的,而post会再次提交请求。(记住)
2、get请求会被浏览器主动缓存,而post不会,除非手动设置。(记住)
3、get产生的url地址可以被收藏,而post不可以。
4、get请求只能进行url编码,而post支持多种编码方式。
5、get请求参数会被完整保留在浏览器历史记录里,而post中的参数不会被保留。(记住)
6、get参数通过url传递,post放在request body 中。(记住)
7、get请求在url中传送的参数是有长度限制的,而post没有限制。
8、对参数的数据类型,get只接受ASCII字符,而post没有限制。
9、get比post更不安全,因为参数直接暴露在url上,所以不能用来传递敏感信息。
请求地址
即为URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>(端口和路径有时可以省略,HTTP默认端口号是80)
协议版本
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
(2)请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
(3)空行
表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。
(4)请求数据
下面是一个post请求的请求数据示例
POST /index.php HTTP/1.1 请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
空行
username=aa&password=1234 请求数据
二.服务器发送响应
HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。
(1)状态行
由3部分组成,分别为:协议版本,状态码,状态码描述。
其中协议版本与请求报文一致,状态码描述是对状态码的简单描述,所以这里就只介绍状态码。
状态代码为3位数字。
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。
(2)响应头部
与请求头部类似,为响应报文添加了一些附加信息
(3)响应数据
以下为一个响应示例
HTTP/1.1 200 OK 状态行
Date: Sun, 17 Mar 2013 08:12:54 GMT 响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
空行
响应数据HTTP响应示例
Hello HTTP!
HTTP请求与响应的流程图