TCP系列03—链接管理—二、TCP链接的同时打开和同时关闭

        在前面的内容中咱们介绍了TCP链接管理中最多见的三次握手方式和四次挥手的方式。可是有可能A和B两端同时执行主动打开并链接对方或者同时执行主动关闭链接(尽管发生这种状况的可能性比较低低),这个时候的流程就略有不一样了。下面咱们分别对同时打开(simultaneous open)链接和同时关闭(simultaneous)链接这两种状况分别进行介绍。linux

1、同时打开链接并发

        同时打开链接是指通讯的双方在接收到对方的SYN包以前,都进行了主动打开的操做并发出了本身的SYN包。如以前所说一个四元组标识一个TCP链接,所以若是一个TCP链接要同时打开须要通讯的双方知晓对方的IP和端口信息才行,这种场景在实际状况中不多发生(NAT穿透中可能会多一些)。同时打开的流程以下图
tcp


        具体流程咱们不在逐条消息进行介绍。注意上图中,TCP链接同时打开的时候与三次握手的主要区别以下spa

  • 咱们同时称呼A和B为Client,他们都执行主动打开的操做(Active Opener)。
  • 同时两端的状态变化都是由CLOSED->SYN_SENT->SYN_RCVD->ESTABLISHED
  • 创建链接的时候须要四个数据包的交换,而且每一个数据包中都携带有SYN标识,直到收到SYN的ACK为止


2、同时关闭链接3d

        同时关闭相对于咱们讲过的四次握手过程基本相似,注意二者状态转换的区别,同时关闭是由ESTABLISHED->FIN_WAIT_1->CLOSING->TIME_WAIT->CLOSED。同时关闭的流程以下,不在作额外的讲解。
orm



3、示例blog

1.tcp同开
因为linux实现不支持TCP同时主动打开链接,所以咱们拿RFC793中的示意图来举例
ip


      TCP A                                            TCP B

  1.  CLOSED                                           CLOSED

  2.  SYN-SENT     --> <SEQ=100><CTL=SYN>              ...

  3.  SYN-RECEIVED <-- <SEQ=300><CTL=SYN>              <-- SYN-SENT

  4.               ... <SEQ=100><CTL=SYN>              --> SYN-RECEIVED

  5.  SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...

  6.  ESTABLISHED  <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED

  7.               ... <SEQ=101><ACK=301><CTL=ACK>     --> ESTABLISHED

                Simultaneous Connection Synchronization

 RFC793对示意图中的相关符号说明以下,你们对照下面的说明仔细观察一下上面RFC的文字示例图,有没有发现什么问题呢?(参看补充说明部分第2点)
Right arrows (-->) indicate departure of a TCP segment from TCP A to TCP B, or arrival of a segment at B from A. Left arrows (<--), indicate the reverse. Ellipsis (...) indicates a segment which is still in the network (delayed).

下面看一下wireshark实际抓包get

2.tcp同关it

linux自己也是支持TCP同时关闭链接的,wireshark抓包以下


3.tcp经过三次数据包交换关闭链接

还有一种场景是TCP经过三次数据包交换来关闭链接,这种场景一样不多遇到,咱们不作过多介绍,以一个wireshark实例来看一下相关的系列号seq和ack number的关系


补充说明

一、RFC793给的同时打开TCP链接的示意图中,TCP B进入ESTABLISHED状态前收到的包应该是<SEQ=100><ACK=301><CTL=SYN,ACK>。想借此提醒不要仅仅看协议自己,还要记得看协议是否由对应的勘误表(errata)。原始的RFC793协议有不少

二、本篇文章给出的同时关闭时的tcp包时序图是与RFC793一致的,可是注意一些资料包括我所参考的第二版 tcpip详解,给的同时关闭的示意图中最后两条消息的系列号seq是错误的,或者干脆没有给出系列号seq的值。





相关文章
相关标签/搜索