http 协议简介,请求头域
乐果 发表于 2017 年 11 月 04 日 标签:tcphttp
最近想自己写一个http代理服务,因此重新温习下http协议知识~
HTTP协议简介
浏览器和Web服务器之间一问一答的交互过程遵守一定的规则,这个规则就是HTTP协议。HTTP协议时TCP/IP协议集中的一个应用层协议,定义了浏览器和Web服务器之间交换数据过程和数据本身的格式。现在广泛应用的有HTTP/1.0和HTTP/1.1两个版本,1.1和1.0相比最大的特点就是增加对长连接的支持。
HTTP/1.0的通信过程
HTTP/1.0只支持短连接,每次连接只处理一个请求,即使对同一站点的每一个页面的访问,浏览器和服务器之间都要建立一次单独的链接。
HTTP /1.1的通信过程
HTTP/1.1支持长连接,在一个TCP连接上可以传送多个HTTP请求和应答,减少建立和关闭连接的消耗和延迟。例如一个包含多张图片资源的网页文件的多个请求和响应可以在同一个连接中传输,并且还允许浏览器客户端不用等待上一次请求的结果返回就可以发送下一个请求,也就是支持pipeline管线化。
HTTP请求
完整的HTTP请求包括:一个请求行、若干HTTP头域和可选的实体内容三部分:
请求行
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议版本,格式如下:
Method Request-URI HTTP-Version CRLF
其中的Method表示请求方法,Request-URI是同一资源标识符,HTTP-Version表示请求的HTTP协议版本,CRLF表示回车换行。
请求方法有8种,方法名全为大写:
(1)GET 请求获取Request-URI指定的资源
(2)HEAD 请求获取Request-URI制定资源的响应消息报头
(3)POST 用于向服务器提交数据,正常情况下带有“消息体”
(4)PUT 请求服务器存储一个资源,并用Request-URI作为其标识
(5)DELETE 请求服务器删除Request-URI所标识的资源
(6)TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
(7)CONNECT 保留将来使用
(8)OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
HTTP头域分为四种:通用头域、请求头域、响应头域和实体头域。每个头域由一个域名、冒号和域值三部分组成,域名大小写无关,域值前可以添加任何数量的空格符。
通用头域
通用头域是指请求和响应都支持的HTTP头域,最常见的有Cache-Control、Connection和Transfer-Encoding,具体含义如下:
(1) Cache-Control:指定请求和相应遵循的缓存机制,最常见的值是no-cache,指示请求和响应消息不能缓存;
(2) Connection:用于指定处理完本次请求/响应后,客户端和服务器是否还要继续保持连接。
(3) Transfer-Encoding:用于指定实体内容的传输编码方式。
请求头域
请求头域是只有在请求头中带有的,用于向服务器传递关于请求或者关于客户端的附件信息。常见的有:Accept、Accept-Encoding、Accept-Language、Accept-Charset、Host、Referer、User-Agent和Cookie,具体含义如下:
(1) Accept: 用于指定客户端程序能够处理的MIME类型,多个时用逗号隔开;
(2) Accept-Encoding:指定客户端程序支持的压缩方式;
(3) Accept-Language: 指定客户端期望返回哪个国家语言的文档;
(4) Accept-Charset:指定客户端程序可以使用的字符集;
(5) Host:指定资源所在的主机名和端口号;
(6) Referer:指定请求uri的源资源地址,也就是用户从哪个uri过来,允许服务器生成回退链表;
(7) User-Agent:浏览器客户端信息,如使用哪种浏览器等;
(8) Cookie:服务器在浏览器端留下的信息,这是最重要的请求头字段之一,例如访问百度的时候通常会带有类似如下的Cookie:
BAIDUID=27C48D40C9CDCF48CEAAFCFD9C47FC52:FG=1; BD_UTK_DVT=1
响应头域
响应头域只在HTTP响应中出现。
实体头域
HTTP请求和响应中都可以包含实体头域,实体头域包含实体内容的一些信息。常见的实体头域有:Content-Encoding、Content-Length、Content-Type和Expires,具体含义如下:
(1) Content-Encoding:指明实体内容采用的压缩方式;
(2) Content-Length:指明实体内容的长度,单位为字节;
(3) Content-Type:指定实体内容的MIME类型;
(4) Expires:指明实体内容在什么时间之后过期,不再缓存。
可选实体内容
HTTP请求是否带有实体内容主要看请求行中的请求方法,我们只分析GET和POST两种主要的类型,GET方法用于获取服务器上的特定资源,一般没有实体内容。POST方法用于向服务器提交数据,一般带有实体内容。下面是一个请求方法为POST的HTTP请求的完整数据(其中绿色标注的部分是实体内容):
POST /deal_post.php HTTP/1.1
Referer: http://网站域名/post.php
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0
Host: 网站域名
Content-Length: 43
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: BAIDUID=27C48D40C9CDCF48CEAAFCFD9C47FC52:FG=1;
data1=a&data2=b&data3=c&Submit=�ύ