第18章 TCP连接的建立与终止
18.1 引言
TCP是面向连接的协议,在传输数据前必须建立连接。
18.2 连接的建立与终止
tcpdump输出示例
1 0.0 svr4 > bsdi: S 1415531521:1415531521(0) win 4096 2 0.0024 bsdi > svr4: S 1823083521:1823083521(0) ack 1415531522 win 4096 3 0.0072 svr4 > bsdi: . ack 1 win 4096
text
三次握手(建立连接)
- 客户发送SYN
- 服务器发送SYN+ACK
- 客户发送ACK
四次挥手(终止连接)
- 主动关闭发送FIN
- 被动关闭发送ACK
- 被动关闭发送FIN
- 主动关闭发送ACK
18.3 连接建立的超时
- 初始超时:约6秒
- 指数退避:12秒、24秒、48秒…
- 总超时:75秒
18.4 最大报文段长度(MSS)
- 在SYN中通告
- 以太网MSS可达1460字节
- 默认值:536字节
18.5 TCP的半关闭
- 应用程序可发送FIN但继续接收数据
- 使用
shutdown函数 - 常用于rsh命令
18.6 TCP的状态变迁图
11种状态
| 状态 | 说明 |
|---|---|
| CLOSED | 关闭 |
| LISTEN | 监听连接 |
| SYN_SENT | 已发送SYN |
| SYN_RCVD | 已收到SYN |
| ESTABLISHED | 已建立 |
| CLOSE_WAIT | 等待关闭 |
| FIN_WAIT_1 | 已关闭,等待ACK |
| CLOSING | 同时关闭 |
| LAST_ACK | 等待FIN确认 |
| FIN_WAIT_2 | 等待FIN |
| TIME_WAIT | 2MSL等待 |
2MSL等待状态
- TIME_WAIT持续2MSL(1-4分钟)
- 防止旧连接的数据干扰新连接
18.7 复位报文段(RST)
- 到不存在端口的连接请求
- 异常终止连接
- 检测半打开连接
18.8 同时打开
- 双方同时发送SYN
- 交换4个报文段(比正常多1个)
- 状态变迁:SYN_SENT → SYN_RCVD → ESTABLISHED
18.9 同时关闭
- 双方同时发送FIN
- 状态变迁:ESTABLISHED → FIN_WAIT_1 → CLOSING → TIME_WAIT
18.10 TCP选项
| 选项 | 说明 |
|---|---|
| 0 | 选项表结束(EOL) |
| 1 | 无操作(NOP) |
| 2 | 最大报文段长度(MSS) |
| 3 | 窗口扩大 |
| 8 | 时间戳 |
18.11 TCP服务器的设计
端口号分配
- 所有连接使用相同服务器端口
- 通过4元组区分连接
连接队列
- 最大连接数 = backlog × 3/2 + 1
- 队列满时忽略SYN(不发送RST)
18.12 小结
TCP连接由4元组唯一标识。状态变迁图是理解TCP操作的关键。