目录
一、同时打开连接
二、同时关闭连接
三、示例
1.tcp同开由于linux实现不支持TCP同时主动打开连接,因此我们拿RFC793中的示意图来举例
2.tcp同关
3.tcp通过三次数据包交换关闭连接
补充说明
在前面的内容中我们介绍了TCP连接管理中最常见的三次握手方式和四次挥手的方式。但是有可能A和B两端同时执行主动打开并连接对方或者同时执行主动关闭连接(尽管发生这种情况的可能性比较低低),这个时候的流程就略有不同了。下面我们分别对同时打开(simultaneous open)连接和同时关闭(simultaneous)连接这两种情况分别进行介绍。
一、同时打开连接
同时打开连接是指通信的双方在接收到对方的SYN包之前,都进行了主动打开的操作并发出了自己的SYN包。如之前所说一个四元组标识一个TCP连接,因此如果一个TCP连接要同时打开需要通信的双方知晓对方的IP和端口信息才行,这种场景在实际情况中很少发生(NAT穿透中可能会多一些)。同时打开的流程如下图
具体流程我们不在逐条消息进行介绍。注意上图中,TCP连接同时打开的时候与三次握手的主要区别如下
- 我们同时称呼A和B为Client,他们都执行主动打开的操作(Active Opener)。
- 同时两端的状态变化都是由CLOSED->SYN_SENT->SYN_RCVD->ESTABLISHED。
- 建立连接的时候需要四个数据包的交换,并且每个数据包中都携带有SYN标识,直到收到SYN的ACK为止
二、同时关闭连接
同时关闭相对于我们讲过的四次握手过程基本类似,注意两者状态转换的区别,同时关闭是由ESTABLISHED->FIN_WAIT_1->CLOSING->TIME_WAIT->CLOSED。同时关闭的流程如下,不在做额外的讲解。
三、示例
1.tcp同开 由于linux实现不支持TCP同时主动打开连接,因此我们拿RFC793中的示意图来举例
TCP A TCP B
1. CLOSED CLOSED
2. SYN-SENT --> ...
3. SYN-RECEIVED --> SYN-RECEIVED
5. SYN-RECEIVED --> ...
6. ESTABLISHED --> 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 (
下面看一下wireshark实际抓包
2.tcp同关
linux本身也是支持TCP同时关闭连接的,wireshark抓包如下
3.tcp通过三次数据包交换关闭连接
还有一种场景是TCP通过三次数据包交换来关闭连接,这种场景同样很少遇到,我们不做过多介绍,以一个wireshark实例来看一下相关的系列号seq和ack number的关系
补充说明
1、RFC793给的同时打开TCP连接的示意图中,TCP B进入ESTABLISHED状态前收到的包应该是
2、本篇文章给出的同时关闭时的tcp包时序图是与RFC793一致的,但是注意一些资料包括我所参考的第二版 tcpip详解,给的同时关闭的示意图中最后两条消息的系列号seq是错误的,或者干脆没有给出系列号seq的值
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net