深入理解TCP以及三次握手与四次挥手

发布于:2025-06-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、核心概念和分类

TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,属于 OSI模型的第四层(传输层)TCP/IP模型的传输层。以下是其核心概念和分类的详细说明:


1. 所属分类

1.1 网络模型中的位置
  • OSI模型:TCP属于第四层(传输层),负责在端到端之间提供可靠的数据传输服务。
  • TCP/IP模型:TCP位于传输层,与IP协议(网络层)共同构成TCP/IP协议栈的核心。
1.2 协议类型
  • 传输层协议:TCP是传输层的典型代表协议,与UDP(用户数据报协议)并列,但两者特性截然不同:
    • TCP:面向连接、可靠、有序、流量控制。
    • UDP:无连接、不可靠、无序、低开销。

2. 核心概念

2.1 面向连接
  • 连接建立:通过 三次握手(Three-Way Handshake)建立连接,确保双方具备通信能力。
  • 连接终止:通过 四次挥手(Four-Way Handshake)安全关闭连接,避免数据丢失。
2.2 可靠性
  • 确认机制(ACK):接收方对每个数据包发送确认(ACK),发送方未收到ACK时会重传。
  • 校验和:检测数据传输中的错误。
  • 序列号与确认号:确保数据按顺序到达,并避免重复或丢失。
2.3 基于字节流
  • 非结构化数据:TCP将数据视为连续的字节流(无消息边界),由应用层定义数据格式。
  • 数据分段:根据网络条件(如MTU)将数据分割成适当大小的报文段(Segment)。
2.4 流量控制
  • 滑动窗口机制:动态调整发送窗口大小,避免接收方缓冲区溢出。
  • 接收方反馈:通过窗口字段告知发送方当前可接收的数据量。
2.5 拥塞控制
  • 慢启动(Slow Start):初始阶段以指数增长速率发送数据。
  • 拥塞避免(Congestion Avoidance):进入稳定状态后线性增长速率。
  • 快速重传与恢复:检测到丢包时快速调整发送速率,减少网络拥塞。

3. 关键特性

特性 描述
可靠性 通过确认机制、重传机制和校验和确保数据完整性和正确性。
有序性 序列号确保数据按发送顺序重组,避免乱序。
全双工通信 双方可同时发送和接收数据(如HTTP/1.1的请求与响应)。
连接管理 三次握手建立连接,四次挥手终止连接,保证连接的稳定性。
适应性 动态调整传输速率(流量控制、拥塞控制),适应不同网络环境。

4. 与其他协议的对比

协议 特性 适用场景
TCP 面向连接、可靠、有序、高开销 需要可靠传输的场景(如HTTP、FTP、电子邮件)。
UDP 无连接、不可靠、无序、低开销 实时性要求高的场景(如视频流、在线游戏)。

5. 典型应用场景

  • Web浏览(HTTP/HTTPS):确保网页内容完整加载。
  • 文件传输(FTP):保障文件无损传输。
  • 电子邮件(SMTP/POP/IMAP):可靠传递邮件数据。
  • 远程登录(SSH):安全、可靠的终端连接。

6. 标准与规范

  • 定义标准:由 IETF RFC 793 首次定义,后续通过 RFC 9293 等文档更新。
  • 标准化组织:国际互联网工程任务组(IETF)负责维护和改进TCP协议。

TCP 协议通过 三次握手 建立连接,通过 四次挥手 终止连接。以下是完整过程、标志位含义及常见问题解析。


二、三次握手(建立连接)

1. 过程详解

第一次握手
  • 客户端 → 服务器SYN=1, Seq=x
    • SYN(Synchronize,同步):请求建立连接。
    • Seq=x:客户端随机生成初始序列号(Sequence Number),用于标识数据流的起点。
第二次握手
  • 服务器 → 客户端SYN=1, ACK=1, Seq=y, Ack=x+1
    • SYN=1:服务器同步自己的初始序列号 Seq=y
    • ACK=1(Acknowledgment,确认):确认号(Acknowledgment Number)有效,表示服务器已收到客户端的 Seq=x,并期望下次收到 x+1 的数据。
    • Ack=x+1:对客户端的确认号,确保双方序列号同步。
第三次握手
  • 客户端 → 服务器ACK=1, Ack=y+1
    • ACK=1:客户端确认服务器的 Seq=y,期望下次收到 y+1 的数据。
    • 连接建立完成:双方同步序列号,具备收发能力,进入 ESTABLISHED 状态。

2. 核心目的

  • 防止历史连接干扰:通过同步序列号和三次确认,避免旧请求的SYN报文被误认为新连接。
  • 验证收发能力:确保双方均能发送和接收数据。

三、四次挥手(终止连接)

1. 过程详解

第一次挥手
  • 客户端 → 服务器FIN=1, Seq=u
    • FIN=1(Finish,结束):客户端声明“已无数据发送”,请求关闭连接。
    • Seq=u:客户端当前发送的数据序列号。
第二次挥手
  • 服务器 → 客户端ACK=1, Ack=u+1
    • ACK=1:服务器确认收到客户端的 FIN,并期望下次收到 u+1 的数据。
    • 服务器进入 CLOSE_WAIT 状态:等待处理剩余数据。
第三次挥手
  • 服务器 → 客户端FIN=1, Seq=v
    • FIN=1:服务器声明“已无数据发送”,请求关闭连接。
    • Seq=v:服务器当前发送的数据序列号。
第四次挥手
  • 客户端 → 服务器ACK=1, Ack=v+1
    • ACK=1:客户端确认收到服务器的 FIN,连接完全关闭。
    • 客户端进入 TIME_WAIT 状态:等待 2MSL(最大报文段生存时间),确保最后一个 ACK 到达服务器。

2. 核心目的

  • 全双工独立关闭:每个方向需独立关闭,确保双方数据传输完成。
  • 防止数据丢失:通过四次确认,避免因未处理完数据而强制关闭连接。

四、TCP 标志位详解

缩写 全称 中文含义 作用
SYN Synchronize 同步 建立连接时同步序列号(三次握手)
FIN Finish 结束 请求关闭连接(四次挥手)
ACK Acknowledgment 确认 确认收到数据或响应(握手/挥手)
RST Reset 复位 强制终止异常连接(如端口未监听)
PSH Push 推送 提示接收方立即交付数据(如交互式应用)
URG Urgent 紧急 标记紧急数据需优先处理

标志位在 TCP 报文段中的位置

TCP 报文段头部包含 20 字节固定字段,其中 Flags 字段 为 6 位,顺序为:
URG | ACK | PSH | RST | SYN | FIN


五、常见问题与扩展

1. 为什么三次握手?

  • 防止资源浪费:若仅两次握手,服务器收到SYN后分配资源,但客户端可能未响应ACK,导致资源浪费。
  • 同步序列号:三次握手确保双方序列号同步,避免历史报文干扰。

2. 为什么四次挥手?

  • 全双工关闭:客户端和服务器需独立关闭发送通道,四次挥手确保双方确认无数据残留。
  • 避免数据丢失:若合并挥手步骤,服务器可能在未处理完数据时被强制关闭。

3. TIME_WAIT 状态的作用

  • 确保最后一个 ACK 到达:客户端等待 2MSL,防止服务器未收到 ACK 而重传 FIN。
  • 避免旧连接报文干扰:等待足够时间让旧报文段失效,防止新连接误用旧数据。

4. 如何解决 TIME_WAIT 过多?

  • 端口复用:设置 net.ipv4.tcp_tw_reuse=1(Linux)。
  • 缩短超时时间:调整 net.ipv4.tcp_fin_timeout(默认60秒)。

5. CLOSE_WAIT 状态堆积的原因

  • 应用程序未调用 close():检查代码是否正确关闭连接。
  • 防火墙拦截 FIN 报文:排查网络设备是否丢弃 FIN。

6. RST 的典型场景

  • 异常终止:服务器端口未监听或数据错误时,发送 RST=1 强制关闭连接。
  • 数据错误:接收方检测到非法序列号或数据时,发送 RST=1

六、TCP 报文段结构简图

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |          Source Port          |       Destination Port      |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                        Sequence Number                        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Acknowledgment Number                      |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  Data |           |U|A|P|R|S|F|                               |
 | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
 |       |           |G|K|H|T|N|N|                               |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |           Checksum            |         Urgent Pointer        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Options                    |    Padding    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                             data                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

七、总结

  • 三次握手:建立连接,通过SYN和ACK同步序列号,确保双方具备通信能力。
  • 四次挥手:终止连接,通过FIN和ACK独立关闭全双工通道,保证数据完整性。
  • 标志位作用:SYN/FIN控制连接状态,ACK确认数据,RST/PSH/URG处理异常或紧急数据。
  • 核心原则:TCP 通过严格的确认机制和状态转换,保障通信的稳定性和数据完整性。