TCP 链接的建立(三次握手)
- 服务器启动之后会持续监听连接请求
- 客户端主动发起建立连接的请求,其请求中包含
SYN
标志位和一个报文客户端序列号seq=x
- 服务端收到建立连接的请求时,主动进入
SYN
已收到的状态,同时返回一个确认报文,报文包含SYN
和ACK
状态位,同时返回确认序列号ack=x+1
和当前报文的服务端序列号seq=y
- 客户端收到确认报文之后进入连接已经建立状态,然后立即返回一个确认报文,报文包含
ACK
状态位,同时返回确认序列号ack=y+1
和当前报文的服务端序列号seq=x+1
注
TCP
规定,SYN
报文段(即SYN=1
的报文段)不能携带数据,但是要消耗掉一个序号;ACK
报文段可以携带数据,如果不携带数据则不消耗序号。- 流程中每一个报文若未收到响应,发送端都会重复发送几次
- 服务端进入
SYN
已经收到状态且已经发送响应时会启动超时定时器,超时未收到响应时就会释放相应的资源 - 部分服务器为了避免
TCP
连接攻击,会在收到客户端确认响应之后才会分配相应的资源
TCP 链接的释放(四次挥手)
以客户端主动断开连接为例
- 客户端发送端开连接的请求报文,报文包含
FIN
状态位和客户端序列号seq=u
,并进入发送通道关闭等待响应状态 - 服务端收到报文后会通知上层的应用程序,同时返回确认报文,报文包含
FIN
和ACK
状态位,以及确认序列号ack=u+1
和当前报文的服务端序列号seq=v
- 客户端收到响应报文之后进入发送通道关闭状态,同时进入接收通道等待关闭
- 服务端发送完所有数据之后会发送连接关闭报文,此报文包含
FIN
和ACK
状态位,以及确认序列号ack=u+1
和当前报文的服务端序列号seq=w
,进入连接关闭等待确认状态 - 客户端收到接收通道关闭请求报文后,等待一段时间后关闭接收通道,同时发送一个确认报文给服务端,此报文包含
ACK
状态位,同时返回确认序列号ack=w+1
和当前报文的服务端序列号seq=u+1
- 服务端收到请求后关闭发送通道
- 客户端等待时间过期之后关闭连接
注
- TCP 规定,FIN 报文段即使不携带数据也要消耗一个序号。
- 四次挥手是为了确保对方发送的数据发送完毕,全双工通信只能确保主动关闭的一方无数据发送,对端可能还有数据需要发送
- 客户端收到关闭请求不会立即进入关闭状态而是等待一段时间后再关闭是为了等待网络中滞留的报文