第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

三次握手(建立连接)

  1. 客户发送SYN
  2. 服务器发送SYN+ACK
  3. 客户发送ACK

四次挥手(终止连接)

  1. 主动关闭发送FIN
  2. 被动关闭发送ACK
  3. 被动关闭发送FIN
  4. 主动关闭发送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_WAIT2MSL等待

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操作的关键。