Tcp连接管理

delims 于 2020-08-09 发布

说明

连接的建立 - 三次握手(three-way handshake)

  1. client 向 server发起连接请求报文,设置 SYN=1,seq = x。状态 CLOSED -> SYN_SENT
  2. server 收到请求同意连接发出确认报文 SYN=1,ACK=1,ack = x+1,seq = y。状态 LISTEN -> SYN-RCVD
  3. client 收到请求发出确认 ACK=1,ack = y+1,seq = x+1。状态 SYN-SENT -> ESTABLISHED 。server 收到确认。状态 SYN-RCVD -> ESTABLISHED

连接的释放 - 四次握手。

任何一方都可以主动关闭。

  1. client主动关闭,发出关闭请求 FIN=1,seq = u。状态 ESTABLISHED -> FIN-WAIT-1
  2. server收到,发出确认 ACK=1,ack = u+1,seq = v。状态 ESTABLISHED -> CLOSE-WAIT,client 收到确认。状态 FIN-WAIT-1 -> FIN-WAIT-2

此时 client到server的连接关闭了,client没有数据要发给server了。server可能还有数据要发给client

  1. server发出连接释放请求 FIN=1,ACK=1,ack = u+1,seq = w,状态 CLOSE-WAIT -> LAST-ACK。
  2. client收到,发出确认 ACK=1,ack = w+1,seq = u+1。状态 FIN-WAIT-2 -> TIME-WAIT。server收到,关闭连接进入 CLOSED状态。

此时server已经关闭了,客户端还需要等待 2MSL 的时间才可以关闭。

RFC 793建议设置2分钟,对现在的网络来说太长了。

client为什么要等2MSL的时间呢,有两方面考虑。

TCP还设有一个保活计时器(keepalive timer)