一、 密码学演进:从对称到非对称,再到证书体系
要理解为什么现在的网络是安全的,我们得先看看加密技术是如何一步步进化的。
1.1 对称加密:高效但面临“分发难题”
- 原理:加密和解密使用同一把密钥。
- 优点:算法简单,计算速度极快,适合加密大量业务数据。
- 致命缺点:密钥分发问题。通信双方如果从未见过面,如何把密钥安全地交给对方?如果在网络上明文传输密钥,一旦被截获,后续所有的加密都形同虚设。
1.2 非对称加密:解决分发,但引入性能与安全问题
- 原理:一对密钥——公钥(公开)和私钥(保密)。用公钥加密,只能用私钥解密;反之亦然。
- 优点:不需要传输私钥,完美解决了对称加密的密钥分发问题。
- 缺点:
- 性能极差:非对称加密的计算复杂度极高,如果用来传输大量数据,系统会不堪重负。
- 无法抵御中间人攻击(MITM):这是很多人容易忽略的一点。
1.3 中间人攻击(Man-in-the-Middle Attack)
即使你用了非对称加密,如果没做身份验证,黑客依然可以轻松窃听。流程如下:
1.4 数字证书与 CA:建立信任链
为了证明“公钥”确实属于“真实的服务器”,数字证书和CA(证书颁发机构) 登场了。
- 证书内容:包含服务器域名、服务器公钥、颁发者信息、有效期等。
- 签名机制:CA 机构会用哈希算法对证书内容生成摘要(校验和),再用 CA 自己的私钥加密这个摘要,形成数字签名。
- 验证过程:客户端(浏览器/操作系统)内置了受信任 CA 的公钥。收到证书后,客户端用 CA 公钥解密签名得到摘要,再自己算一份摘要进行比对。一致则说明证书未被篡改,且公钥确实属于该服务器。
1.5 对称与非对称的结合:TLS 握手
实际中的 HTTPS 结合了两者优点,这也就是SSL/TLS 握手 的核心逻辑:
二、 Fiddler 抓包原理:合法的中间人
理解了上面的加密和证书,就能秒懂Fiddler 的工作原理。
- 工作模式:Fiddler 本质上是一个代理服务器,充当客户端和服务器之间的“媒人”。
- 解密 HTTPS:为了抓取 HTTPS 流量,Fiddler 会在本地生成一张伪造的服务器证书,并用 Fiddler 自己的根证书(需要用户手动安装并信任)进行签名。
- 结果:因为你的系统信任了 Fiddler 的根证书,所以客户端会信任这张伪造证书,从而允许 Fiddler 完成上述的密钥协商、解密数据。这也是为什么在手机或浏览器上不安装证书就无法抓 HTTPS 包的原因。
三、 HTTP 状态码速查表
在排查接口问题时,熟练记忆状态码能极大提升效率。以下是你提到的核心状态码总结:
状态码 | 状态短语 | 含义详解 | 常见场景 |
|---|---|---|---|
200 | OK | 成功。请求已正常处理并返回。 | 接口调用成功。 |
302 | Found | 重定向。资源临时移动到新位置。 | 未登录时访问需授权页面,跳转到登录页。 |
404 | Not Found | 没找到。服务器找不到请求的资源。 | URL 拼写错误,或资源已被删除。 |
403 | Forbidden | 没权限。服务器理解请求,但拒绝执行。 | 登录了但没有访问该接口的权限(如普通用户访问管理员接口)。 |
405 | Method Not Allowed | 方法不允许。请求行中的方法不被支持。 | 接口只支持 POST,你却用了 GET 请求。 |
500 | Internal Server Error | 服务器错误。服务器内部代码出错。 | 后端代码抛异常、空指针等。 |
504 | Gateway Timeout | 网关超时。网关/代理未及时从上游获取响应。 | 服务器处理请求时间过长,或后端服务宕机。 |
四、 UDP 协议深度解析
HTTP 是文本协议,而 UDP/TCP 是二进制协议。我们来深入看看 UDP 的底层细节。
4.1 UDP 报头结构(固定 8 字节)
UDP 极其简单,只有 4 个字段,每个字段 2 字节(16 位):
4.2 64KB 的长度限制
由于“长度”字段是16 位的(2 的 16 次方 = 65536),UDP 能传输的数据最大长度是64KB(包含 8 字节首部)。
- 计算:65535 bytes ≈ 64KB。
- 注意:如果应用层需要传输超过 64KB 的数据,就必须在应用层手动分包、多次发送,并在接收端拼装。这也是为什么 TFTP、DNS 等基于 UDP 的协议都有自己的一套分包/重传机制。
4.3 比特翻转与 CRC 循环冗余校验
在网络传输中,数据以 0 和 1 的电/光信号传输,受电磁干扰可能会出现比特翻转(0 变 1,1 变 0)。
- 校验和的作用:UDP 使用校验和来防止数据出错。发送方计算校验和并附带发送,接收方收到后以同样算法重新计算并对比。如果不一致,说明传输出错,UDP 会直接丢弃该数据报。
- CRC(循环冗余校验):UDP 的校验和通常采用CRC 算法。它不是简单的求和,而是把数据字节当作二进制多项式,除以一个生成多项式,将得到的余数作为校验值。
- 检错能力:CRC 特性极佳。如果只有一个 bit 位发生比特翻转,100% 能够被检测出来。校验和的作用更多是“证伪”(不对劲肯定错了),而非绝对“证实”(对劲不一定完全没错,但概率极低)。
五、 TCP 协议深度解析
如果说 UDP 是“莽夫”,那么 TCP 就是“精密的管家”。TCP 通过复杂的机制保证了数据传输的可靠性、有序性和效率。
5.1 TCP 报头结构
结合图示,TCP 报头包含以下核心字段:
- 16位源端口号 / 16位目的端口号:标识发送和接收的应用程序。
- 32位序号 / 32位确认序号:用于可靠传输和按序重组(详见后续机制)。
- 4位首部长度:注意,这里的单位是4个字节(而非比特位)。如果值为5,代表首部长度确实是20字节。
- 保留(6位):留作未来使用,目前必须置0。
- 标志位(URG, ACK, PSH, RST, SYN, FIN):控制连接状态和数据处理方式。
- 16位窗口大小:用于流量控制(详见滑动窗口)。
- 16位校验和 / 16位紧急指针:用于校验和紧急数据处理。
- 选项:可变长度,用于扩展功能(如窗口扩大因子)。
5.2 三次握手与连接状态
为了建立可靠的连接,TCP 需要三次握手:
- 客户端发送
SYN包(携带初始序号),进入SYN_SENT状态。 - 服务端收到后回复
SYN + ACK包,进入SYN_RCVD状态。 - 客户端收到后回复
ACK包,双方进入ESTABLISHED状态。
(注:服务端在收到连接请求前处于LISTEN状态)
5.3 可靠传输机制:确认应答与重传![]()
- 确认应答 (ACK):接收方收到数据后,会返回 ACK,确认号表示“我期望收到的下一个字节的序号”。
- 超时重传:如果发送方在规定时间内未收到 ACK,判定为丢包,会重新发送数据。
- 快速重传:如果发送方连续收到3个重复的 ACK,说明某个报文段丢失了,发送方会立即重传该报文,而不必等待超时计时器到期,大大提高了效率。
5.4 滑动窗口与流量控制
TCP 使用滑动窗口机制来实现流量控制,避免发送过快导致接收方处理不过来。
- 16位窗口大小:接收方通过 ACK 报文中的该字段告知发送方自己接收缓冲区的剩余空间。
- 选项拓展窗口大小:由于 16 位最大只能表示 64KB,TCP 在选项部分引入了窗口扩大因子(Window Scale),在三次握手时协商。实际窗口大小 = 窗口字段值 × (2 ^ 扩大因子)。
- 窗口探测包:当接收方缓冲区满时,会将窗口大小置为 0,发送方暂停。为了防止死锁(接收方的窗口更新 ACK 丢失),发送方会周期性发送1字节的窗口探测包,触发接收方回复当前最新的窗口大小。
5.5 拥塞控制
除了流量控制,TCP 还要防止网络中间节点拥堵。实际发送窗口 = min(接收通告窗口, 拥塞窗口)。
- 慢启动:连接刚建立时,拥塞窗口(cwnd)初始化为 1 个 MSS。每收到一个 ACK,窗口指数增长(翻倍),直到达到慢启动阈值(ssthresh)。
- 拥塞避免:达到阈值后,窗口转为线性增长(每轮 RTT 加 1 个 MSS),谨慎探测网络极限。
- 快恢复:触发快速重传后,将 ssthresh 和 cwnd 设为当前窗口的一半,直接进入拥塞避免阶段,避免窗口彻底归零。
- 超时处理:如果发生超时重传(严重拥塞),ssthresh 减半,cwnd 重置为 1,重新进入慢启动。
5.6 发送与接收缓冲区及发包原理
TCP 是面向字节流的,内核为维护连接分别设置了发送缓冲区和接收缓冲区。
- 发包原理:客户端发送数据时,并非发一个等一个,而是根据当前的拥塞窗口和流量控制窗口,将发送缓冲区的数据尽量发出去。发到一定量(达到窗口上限)时,就停止发送,等待对方的 ACK 确认后再滑动窗口,继续发送后续数据。
5.7 四次挥手与连接状态
断开连接需要四次挥手:
- 主动关闭方发送
FIN,进入FIN_WAIT_1。 - 被动关闭方回复
ACK,进入CLOSE_WAIT状态(此时可能还有数据要发)。 - 被动关闭方发完数据后,发送
FIN,进入LAST_ACK。 - 主动关闭方回复
ACK,进入TIME_WAIT状态。
为什么 TIME_WAIT 状态需要等待 2MSL?*
MSL(报文最大生存时间)通常是 30 秒到 2 分钟。等待 2*MSL(约 60 秒)有两个原因:
- 保证最后的 ACK 能到达:如果最后的 ACK 丢失,服务端会重发 FIN,客户端需要在该状态下重发 ACK。
- 防止旧连接的包干扰新连接:确保网络中属于旧连接的延迟报文段全部消散,避免被误认为新连接的数据。
六、 总结
从应用层的 HTTP 状态码,到传输层 UDP 的 64KB 限制与 CRC 校验,再到 TCP 精密的三次握手、滑动窗口、拥塞控制与四次挥手状态机,以及安全层的对称/非对称加密、证书与 Fiddler 抓包原理,网络通信的每一层都在为可靠性、安全性和效率做权衡。
希望这篇总结能帮你理清这些核心概念。如果你在实际抓包或开发中遇到具体问题,欢迎留言讨论