在前面的内容中咱们介绍了TCP链接管理中最多见的三次握手方式和四次挥手的方式。可是有可能A和B两端同时执行主动打开并链接对方或者同时执行主动关闭链接(尽管发生这种状况的可能性比较低低),这个时候的流程就略有不一样了。下面咱们分别对同时打开(simultaneous open)链接和同时关闭(simultaneous)链接这两种状况分别进行介绍。linux
1、同时打开链接并发
同时打开链接是指通讯的双方在接收到对方的SYN包以前,都进行了主动打开的操做并发出了本身的SYN包。如以前所说一个四元组标识一个TCP链接,所以若是一个TCP链接要同时打开须要通讯的双方知晓对方的IP和端口信息才行,这种场景在实际状况中不多发生(NAT穿透中可能会多一些)。同时打开的流程以下图
tcp
具体流程咱们不在逐条消息进行介绍。注意上图中,TCP链接同时打开的时候与三次握手的主要区别以下spa
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的值。