1. HTTP的特点
- 无状态协议:HTTP自身不对请求和响应之间的通信状态进行保存。这意味着如果后续处理需要前一个请求的信息,那么这个信息必须重新发送,服务器不会记住之前的交互。
- 无连接:默认情况下,HTTP请求一次交互后,会关闭TCP连接,这样可以更有效地使用服务器资源。虽然HTTP/1.1支持持久连接(也称为HTTP Keep-Alive),但本质上HTTP仍然是无连接的。
- 可扩展性:HTTP允许传输任何类型的数据对象,只要发送方和接收方知道如何处理这些数据。由于其扩展性,随着时间的推移,HTTP已经支持了诸如安全性、压缩等多种功能。
2. HTTP的基本组成
请求(Request)
- 方法:HTTP支持多种请求方法,最常见的包括GET(请求读取URL),POST(向URL提交数据),PUT(替换指定的URL的所有当前表示的数据),DELETE(删除指定资源)等。
- URL:统一资源定位符,指向你想要访问的资源。
- HTTP版本:表明客户端使用的HTTP协议版本,如HTTP/1.1。
- 头部字段:包含请求的元数据,如用户代理、接受的内容类型、认证信息等。
- 主体:不是所有请求都有主体,通常POST和PUT请求包含主体,用于发送数据到服务器。
响应(Response)
- 状态码:服务器用来告知客户端请求是否成功,以及不成功的原因。常见的状态码有200(成功),404(未找到资源),500(服务器错误)等。
- HTTP版本:表明服务器使用的HTTP协议版本。
- 头部字段:包含响应的元数据,如内容类型、内容长度、服务器信息等。
- 主体:通常包含服务器返回的实际数据。
3.运作流程
- 建立连接:客户端(例如,浏览器)通过TCP/IP协议建立到服务器的连接。
- 发送HTTP请求:客户端向服务器发送一个HTTP请求,包括方法、URL、协议版本、头部字段和可能的主体内容。
- 服务器处理请求:服务器接收到请求后,解析请求内容,并进行相应处理。
- 发送HTTP响应:服务器处理完成后,向客户端返回一个HTTP响应,包含状态码、协议版本、响应头部、和响应主体。
- 关闭连接:在HTTP/1.0中,每个响应完成后服务器都会关闭连接。在HTTP/1.1中,若使用Keep-Alive,则连接可以保持开放,用于后续请求。
HTTP请求组成部分
请求行(Request Line)
- HTTP方法:如GET、POST、PUT、DELETE等。
- 资源路径:请求的资源URL路径,通常以斜杠(
/
)开始。- HTTP版本:使用的HTTP协议的版本,如HTTP/1.1。
请求头部(Request Headers)
- Host:指定请求的服务器域名和端口号。
- User-Agent:发出请求的浏览器或客户端的标识。
- Accept:客户端能够处理的媒体类型。
- Accept-Encoding:客户端能够处理的压缩格式。
- Accept-Language:客户端偏好的语言。
- Content-Type:请求体的媒体类型(如果请求体存在)。
- Content-Length:请求体的长度(如果请求体存在)。
- Connection:连接管理选项,如
keep-alive
。- Cache-Control:缓存指令。
- Authorization:认证信息,如用户名和密码。
空行(Empty Line)
- 请求头部和请求体之间的分隔符。
请求体(Request Body)
- 可选部分,取决于HTTP方法和请求的上下文。
- 可以包含表单数据、JSON数据、文件等。
HTTP响应组成部分
状态行(Status Line)
- HTTP版本:响应所使用的HTTP协议版本。
- 状态码:表示请求处理结果的数字码,如200表示成功,404表示未找到。
- 状态消息:状态码的简短描述。
响应头部(Response Headers)
- Date:响应生成的时间。
- Server:服务器软件的名称和版本。
- Content-Type:响应体的媒体类型。
- Content-Length:响应体的长度。
- Content-Encoding:响应体使用的压缩格式。
- Cache-Control:缓存指令。
- Connection:连接管理选项。
- Set-Cookie:设置客户端的cookie。
- Expires:响应的过期时间。
空行(Empty Line)
- 响应头部和响应体之间的分隔符。
响应体(Response Body)
- 服务器返回的数据,可以是HTML文档、图片、JSON数据等。
浏览器抓包查看www.baidu.com数据包GET传参实例
请求标头实例及字段分析
GET / HTTP/1.1
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.7
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: max-age=0
Connection: keep-alive
Cookie: BIDUPSID=DCC9CCADE41308E1E61424855D9E491F; PSTM=1706873358; BAIDUID=F7122460F9246D921ED07AA88A1CE274:FG=1; BAIDUID_BFESS=F7122460F9246D921ED07AA88A1CE274:FG=1; BDUSS=AzaXNQek5BUmtEenF6bkgwa0g0dkhOOHZMdTFuVjJxM2E4cHV3Q25uS2xJd0JtSVFBQUFBJCQAAAAAAQAAAAEAAAD3RpYrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWW2GWllthlaH; BDUSS_BFESS=AzaXNQek5BUmtEenF6bkgwa0g0dkhOOHZMdTFuVjJxM2E4cHV3Q25uS2xJd0JtSVFBQUFBJCQAAAAAAQAAAAEAAAD3RpYrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWW2GWllthlaH; BAIDU_WISE_UID=wapp_1713272051896_373; ZFY=VY3D86T8ILt1R2IN3SGhqKJNtXFwfBBoLK0y6briYlc:C; sugstore=0; COOKIE_SESSION=564275_0_1_4_0_1_1_0_1_1_0_0_0_0_0_0_0_0_1713626500%7C4%230_0_1713626500%7C1; RT="z=1&dm=baidu.com&si=95af8b75-167b-4964-89f6-a86f32e06035&ss=lvpz4djb&sl=7&tt=5xt&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=12f3&ul=1lrcc&hd=1lrdt"; H_PS_PSSID=40299_40080_60175; BD_UPN=12314753; BA_HECTOR=a52l0h20a5al2h848l852k2165anfd1j3g9191s; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598
Host: www.baidu.com
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0
sec-ch-ua: "Chromium";v="124", "Microsoft Edge";v="124", "Not-A.Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
-
GET / HTTP/1.1
- 这是HTTP请求的开始行,包括方法(GET),请求URI(/),和HTTP版本(HTTP/1.1)。
- GET:用于请求从指定资源获取数据。
- /:表示根目录,即请求的是网站的主页。
- HTTP/1.1:使用的HTTP协议版本,影响连接管理、缓存等行为。
-
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.7
- 说明客户端愿意接受哪些类型的响应数据。权重通过
q
参数表示,越高代表优先级越高。
- 示例值:
-
Accept-Encoding
- 示例值:
gzip, deflate, br, zstd
- 告诉服务器客户端支持哪些内容编码,服务器可以据此选择一个合适的压缩算法减少传输的数据量。
- 示例值:
-
Accept-Language
- 示例值:
zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
- 指定客户端优先接受的语言,有助于服务器返回最合适的本地化内容。
- 示例值:
-
Cache-Control
- 示例值:
max-age=0
- 控制缓存的行为,
max-age=0
通常用于强制服务器返回最新的响应,而不使用缓存。
- 示例值:
-
Connection
- 示例值:
keep-alive
- 控制当前的网络连接。
keep-alive
表示希望保持连接打开,以便继续通过同一连接发送或接收后续的请求和响应。
- 示例值:
-
Cookie
- 示例值:包含多个键值对,用于存储用户会话信息或识别用户身份。
- 注意:Cookies可以包含敏感信息,必须注意安全设置,如
Secure
和HttpOnly
标志。
-
Host
- 示例值:
www.baidu.com
- 指定请求的服务器。在互联网上,同一个物理服务器可能托管多个域名,
Host
头部帮助服务器区分具体的域名服务。
- 示例值:
-
Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site, Sec-Fetch-User
- 这些是一组新引入的头部,用于描述请求的模式和上下文,帮助服务器做出更安全的响应决策。
-
Upgrade-Insecure-Requests
- 示例值:
1
- 告诉服务器客户端支持更安全的HTTPS协议,希望请求能通过HTTPS进行。
- 示例值:
-
User-Agent
- 示例值:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0
- 包含了客户端浏览器的标识信息,包括设备类型、操作系统、浏览器版本等。
- 示例值:
-
sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform
- 这些头部提供了更详细的浏览器和平台信息,例如使用的浏览器是基于Chromium还是其他,以及是否为移动设备等。
响应标头实例及字段分析
HTTP/1.1 200 OK
Connection: keep-alive
Content-Encoding: gzip
Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com;
Content-Type: text/html; charset=utf-8
Date: Mon, 06 May 2024 00:28:28 GMT
Isprivate: 1
Server: BWS/1.1
Set-Cookie: H_PS_PSSID=40299_40080_60175; path=/; expires=Tue, 06-May-25 00:28:28 GMT; domain=.baidu.com
Traceid: 1714955308347687015418416753043011705355
X-Ua-Compatible: IE=Edge,chrome=1
X-Xss-Protection: 1;mode=block
Transfer-Encoding: chunked
1.状态行 (Status Line)
- HTTP/1.1 200 OK
- 表示使用HTTP/1.1协议,状态码200意味着请求成功处理。
2. 响应头部字段 (Response Headers)
通用和连接管理
- Connection: keep-alive
- 指示连接应保持活动状态,允许在同一连接上发送多个请求和响应,有助于减少延迟。
内容编码和类型
- Content-Encoding: gzip
- 表示服务器使用gzip压缩响应体,用于减少数据传输量。
- Content-Type: text/html; charset=utf-8
- 指定响应内容类型为HTML,字符集为UTF-8,确保客户端正确解析HTML文档。
安全和政策
- Content-Security-Policy
- 设置内容安全策略,限制资源(如框架)可以加载自哪些源。此设置有助于防止跨站脚本攻击(XSS)。
- 例:
frame-ancestors 'self' https://chat.baidu.com ...
- 这规定了哪些域可以嵌入当前页面,防止点击劫持。
- X-Ua-Compatible: IE=Edge,chrome=1
- 为兼容性提供指令,指示IE使用最新的Edge渲染引擎。
- X-Xss-Protection: 1; mode=block
- 启用浏览器内置的反XSS过滤器,若检测到跨站脚本攻击则阻止页面加载。
会话和追踪
- Set-Cookie
- 设置一个或多个Cookie,用于客户端和服务器之间的状态管理。
- 例:
H_PS_PSSID=...; expires=Tue, 06-May-25 00:28:28 GMT; domain=.baidu.com
- 此Cookie有一个过期时间和适用域名,用于跟踪会话状态或用户偏好。
- Traceid
- 提供请求的追踪ID,用于服务器日志记录和问题诊断。
- 例:
1714955308347687015418416753043011705355
其他
- Date
- 标记响应生成的日期和时间。
- 例:
Mon, 06 May 2024 00:28:28 GMT
- Server: BWS/1.1
- 指示响应是由哪个Web服务器软件生成的,这里是Baidu Web Server版本1.1。
- Transfer-Encoding: chunked
- 指示响应数据采用分块传输编码方式,用于动态生成的内容或未知大小的数据流。
自定义或不常见
- Isprivate: 1
- 可能是一个自定义字段,用于某些内部处理或指示响应的特定属性,例如表示响应内容是私有的。