一、HTTP的请求报文的格式
一个HTTP的请求报文的通用格式如下:
请求行
请求行中的方法和其大致作用如下表
请求行中的URL表示请求资源的路径和名称,版本字段是当前HTTP的版本
首部行
首部行中包含一些首部字段和对应的值
空行就是负责换行,空行后面的统一都是实体体
二、报文示例
请求行如下
GET /wireshark-labs/HTTP-wireshark-file1.html HTTP/1.1\r\n
表示请求获取服务器资源/wireshark-labs/HTTP-wireshark-file1.html,http的版本是1.1
首部行如下
Host: gaia.cs.umass.edu\r\n //Host字段后面的值表示主机的域名 <Host: gaia.cs.umass.edu\r\n>
因为同一台服务器上可以运行多个域名。当请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决。但相同的IP地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。
因此,就需要使用首部字段Host来明确指出请求的主机名
Host示意图
Connection: keep-alive\r\n//connection表示持续连接还是非持续连接<Connection: keep-alive\r\n>
Cache-Control字段负责操作缓存的工作机制,max-age是必需的
Cache-Control: max-age=0\r\n<Cache-Control: max-age=0\r\n> //当max-age为0时,缓存服务器需要将请求转发给源服务器。
当客户端发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。
当指定max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。
max-age为一周时的示意图
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36\r\n <User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36\r\n> //User-Agent会包含请求的浏览器名称,这里用的是Chrome/87.0.4280.88
User-Agent会将创建请求的浏览器名称和用户代理名称等信息传达给服务器
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n <Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n>//Accept首部字段可通知服务器用户或者用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。
若想要给显示的媒体类型增加优先级,可使用q表示权重,用分号分隔。q的范围是0~1。不指定q时,默认权重为q=1.0。当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
示意图
Accept-Encoding: gzip, deflate\r\n<Accept-Encoding: gzip, deflate\r\n> //Accept-Encoding用来告知服务器用户或用户代理支持的内容编码为gzip和deflate
示意图
Accept-Language: zh-CN,zh;q=0.9\r\n//表示接受的语言为中文,权重为0.9<Accept-Language: zh-CN,zh;q=0.9\r\n>Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。
示意图
If-None-Match: "80-5b85e175214a7"\r\n//在If-None-Match的字段值与ETag值不一致时,可处理该GET请求
当If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,它就告知服务器处理该请求。
在GET或HEAD方法中使用首部字段If-None-Match可获取最新的资源
示意图
If-Modified-Since: Fri, 08 Jan 06:59:01 GMT\r\n
若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。
而在指定If-Modified-Since字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码304 Not Modified的响应。
If-Modified-Since用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段Last-Modified来确定。
示意图
参考
《图解HTTP》
《计算机网络自顶向下方法》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出