学习TCP协议的第一步是要了解熟悉TCP的三次握手/四次挥手以及状态迁移图. 这篇文章用三个图展示TCP链接的建立与关闭以及状态的迁移.
TCP状态迁移
根据TCP协议的文档RFC793, 一个TCP链接有下图中的几个状态(图中实粗线为Client端的正常情况下状态迁移图, 虚线为Server端正常情况下的状态迁移图):
CLOSED
: TCP链接的初始状态, 表示没有任何链接LISTEN
: (服务端)等待来自远程客户端的请求SYN_SENT
: 发送了一个建立TCP链接的SYN请求, 等待对端返回结果SYN_RCVD
: 收到了TCP建立链接的SYN包, 等待对方的回应(ACK)ESTABLISHED
: TCP链接建立成功, 从这里开始可以交换数据包了FIN_WAIT1
: 应用进程关闭了TCP链接(发送FIN包), 并等待对端的响应FIN_WAIT2
: 接收到关闭回应后, 等待对端结束TCP链接(等待FIN包)CLOSING
: 如果两端同时接收到了FIN包, 则进入该状态CLOSE_WAIT
:处于被动关闭一端接受到FIN请求后, 等待本地进程的关闭TCP链接LAST_ACK
: 服务端本地进程关闭TCP链接后, 发送FIN包, 等待回应TIME_WAIT
: 等待2*MSL(Maximum Segment Lifetime, TCP包的最大存活时间)后关闭该TCP链接, 等待足够长的时间是为了确保最后关闭链接的ACK包有足够长的时间达到对端, 如果对端未能收到该包, 则会重传FIN包, 这样对端也可以重传ACK包, 一般MSL为60s。有关更多TIME_WAIT
状态的解释可以参考TIME-WAIT State.
TCP三次握手与四次挥手
正常情况下, TCP的三次握手与四次挥手如下图所示:
同时关闭时的TCP状态变化
如果TCP通信的两端同时请求关闭链接, 流程如下图所示:
关于TCP协议的参考资料:
- RFC793: 这是有关TCP协议的标准文本, 信息的源头
- <TCP/IP详解 卷1>: W. Richard Stevens的经典, 必看