TCP 传输连接管理

2017年7月20日15:55:11 发表评论 91

之前两篇文章介绍了TCP 协议 TCP 可靠传输、流量控制和拥塞控制,今天我们一起学习TCP 的传输连接管理。

TCP 连接建立要解决三个问题:

  1. 要是每一方能够确知对方的存在
  2. 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量)
  3. 能够对传输实体资源(如缓存大小、连接表中的项目等)进行分配

TCP 连接的建立

TCP 传输连接管理

  1. 最初TCP两端都处于CLOSED(关闭)状态
  2. TCP服务器先创建传输控制块TCB,准备接收连接请求,处于LISTEN(收听)状态
  3. TCP客户端也先创建TCB,发出请求报文段(SYN=1  seq=x ),SYN报文段不能携带数据,但消耗一个序号,这时客户端进入SYN-SENT(同步已发送)状态
  4. 服务端收到请求后,如同意建立连接,则发送确认(SYN=1  ACK=1  ack=x+1  seq=y)。不携带数据,消耗一个序列号。服务器进入SYN-RCVD(同步收到)状态
  5. 客户端收到确认后,还要给服务器确认(ACK=1  ack=y+1 seq=x+1),ACK报文段可以携带数据,如果不携带数据不消耗序号。连接已经建立,客户端进入ESTABLISHED(已建立连接)状态。
  6. 服务端收到确认进入ESTABLISHED(已建立连接)状态

上面过程就是所谓的三次握手,为什么是3次不是2次?

因为客户端发出连接请求时,可能由于网络延迟而超时,然后又重发。之后这个延迟请求服务器收到了,以为是新的连接,于是服务器发出确认,如果是2次握手就建立连接,那么至此连接建立完成,但是这个连接并不应该建立成功。当客户端收到这个确认,由于客户端并没有发出建立连接请求,所以会丢弃这个确认。服务器收不到客户端的再次确认(第3次握手)就知道客户端并没有建立连接,而是之前重传导致的重复连接。

TCP 连接的释放

TCP 传输连接管理

通信的双方都可以释放连接

  1. A 停止发送数据,发出连接释放报文段,主动关闭TCP连接(FIN=1  seq=u)进入FIN-WAIT1(终止等待1)状态,等待 B 的确认(FIN报文即便不携带数据,也消耗一个序号);
  2. B 收到连接释放报文后发出确认(ACK=1  ack=u+1  seq=v),B 进入CLOSE-WAIT(关闭等待) 状态,这时A到B的连接就释放了,TCP处于半关闭状态。B还可以给A发数据。
  3. A 收到 B 的确认后就进入FIN-WAIT2(终止等待2)状态,等待B发出连接释放报文段。
  4. 当 B 没有数据向 A 发送了,B 发出连接释放报文段(FIN=1  seq=w ack=u+1),B 进入 LAST-ACK(最后确认)状态,等待 A 的确认。
  5. A 收到 B 的连接释放报文段后,必须对此发出确认(ACK=1  ack=w+1  seq=u+1),然后进入TIME-WAIT(时间等待)状态。然后必须经过时间等待计时器设置的 2MSL 后才进入CLOSED状态,才能建立下一个新的连接,A 撤销 TCB 后就结束了这次TCP请求,B 结束TCP连接的时间要比A早一些。MSL 叫做最长报文段寿命

上面的过程就是四次挥手,为什么TIME-WAIT状态必须等待2MSL时间呢?

  1. 为了保证 A 发送的最后一个ACK确认报文段能够到达B(如果这个确认对方没收到,那么A会在2MSL内收到B重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器。如果不等待2MSL,如果确认丢失,那么B就无法正常进入CLOSED状态)
  2. 防止建立连接时重发的延迟连接出现在本连接中(经过2MSL 就可以使本连接持续时间内所有产生的连接请求报文段全部从网络中消失,就不会干扰下一个新连接)

 

保护计时器:

建立连接后,客户端突然出现故障,服务端就收不到客户端的数据,也不能一直白等下去。

服务器每收到一次客户数据,就重新设置保活计时器,通常2小时,若两小时没有收到客户数据,就发送一个探测报文段,以后每隔75分钟发送一次,如果一连10个探测报文段后客户端仍无响应,服务器就关闭这个连接。

TCP 的有限状态机

TCP 传输连接管理

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: