1565 字
8 分钟
TCP/IP
2026-02-19
2026-02-19
统计加载中...

TCP/IP#

第一层:应用层 (Application Layer)#

  • 核心协议:HTTP、DNS
  • 关注点:数据格式、交互效率、应用层队头阻塞

这一层决定了浏览器如何获取网页资源。

1. HTTP 协议的进化史#

2. 深度辨析:HTTP/2 为什么还没彻底解决阻塞?#

HTTP/2 解决了应用层的「请求排队」,但所有请求共用一个 TCP 连接。一旦底层 TCP 丢了一个包,操作系统内核会暂停后续所有包的交付(等待重传),导致所有 Stream(图片、JS、CSS)全部卡顿。这就是 TCP 队头阻塞


第二层:安全层 (Security / TLS)#

  • 核心协议:TLS/SSL、HTTPS
  • 关注点:加密、身份认证、防篡改

HTTPS = HTTP + TLS/SSL。它在应用层和传输层之间加了把「锁」。

1. HTTPS 的核心机制(混合加密)#

  • 非对称加密 (RSA/ECC):用于握手阶段

    • 利用公钥和私钥交换「会话密钥」。公钥加密,私钥解密。
    • 公钥的作用:公开给客户端,用于加密数据或验证签名。
    • 证书 (Certificate):服务器的身份证,包含公钥和 CA 签名。防止黑客伪造公钥。
  • 对称加密 (AES):用于数据传输阶段

    • 使用握手协商好的「会话密钥」。速度极快。

2. TLS 握手流程(以 TLS 1.2 为例)#

这是一个 2-RTT 的过程(TLS 1.3 优化为 1-RTT)。

  1. Client Hello:发送支持的加密套件 + 随机数 A

  2. Server Hello:选定套件 + 随机数 B + 下发证书

  3. Key Exchange

    • 客户端验证证书(查 CA 信任链)
    • 生成随机数 C (Pre-master secret),用证书里的公钥加密,发给服务端
  4. Session Key 生成:双方用 A+B+C 算出一个相同的会话密钥

  5. Finished:双方互发加密消息验证

3. 中间人攻击 (MITM) 原理与防御#

  • 攻击原理:攻击者拦截请求,伪装成服务器(给客户端发伪造证书),又伪装成客户端(和服务器建立连接)。

  • 抓包工具 (Charles/Fiddler) 原理

    • 用户手动信任 Charles 的根证书 (Root CA)。
    • Charles 动态签发伪造的网站证书。因为根证书被信任,操作系统也会信任这张伪造证书。
    • Charles 解密两端数据,实现「明文抓包」。

第三层:传输层 (Transport Layer)#

  • 核心协议:TCP、UDP、QUIC
  • 关注点:端到端连接、可靠性、流量控制

这是网络的「心脏」,负责数据包的送达保障。

1. TCP 三次握手(建立连接)#

  • 流程:SYN → SYN+ACK → ACK

  • 为什么不是两次?

    • 为了防止已失效的连接请求报文段突然又传到服务端。
    • 若是两次握手,服务端收到旧的 SYN 会误以为建立新连接,白白等待数据,造成资源死锁。

2. TCP 四次挥手(断开连接)#

  • 流程:FIN → ACK(半关闭)→ FIN → ACK

  • 为什么需要等待 2MSL?

    • 确保服务端收到了最后一个 ACK。若 ACK 丢了,服务端会重发 FIN,客户端必须有时间处理这个重发的 FIN。

3. TCP 的可靠性保障(核心难点)#

TCP 强在「既可靠又尽量快」。

  • 流量控制 (Sliding Window)

    • 机制:接收端通过 Window Size 告诉发送端:「我还能吃得下多少数据」。
    • 目的:防止发送端发太快,撑爆接收端缓冲区。
  • 拥塞控制 (Congestion Control):全局网络保护

    • 慢启动 (Slow Start):连接刚建立,cwnd(拥塞窗口)指数级增长 (1, 2, 4, 8…)
      • 前端影响:导致首屏加载慢。前几轮 RTT 只能发几 KB 数据,带宽再大也没用。
      • 对策:增大初始窗口 (initcwnd=10)、CDN 缩短 RTT。
    • 快重传 (Fast Retransmit)
      • 若连续收到 3 个重复的 ACK,说明特定包丢了,但网络没瘫痪。
      • 动作:立即重传丢失包,不等待超时,不进入慢启动(只减半窗口)。
  • Nagle 算法 vs Delayed ACK

    • 发送端想攒大包再发 (Nagle),接收端想等数据顺风车再回 ACK (Delayed)。
    • 死锁:导致 40ms 延迟。Web 开发通常开启 TCP_NODELAY 禁用 Nagle。

4. HTTP/3 (QUIC) —— UDP 的逆袭#

QUIC 在应用层(用户态)重新实现了 TCP 的功能,并做了重大改进:

  • 解决重传歧义:Packet Number 严格单调递增。即使重传,PN 也会变。发送端能精确计算 RTT。

  • 无队头阻塞 (No HOL)

    • 引入 Stream(流)概念。
    • Stream A 的包丢了,只阻塞 Stream A;Stream B(如 CSS)到齐了直接渲染。
  • 连接迁移

    • 使用 Connection ID (CID) 标识连接,而不是 IP。
    • 手机从 WiFi 切到 4G,IP 变了但 CID 没变,连接保持不断,无需重连。

第四层:网络层 (Network Layer)#

  • 核心协议:IP、ARP、ICMP
  • 关注点:寻址、路由

解决「如何从世界的一个角落找到另一个角落」的问题。

1. IP 寻址#

  • IP 地址:逻辑地址(如 192.168.1.5)

  • 子网掩码 (Subnet Mask):用于判断目标 IP 是在局域网还是外网

    • 目标 IP & 子网掩码 == 本机网络号?
    • :直接发给目标(通过 ARP 查 MAC)
    • :发给默认网关(路由器)

2. 路由 (Routing)#

  • 路由器:三层设备。
  • 查路由表,决定数据包的「下一跳 (Next Hop)」给谁;会拆掉旧的 MAC 头,换上新的 MAC 头(源=路由器,目的=下一跳)。

第五层:数据链路层 & 物理层#

  • 核心协议:Ethernet、ARP
  • 关注点:局域网内直连、物理介质

1. MAC 与帧#

  • MAC 地址:硬件唯一身份证。
  • ARP 协议:广播询问「谁是这个 IP?」,获取对应的 MAC 地址。

2. 交换机 (Switch)#

  • 二层设备,维护 MAC 地址表。
  • 只看 MAC 地址,把数据帧从对应端口转发出去。

总结:从输入 URL 到页面展示(网络视角)#

  1. 应用层:浏览器构造 HTTP 请求。
  2. 安全层:TLS 握手,协商密钥,加密请求。
  3. 传输层:TCP 三次握手建立连接;将大文件切割成段 (Segment),加上 TCP 头(端口、序号)。
  4. 网络层:IP 协议加上 IP 头(源/目 IP);查路由表,发现目标在外网,决定发给网关。
  5. 链路层:ARP 查网关 MAC;封装成帧 (Frame)。
  6. 物理层:变成电信号发出。
  7. 传输中:经过交换机(二层转发)→ 路由器(三层路由)→ 互联网 → 目标服务器。
  8. 接收端:层层解封装 → 校验 → 解密 → 浏览器渲染。