TCP状态变迁
LISTEN: 可以接受SYN的状态,服务器等待连接
SYN_RECEIVED: 一个连接请求已经到达,等待确认
SYN_SENT: 发出连接请求,等待确认
ESTABLISED: 连接建立成功,可以进行数据通信
CLOSE_WAIT: 对方已关闭连接,等待本地用户关闭
FIN_WAIT_1: 应用程序关闭连接
FIN_WAIT_2: 对方已经知道本端不会再发送数据
CLOSING: 对待对方的连接终止请求确认
TIME_WAIT: 双方都尝试关闭连接,等待一段时间,以防止ACK丢失
LAST_ACK: 等待对方确认关闭连接
同步状态:ESTABLISHED, FIN_WAIT_1, FIN_WAIT_2, CLOSE_WAIT, CLOSING, LAST_ACK, TIME_WAIT
非同步状态:LISTEN,SYN_RECEIVED, SYN_SENT
从LISTEN到SYN_SENT的变迁是正确的,但伯克利的TCP软件并不支持它。这里也没有画出。
从程序开发者的角度来看RST的产生和RST的处理
RST的产生
- 向不存在的端口发起连接
- 一些延迟的包导致连接无法正常建立,例如一个旧的SYN副本
- 程序异常终止(依赖于系统,有的会发送FIN, 有的发送RST)
- 设置了SO_LINGER选项支持异常关闭,并调用close
- 已关闭的端口(调用close)收到数据
RST的处理
内核对rst的处理由下面这个函数完成