1.TCP状态转换图

TCP状态转换详解

(TCP状态转换图)上图截取自UNIX网络编程卷1

TCP的11种状态:

  • CLOSED :起始点,在连接关闭或超时的时候变成此状态
  • LISTEN : 监听来自网络节点上其他主机的TCP端口连接请求,服务端需要调用socket, bind,listen函数,就进入此状态。此称为应用程序被动打开(等待客户端来连接)
  • SYN_RCVD :如图所示,服务器接收到来自客户端的连接请求(发送一个SYN分节),服务器端tcp状态就由LISTEN- > SYN_RCVD,服务器端发送ACK和SYN,或者客户端在发起SYN的同时接收到服务器端的SYN,客户端就会SYN_SENT -> SYN_RCVD。
  • SYN_SETN:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接(应用关闭;或超时),则直接进入CLOSED状态。具体行为是发起一个SYN连接请求
  • ESTABLISHED:总体说来,客户端和服务器端在完成三路握手后,两者最终进入的状态,表示连接已经建立成功,可以传送数据了。对于服务器端来说,就是在SYN_RCVD状态时,收到了来自客户端的ACK。于是SYN_RCVD->ESTABLISHED;对于客户端来说,就是在SYN_SENT状态时,收到了来自服务器端的SYN+ACK分节,状态从SYN_SENT->ESTABLISHED,然后发送ACK
  • FIN_WAIT_1:主动关闭的一方(发送FIN的那方)从ESTABLISHED -> FIN_WAIT_1
  • FIN_WAIT_2:主动关闭的一方,接收到对方的FIN ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据(此句话很重要)
  • CLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作时接收到FIN,同时发送ACK。为了便于记忆,大家可以这么想,TCP终止中,接收到了FIN的被动关闭方发送ACK后,过会还要发送FIN表示自己也要关闭了,中间的这段就可以叫做CLOSE_WAIT(等待关闭)
  • LAST_ACK:,被动方发送FIN,导致CLOSE_WAIT -> LAST_ACK,TCP终止则还需要等待最后一个ACK,所以状态叫做LAST_ACK,等到最后ACK后,LAST_ACK ->CLOSED
  • CLOSING:主动关闭方处于FIN_WAIT_1状态时,接收FIN,则从FIN_WAIT_1 -> CLOSING (举一个此种情况的例子,(前提是两者的tcp连接已经建立)当主动关闭方发送FIN(一般是调用close)给被动关闭方,状态从ESTABLISHED -> FIN_WAIT_1,如果是正常TCP终止,则主动方会收到一个ACK,状态从 FIN_WAIT_1 -> FIN_WAIT_2,然后一段时间后被动方会继续发送FIN给主动方,主动关闭方收到FIN后状态从FIN_WAIT_2 -> TIME_WAIT(2msl后超时,状态最终变为CLOSED),这是最正常的情况,但当主动关闭方处于FIN_WAIT_1时,被动关闭方的FIN先于之前的自己发送的ACK到达,主动关闭方就直接FIN_WAIT_1 -> CLOSING,(其实就相当于同时关闭),然后迟来的ACK到达时,主动关闭方就从CLOSING -> TIME_WAIT
  • TIME_WAIT :三种转化途径
    • FIN_WAIT_1 -> TIME_WAIT: 接收到了FIN,ACK
    • FIN_WAIT_2 -> TIME_WAIT: 在正常TCP终止时,这种情况发生,处于FIN_WAIT_2的主动关闭方接收到被动关闭方的FIN,tcp状态发生改变,然后发送ACK
    • CLOSING -> TIME_WAIT: 处于CLOSING状态的主动关闭端接收到了迟来的ACK

2.TCP实际分组交换情况(包括建立 数据传送 连接终止)

TCP状态转换详解

上述分组交换图很好的体现了tcp状态的变换发生在函数调用的具体时机,和函数当时的具体状态

  • 起始点都是CLOSED状态

  • FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT都是主动关闭方可能会经历的状态

  • CLOSE_WAIT   LAST_ACK 是被动关闭方可能会经历的状态

3.理解什么是TIME_WAIT状态以及为什么需要设置这种状态

  • TIME_WATI状态是TCP11种状态中的一种,一般是主动关闭方可能会呈现的状态
  • MSL:指任何IP数据报能够在英特网中存活的最长时间
  • 主动关闭方停留在这个状态的持续时间是两倍的最长分节生命期(2MSL)
  • 重复分组的概念:由于网络或者路由等原因,分组在规定时间内没有到达接收端,发送端tcp超时并重传该分组,早先迷失的分组就成为重复分组
  • 为什么要设置这种状态:1.可靠的实现tcp全双工连接的终止。2.允许老的重复分节在网络中消逝

4.使用netstat调试TCP应用

参见我的另一篇博文

使用netstat调试TCP应

相关文章: