创建连接 - 三次握手
过程
- 客户端选择一个seq数字,tcp头部标志位SYN位置为1。本次请求内不能携带发送数据。
- 服务端收到SYN建立连接请求,申请TCP缓冲区,初始化一个服务端的seq序列号。回复一个SYN ack数据包。
- 客户端收到SYN ack后,给服务端回复一个SYN ack的ack。本次数据包中就可以携带数据了。
注意: SYN及FIN也会占用一个seq序列号空间
三次握手成功后,即连接已经建立成功了。客户端和服务端可以在这个连接上相互发送数据。数据发送完成后,需要4次挥手断开连接。
断开连接 - 四次挥手
过程
任何一方都可以主动断开连接,此处以客户端主动断开为例。
- 客户端发送,tcp首部标志位fin为1的fin断开连接请求包。
- 服务端收到FIN包后,对FIN包做ack响应。
- 若服务端还有数据需要向客户端传递,继续按照正常流程向客户端传递数据。
- 若服务端以没有数据需要向客户端再次传递,也会向客户端发送一个fin数据包。
- 客户端收到finFIN后,给服务端ack响应。
- 服务端收到ack包后,即断开连接。
TCP状态转换图
状态流转图
服务端状态流转图
客户端状态流转图
请求流程状态图
TIME_WAIT状态
TIME_WAIT状态也称为 2 MSL等待状态。每个具体 T C P实现必须选择一个报文段最大生存时间M S L(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为 T C P报文段以I P数据报在网络内传输,而 I P数据报则有限制其生存时间的TTL字段。
主要作用
- 可靠的实现TCP全双工连接终止。
- 允许老的分节在网络中消逝。