HTTP的消息结构

客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行、请求头部、空白行和请求数据四个部分组成,下图给出了请求报文的一般格式。

GET / HTTP/1.1     
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
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
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: BIDUPSID=8B0207CE0B6364E5934651E84F17999B; PSTM=1619707475; 

常用的请求报头:

  • Host (主机和端口号)

Host: 对应网址 URL 中的 Web 名称和端口号, 用于指定被请求资源的 Internet 主机和端口号, 通常属于 URL 的一部分。

  • Connection (链接类型)

Connection: 表示客户端与服务连接类型
Client 发起一个包含 Connection:keep-alive 的请求, HTTP/1.1 使用 keep-alive 为默认值。
Server 收到请求后:
如果 Server 支持 keep-alive(长连接), 回复一个包含 Connection:keep-alive 的响应, 不关闭连接;如果 Server 不支持 keep-alive, 回复一个包含 Connection:close 的响应, 关闭连接。如果 client 收到包含 Connection:keep-alive 的响应, 向同一个连接发送下一个请求, 直到一方主动关闭连接。
keep-alive 在很多情况下能够重用连接, 减少资源消耗, 缩短响应时间, 比如当浏览器需要多个文件时(比如一个 HTML 文件和相关的图形文件), 不需要每次都去请求建立连接。

  • Sec-CH-UA-Mobile是一种请求头,用于向服务器传递客户端设备是否为移动设备的信息。值为1时表示客户端为移动设备,为0时代表不是移动设备
  • Upgrade-Insecure-Requests (升级为 HTTPS 请求)

Upgrade-Insecure-Requests: 升级不安全的请求, 意思是会在加载 http 资源时自动替换成 https 请求, 让浏览器不再显示 https 页面中的 http 请求警报。
HTTPS 是以安全为目标的 HTTP 通道, 所以在 HTTPS 承载的页面上不允许出现
HTTP 请求, 一旦出现就是提示或报错。

  • User-Agent (浏览器名称)

User-Agent: 是客户浏览器的详细信息,服务器是通过这条信息来判断来访的用户是否为真实用户。

  • Accept (传输文件类型)

Accept: 指浏览器或其他客户端可以接受的 MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展)文件类型, 服务器可以根据它判断并返回适当的文件格式。
举例:
Accept: /: 表示什么都可以接收。
Accept: image/gif: 表明客户端希望接受 GIF 图像格式的资源;
Accept: text/html: 表明客户端希望接受 html 文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8: 表示浏览器支持的 MIME 类型分别是 html 文本、 xhtml 和 xml 文档、 所有的图像格式资源。
q 是权重系数, 范围 0 =< q <= 1, q 值越大, 请求越倾向于获得其“;”之前的类型表示的内容。 若没有指定 q 值, 则默认为 1, 按从左到右排序顺序; 若被赋值为 0, 则用于表示浏览器不接受此内容类型。
Text: 用于标准化地表示的文本信息, 文本消息可以是多种字符集和或者多种格式的;Application: 用于传输应用程序数据或者二进制数据。

  • Referer (页面跳转处)

Referer: 表明产生请求的网页来自于哪个 URL, 用户是从该 Referer 页面访问到当前请求的页面。 这个属性可以用来跟踪 Web 请求来自哪个页面, 是从什么网站来的等。
有时候遇到下载某网站图片, 需要对应的 referer, 否则无法下载图片, 那是因为人家做了防盗链, 原理就是根据 referer 去判断是否是本网站的地址, 如果不是, 则拒绝, 如果是,就可以下载;

  • Sec-Fetch-Site:Sec-Fetch-Site
  • Accept-Encoding(文件编解码格式)

Accept-Encoding: 指出浏览器可以接受的编码方式。 编码方式不同于文件格式, 它是为了压缩文件并加速文件传递速度。 浏览器在接收到 Web 响应之后先解码, 然后再检查文件格式, 许多情形下这可以减少大量的下载时间。
举例: Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多个 Encoding 同时匹配, 按照 q 值顺序排列, 本例中按顺序支持 gzip, identity压缩编码, 支持 gzip 的浏览器会返回经过 gzip 编码的 HTML 页面。 如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。

  • Accept-Language(语言种类)

Accept-Langeuage:指出浏览器可以接受的语言种类,如 en 或 en-us 指英语,zh 或者 zh-cn指中文, 当服务器能够提供一种以上的语言版本时要用到。

  • Accept-Charset(字符编码)

Accept-Charset: 指出浏览器可以接受的字符编码。
举例: Accept-Charset:iso-8859-1,gb2312,utf-8
ISO8859-1: 通常叫做 Latin-1。 Latin-1 包括了书写所有西方欧洲语言不可缺少的附加字符, 英文浏览器的默认值是 ISO-8859-1.
gb2312: 标准简体中文字符集;
utf-8: UNICODE 的一种变长字符编码, 可以解决多种语言文本显示问题, 从而实现应用国际化和本地化。
如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

  • Cookie (Cookie)

Cookie: 浏览器用这个属性向服务器发送 Cookie。 Cookie 是在浏览器中寄存的小型数据体, 它可以记载和服务器相关的用户信息, 也可以用来实现会话功能。

  • Content-Type (POST 数据类型)

Content-Type: POST 请求里用来表示的内容类型。
举例: Content-Type = Text/XML; charset=gb2312:
指明该请求的消息体中包含的是纯文本的 XML 类型的数据, 字符编码采用“gb2312”。

1.请求行

主要描述了客户端想要如何操作服务端的资源;请求行由三部分构成:

  • 请求方法:表示对资源期望进行何种操作,常用的如 GET、POST
  • 请求目标:通常是一个 URL ,表明了要操作的资源。
  • 版本号:表示报文使用的 HTTP 协议版本。

这三个部分通常使用空格(space)来分隔,最后要用 CRLF 换行表示结束。

GET / HTTP/1.1  

这个请求行,结合之前的描述,意思就是 “服务端妹子你好,我是客户端蛋蛋,现在我想获取网站根目录的默认信息,我这边用的协议版本是 1.1,麻烦你也要用这个版本回复我哦”

2.请求头

HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。与缓存相关的规则信息,均包含在 header 中,请求头可大致分为四种类型:通用首部字段、请求首部字段、响应首部字段、实体首部字段。这里先简单罗列,稍后做具体解释。

3.请求体

请求体就是 HTTP 要传输的内容,HTTP 可以承载很多类型的数字数据:图片、音频、视频、HTML 文档等。

  • 介绍响应报文
  • 首部字段
  • 介绍功能

服务器响应消息

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xfb0d743100040ad2
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Fri, 24 Dec 2021 08:20:44 GMT
Expires: Fri, 24 Dec 2021 08:20:44 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=17; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=35635_34439_35104_35628_35488_35436_35456_34584_35491_35584_35586_34873_35317_26350_35610_35562; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1640334044050133761018090243032019634898
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
  • Cache-Control: must-revalidate, no-cache, private

这个值告诉客户端, 服务端不希望客户端缓存资源, 在下次请求资源时, 必须要从新请求服务器, 不能从缓存副本中获取资源。
Cache-Control 是 响 应 头 中 很 重 要 的 信 息 , 当 客 户 端 请 求 头 中 包 含
Cache-Control:max-age=0 请求, 明确表示不会缓存服务器资源时,Cache-Control 作为作为回应信息, 通常会返回 no-cache, 意思就是说, “那就不缓存呗”。
当客户端在请求头中没有包含 Cache-Control 时, 服务端往往会定,不同的资源不同的缓存策略, 比如说 oschina 在缓存图片资源的策略就是 Cache-Control: max-age=86400,这个意思是, 从当前时间开始, 在 86400 秒的时间内, 客户端可以直接从缓存副本中读取资源, 而不需要向服务器请求。

  • Connection: keep-alive

这个字段作为回应客户端的 Connection: keep-alive, 告诉客户端服务器的 tcp 连接也是一个长连接, 客户端可以继续使用这个 tcp 连接发送 http 请求。

  • Content-Encoding:gzip

告诉客户端, 服务端发送的资源是采用 gzip 编码的, 客户端看到这个信息后, 应该采用 gzip 对资源进行解码。

  • Content-Type: text/html;charset=UTF-8

告诉客户端, 资源文件的类型, 还有字符编码, 客户端通过 utf-8 对资源进行解码, 然后对资源进行 html 解析。 通常我们会看到有些网站是乱码的, 往往就是服务器端没有返回正确的编码。

  • Date: Sun, 21 Sep 2016 06:18:21 GMT

这个是服务端发送资源时的服务器时间, GMT 是格林尼治所在地的标准时间。 http 协议中发送的时间都是 GMT 的, 这主要是解决在互联网上, 不同时区在相互请求资源的时候,时间混乱问题。

  • Expires:Sun, 1 Jan 2000 01:00:00 GMT

这个响应头也是跟缓存有关的, 告诉客户端在这个时间前, 可以直接访问缓存副本, 很显然这个值会存在问题, 因为客户端和服务器的时间不一定会都是相同的, 如果时间不同就会导致问题。 所以这个响应头是没有 Cache-Control: max-age=*这个响应头准确的, 因为max-age=date 中的 date 是个相对时间, 不仅更好理解, 也更准确。

  • Pragma:no-cache

这个含义与 Cache-Control 等同。

  • Server: Tengine/1.4.6

这个是服务器和相对应的版本, 只是告诉客户端服务器的信息。

  • Transfer-Encoding: chunked

这个响应头告诉客户端, 服务器发送的资源的方式是分块发送的。 一般分块发送的资源都是服务器动态生成的, 在发送时还不知道发送资源的大小, 所以采用分块发送, 每一块都是独立的, 独立的块都能标示自己的长度, 最后一块是 0 长度的, 当客户端读到这个 0 长度的块时, 就可以确定资源已经传输完了。

  • Vary: Accept-Encoding

告诉缓存服务器, 缓存压缩文件和非压缩文件两个版本, 现在这个字段用处并不大, 因为现在的浏览器都是支持压缩的。

1.状态行

状态行包含了 协议版本状态码以及状态描述

  • 协议版本:指明了报文使用的 HTTP 协议版本
     
  • 状态码:状态码是一个三位数字,用来表示处理的结果,下面列出了状态码的类别:

  • 状态描述:这个是作为状态码的补充,是一段更详细的文字,帮助人们理解原因。
     

2.响应头部

和请求报文的请求头类似,响应头也由键值对组成,每行一对,键和值用英文冒号 : 分隔。响应头允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和 Request-URI 进一步的信息

3.响应包体

服务器返回给浏览器的响应信息,响应数据的格式是根据服务器来的,常见的响应数据格式有:text/html、application/json 等。

常见的响应格式:

HTTP请求方法:

HTTP1.0:定义了三种请求方法:GET、POST和HEAD方法。

HTTP1.1:新增了六种请求方法——OPTIOMNS、PUT、PATCH、DELETE、TRACE和CONNECT方法。

HTTP响应头信息

HTTP状态码

HTTP状态码

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Wireshark是一款功能强大的网络流量分析工具,可以用于分析各种协议的数据包。其中,HTTP是最常见的协议之一,市面上绝大多数的网站都是基于HTTP协议的。本文将介绍如何使用Wireshark分析HTTP数据包的结构。 当我们打开Wireshark并捕获HTTP数据包后,可以看到每一个数据包都有一个HTTP协议头,它是在OSI模型的应用层进行封装的。该协议头包括以下文件: 1. HTTP Method:表示HTTP请求方法,包括GET、POST、PUT、DELETE、HEAD等。 2. URI:统一资源标识符,表示请求的具体资源。 3. HTTP Version:表示HTTP协议版本,包括HTTP/1.0,HTTP/1.1,HTTP/2等。 4. Host:表示请求的主机名。 5. User-Agent:表示浏览器的名称和版本。 6. Accept-Language:表示浏览器支持的语言。 7. Referer:表示从哪个页面跳转过来的。 8. Cookie:表示当前的用户会话信息。 9. Connection:表示当前请求是否为“持久连接”。 当服务器响应时,我们可以看到HTTP响应头,它包含以下内容: 1. HTTP Version:表示HTTP协议版本,通常与请求的版本保持一致。 2. Status Code:响应状态码,表示服务器处理的结果是否成功。 3. Reason Phrase:响应状态码的原因描述,例如“OK”、“Not Found”等。 4. Content-Type:响应的数据类型,包括text、image、audio、video等。 5. Content-Length:响应数据的长度。 6. Server:表示服务器的名称和版本信息。 7. Date:表示响应的时间。 除了协议头以外,我们还可以看到HTTP消息体,它是实际的数据内容。HTTP消息体可以是文本、图片、音频、视频等任何类型的数据。在Wireshark中,我们可以通过“Follow TCP Stream”命令来查看响应的详细内容。 综上所述,Wireshark是一款十分强大的网络流量分析工具,可以用来分析各种协议的数据包。在分析HTTP协议时,我们需要仔细观察HTTP协议头、HTTP响应头以及HTTP消息体,以便更好地了解网络请求和响应的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值