前言在当今互联网时代,HTTP协议作为应用层最核心的通信协议之一,几乎支撑着所有的Web应用、移动App以及API交互。无论是浏览网页、发送请求,还是进行数据交互,HTTP都扮演着至关重要的角色。
然而,HTTP协议看似简单,实则包含许多细节和设计理念。例如:
为什么GET和POST方法有不同的使用场景?状态码200、404、500分别代表什么含义?Cookie是如何实现用户登录状态的保持的?URL的结构和编码规则是怎样的?本篇文章将从HTTP协议的基本组成出发,逐步解析请求与响应的结构、常见报头的含义、GET与POST的区别,以及状态码的分类与作用。此外,我们还会介绍如何使用Fiddler抓包工具分析HTTP通信过程,帮助开发者更深入地理解网络通信机制。
应用层协议 在网络上TCP/IP协议用来负责数据的运输,那么我们运输的数据应该是什么的格式呢?为了保证双方都可以读懂对方发送的数据,因此我们需要约定一个“格式”来保障数据格式的一致性,而这就是应用层协议需要解决的问题。
如果说TCP/IP协议是网络中的“物流系统",那么应用层协议就是数据的“使用说明书”。
在应用层涉及到的网络通信协议,很多都是程序员自定制的。
自定义协议:
根据需求,明确传输那些信息约定好信息组织的格式约定好信息组织的格式有很多种方法:
行文本:使用某个符号作为分隔符,提前约定好第几个数据的含义,是最原始的一种方法。代码语言:javascript复制账号,昵称,密码,好友数量\n
账号,昵称,密码,好友数量\nxml:xml和html很类似,但是它的标签内容是可以自定义的(html5现在也允许),可读性好,适合别人阅读,但是冗余信息太多了,在网络传输中要消耗更多的带宽,而在服务器中带宽是最贵的东西,因此现在并不是一种主流方案。代码语言:javascript复制
json:当前最主流的方案,使用键值对的方式传递信息,既保持了可读性,消耗的带宽也比xml要少,因为json是单标签,xml是双标签的。但是仍然存在冗余信息。代码语言:javascript复制{
id:1001,
name:"lyf",
pssord:122
}protobuf:基于二进制的格式,约定那几个字节存储什么内容,对数据进行压缩,不涉及到json/xml冗余信息了,带宽消耗最少,但是可读性变差了,相当于是用开发效率去换执行效率,性能要求高的场景需要使用,如果性能不要求,还是建议使用json。
当然除了这些自定义的协议之外,还有一些大佬已经搞好的,例如我们接下来要讲的HTTP协议。
HTTP协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议,被广泛用于web开发/app开发中,目前HTTP最新版已更新到3.0,但是目前最流行的仍然是20年前的1.1版本。HTTP采用一问一答模式,客户端发一个请求,服务器就返回一个响应,请求和响应一一对应。
抓包工具fiddler 如果要分析网络的通信过程,一个抓包工具是必不可少的,抓包工具可以让电脑上所有的网络通信必须先通过它再进行转发,而这个过程我们就可以分析他们发送和接收的内容。
这里我们选用fidder来作为我们的抓包工具,fidder是专门用来抓取http协议的工具,功能简单,使用也很简单。
下载地址
我们下载时要下载经典版,最新版现在收费,安装流程这里并不过多赘述,当然你不安装也不影响本文章的后续内容。
打开之后进入的页面如下:
刚打开时左侧可能一下子蹦出来很多的信息,这是因为你后台的应用实际上并不安分,一直在和服务器之间进行沟通,而我们的抓包工具都给这些信息全部抓获了。
点开数据信息后,他给的信息我们可能看不懂,我们可以在这里点击raw选项,让其还原成最初始的HTTP语句。
响应数据经常是压缩过的二进制数据,展现成一段乱码,而该工具是自带解码的,因此我们只需要在出现这个选项时点击它即可解码成正常数据。
除此之外,我们还可以发现左侧的抓包信息的颜色参差不齐,不同的颜色代表不同的含义,红色表示报错,蓝色表示响应是一个网页,绿色表示得到了一个js格式的数据,灰色则表示这个响应的数据已经被缓存了。
协议组成 安装好抓包工具后,就可以对HTTP进行抓取了,http协议本质上是文本格式的协议,更加具体的信息可以查看http的rfc标准文档:rfc文档
请求信息请求信息由四部分组成:
首行: 包括请求方法、URL以及HTTP版本号,GET https://www.csdn.net/ HTTP/1.1。
请求头: 键值对结构,每一行是一个键值对,键和值之间使用空格隔开,有哪些键,这些键可以取那些值,都是已经规定好的,sec-ch-ua-platform: "Windows"。
空行: 请求头的最后一行是一个空行,用来标识请求头结束了。
正文:有些请求没有正文,有些有。
以下是我使用fiddler抓取的一个请求信息,可当做参考:
代码语言:javascript复制POST https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/groups/dadde766-b087-42da-8e67-d2499a520ee7/streams/5da0dae3-481b-478b-92ca-3caa293e4a29/logs HTTP/1.1
Host: eva2.csdn.net
Connection: keep-alive
Content-Length: 1161
sec-ch-ua-platform: "Windows"
sec-ch-ua: "Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"
sec-ch-ua-mobile: ?0
X-Sdk-date: 20250603T115606Z
Lts-Sdk-Request-Id: e36bfe51ed0b409b9f51c7791a71a122
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Content-Type: application/json
Lts-Sdk-Version: 1.0.15
Accept: */*
Origin: https://mpbeta.csdn.net
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://mpbeta.csdn.net/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
{"labels":{},"logs":[{"contents":[{"pid":"mpbeta","ref":"https://mpbeta.csdn.net/","curl":"https://mpbeta.csdn.net/mp_blog/manage/article?spm=1000.2115.3001.5448","spm":"1011.2415","disabled":"true","extra":"{\"version\":\"new\"}","tos":0,"adb":0,"cCookie":"c_ab_test=1;c_session_id=10_1748950839573.109676;c_first_ref=default;c_first_page=https%3A//www.csdn.net/;c_dsid=11_1748950840378.769273;c_segment=2;c_sid=2027680f8c25c20fdd506cf78e2f2a67;c_page_id=default;c_pref=https%3A//editor.csdn.net/;c_ref=https%3A//www.csdn.net/;","t":1748951766,"screen":"1440*900","urn":"1748951766184-d4c434cd-3802-49aa-a879-d0357d710c5c","vType":"U010000","log_id":"5","sign":"0d3dc2f82f21b9c90a67228fc4ee4a91","lscreen":"1440*900","hca":"F268FC93106CB2BC","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","cid":"10_18662895060-1748744031688-432578","uid":"to_mountain","sid":"10_1748950839573.109676","dc_sid":"2027680f8c25c20fdd506cf78e2f2a67","did":"10_18662895060-1748744031688-432578","utm":"","un":"to_mountain","fid":"20_56679795187-1748744032956-330580","__client_time__":1748951766188}]}]}响应信息响应信息的构成和请求很相似,也是由四部分组成:
首行: 包括版本号、状态码、状态码描述,HTTP/1.1 200 OK。
响应头(Header): 也是键值对结构,每一行是一个键值对,键和值之间使用空格隔开,键值对和请求有区别,有些重要的键值对在请求和响应中都存在,Content-Type: text/html;。
空行: 响应头的最后一行是一个空行,用来标识响应头结束了。
正文(Body):这个响应可以是html/json或者一些其他类型。
以下是抓取到的部分响应数据:
代码语言:javascript复制HTTP/1.1 200 OK
Server: nginx
Date: Wed, 28 May 2025 09:10:48 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: SNUID=D0E28FDCB3B5859D3C3ABEC3B37C5F65; expires=Thu, 28-May-26 09:10:48 GMT; domain=.sogou.com; path=/
Pragma: No-cache
Cache-Control: max-age=0
Expires: Wed, 28 May 2025 09:10:48 GMT
UUID: f8a02e75-0760-4628-ab51-8d55bda3fee3
Content-Length: 15858