Skip to content

TCP/IP 协议详解

MDN HTTP 文档

1. 网络分层模型

1.1 OSI 七层模型 vs TCP/IP 四层模型

OSI 七层模型TCP/IP 四层模型作用协议举例
应用层 (Application)应用层为用户提供服务HTTP, DNS, SMTP, FTP
表示层 (Presentation)^数据格式化、加密、压缩SSL/TLS, JPEG
会话层 (Session)^建立、管理会话RPC
传输层 (Transport)传输层端到端的数据传输TCP, UDP
网络层 (Network)网络层寻址和路由IP, ICMP, ARP
数据链路层 (Data Link)网络接口层帧传输,MAC 寻址Ethernet, Wi-Fi
物理层 (Physical)^比特流传输光纤, 双绞线

2. TCP 三次握手 (Three-Way Handshake)

建立连接的过程,确认双方收发能力正常,同步序列号。

TCP 三次握手过程演示

Client
CLOSED
Server
LISTEN
当前步骤: 初始状态

2.1 握手步骤详解

步骤发送方接收方状态变化报文内容目的
第一次ClientServerClient: SYN_SENT
Server: LISTEN
SYN=1, seq=x客户端请求建立连接
第二次ServerClientServer: SYN_RCVD
Client: SYN_SENT
SYN=1, ACK=1, seq=y, ack=x+1服务端同意连接,确认收到 SYN
第三次ClientServerClient: ESTABLISHED
Server: ESTABLISHED
ACK=1, seq=x+1, ack=y+1客户端确认收到响应,连接建立

2.2 为什么需要三次握手?

  • 防止旧的重复连接初始化: 如果网络延迟导致旧的 SYN 包在连接释放后到达服务端,服务端回应 SYN+ACK,客户端收到后发现是旧请求(通过 seq 校验),发送 RST 中止连接。如果是两次握手,服务端在收到旧 SYN 后就建立了连接,浪费资源。
  • 同步序列号: 双方需要确认对方的初始序列号 (ISN) 才能保证后续传输的有序性。

3. TCP 四次挥手 (Four-Way Wavehand)

断开连接的过程,确保数据传输完毕,双方释放资源。

3.1 挥手步骤详解

步骤发送方接收方状态变化报文内容目的
第一次ClientServerClient: FIN_WAIT_1FIN=1, seq=u客户端请求断开连接
第二次ServerClientServer: CLOSE_WAIT
Client: FIN_WAIT_2
ACK=1, ack=u+1服务端确认收到 FIN,但可能还有数据要发
第三次ServerClientServer: LAST_ACKFIN=1, seq=v服务端数据发送完毕,请求断开
第四次ClientServerClient: TIME_WAIT
Server: CLOSED
ACK=1, ack=v+1客户端确认,等待 2MSL 后彻底关闭

3.2 为什么需要四次挥手?

  • TCP 是全双工的。客户端发送 FIN 只是表示它没有数据要发了,但仍可接收数据。服务端收到 FIN 后,可能还有未发送完的数据,所以先回一个 ACK 确认,等数据发完了再发 FIN。

3.3 为什么 TIME_WAIT 需要等待 2MSL?

  • 确保最后一个 ACK 能到达服务端: 如果 ACK 丢失,服务端会重传 FIN。客户端在 2MSL 内收到重传的 FIN,会再次发送 ACK 并重置计时器。
  • 防止旧连接的数据包混入新连接: 2MSL (Maximum Segment Lifetime) 足够让网络中残留的旧数据包失效。

4. TCP vs UDP

特性TCP (Transmission Control Protocol)UDP (User Datagram Protocol)
连接性面向连接 (三次握手)无连接 (直接发包)
可靠性可靠 (重传、排序、校验)不可靠 (丢包不负责)
有序性保证顺序不保证顺序
速度较慢 (头部开销大 20字节)快 (头部开销小 8字节)
应用场景网页 (HTTP), 文件传输 (FTP), 邮件 (SMTP)视频会议, 直播, DNS, 在线游戏

5. TCP 流量控制与拥塞控制

5.1 流量控制 (Flow Control)

  • 滑动窗口 (Sliding Window): 接收方通过 TCP Header 中的 Window 字段告诉发送方自己的缓冲区大小,发送方据此控制发送速率,防止接收方处理不过来。

5.2 拥塞控制 (Congestion Control)

  • 慢启动 (Slow Start): 连接刚建立时,拥塞窗口 (cwnd) 指数级增长。
  • 拥塞避免 (Congestion Avoidance): 当 cwnd 达到阈值 (ssthresh) 后,线性增长。
  • 快重传 (Fast Retransmit): 收到 3 个重复 ACK 时,立即重传丢失的包,不必等待超时。
  • 快恢复 (Fast Recovery): 发生快重传后,ssthresh 减半,cwnd 设置为 ssthresh,直接进入拥塞避免。

Power by VitePress