TCP 是面向连接的传输层协议,在数据传输之前需要建立连接(三次握手),传输结束后需要释放连接(四次挥手)。连接管理是 TCP 协议的核心机制之一,也是 408 考试的高频考点。
客户端发送 SYN 报文($SYN=1, seq=x$),服务器回复 SYN+ACK 报文($SYN=1, ACK=1, seq=y, ack=x+1$),客户端再发送 ACK 报文($ACK=1, seq=x+1, ack=y+1$)。三次握手的目的是同步双方的初始序列号(ISN),并确认双方的收发能力正常。之所以需要三次而不是两次,是为了防止已失效的连接请求报文到达服务器导致错误连接。
主动关闭方发送 FIN 报文($FIN=1, seq=u$),被动关闭方回复 ACK 报文($ACK=1, ack=u+1$),此时进入半关闭状态;被动关闭方发送 FIN 报文($FIN=1, seq=w$),主动关闭方回复 ACK 报文($ACK=1, ack=w+1$),并进入 TIME-WAIT 状态,等待 $2MSL$ 后关闭。四次挥手的原因是 TCP 是全双工的,每个方向的关闭需要独立进行。
| 概念 | 定义 |
|---|---|
| SYN | 同步位,用于连接建立时同步序列号 |
| FIN | 终止位,表示发送方数据已发送完毕,请求释放连接 |
| ACK | 确认位,表示确认号字段有效 |
| seq | 序列号,表示本报文段数据的第一个字节的编号 |
| ack | 确认号,表示期望收到对方下一个报文段的第一个字节的编号 |
| MSL | 最大报文段生存时间(Maximum Segment Lifetime) |
| TIME-WAIT | 主动关闭方发送最后一个 ACK 后进入的状态,等待 $2MSL$ |
| SYN 洪泛攻击 | 攻击者伪造大量 SYN 报文但不完成三次握手,耗尽服务器资源 |
| 考点 | 说明 |
|---|---|
| 三次握手过程描述 | 画出握手过程,标注各报文的 SYN / ACK / seq / ack 值 |
| 为什么是三次不是两次 | 防止已失效的连接请求被服务器误接受,浪费资源 |
| 四次挥手过程描述 | 画出挥手过程,理解半关闭状态 |
| TIME-WAIT 状态的作用 | 确保最后一个 ACK 能到达对方;让旧报文段在网络中消失 |
| SYN 洪泛攻击与 SYN Cookie | 理解攻击原理及防御机制 |
| 连接建立失败的处理 | 服务器收到 SYN 后的超时重传机制 |
close() 的一方为主动关闭方。↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。