TCP连接的同时打开和同时关闭
来源:互联网 发布:手机怎么打开index.php 编辑:程序博客网 时间:2024/05/18 01:14
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 --> <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实际抓包
2.tcp同关
linux本身也是支持TCP同时关闭连接的,wireshark抓包如下
3.tcp通过三次数据包交换关闭连接
还有一种场景是TCP通过三次数据包交换来关闭连接,这种场景同样很少遇到,我们不做过多介绍,以一个wireshark实例来看一下相关的系列号seq和ack number的关系
补充说明
1、RFC793给的同时打开TCP连接的示意图中,TCP B进入ESTABLISHED状态前收到的包应该是<SEQ=100><ACK=301><CTL=SYN,ACK>。想借此提醒不要仅仅看协议本身,还要记得看协议是否由对应的勘误表(errata)。原始的RFC793协议有很多
2、本篇文章给出的同时关闭时的tcp包时序图是与RFC793一致的,但是注意一些资料包括我所参考的第二版 tcpip详解,给的同时关闭的示意图中最后两条消息的系列号seq是错误的,或者干脆没有给出系列号seq的值。
- TCP连接的同时打开和同时关闭
- TCP同时打开和同时关闭
- tcp/ip 同时打开 同时关闭
- TCP-IP详解:TCP半打开连接及同时打开同时关闭
- 关闭窗体的同时打开另一个窗体
- 双方同时开启TCP连接
- C#Form打开一个新窗口的同时关闭这个窗体
- C#Form打开一个新窗口的同时关闭这个窗体
- C#关闭一个窗口的同时打开另一个窗口
- C#关闭一个窗口的同时打开另一个窗口
- winform打开新窗口的同时关闭主窗口
- C#Form打开一个新窗口的同时关闭这个窗体
- Simultaneous TCP open(同时开放TCP连接)
- linux下搭建能同时接收UDP和TCP连接的socket并发多线程服务器
- 16-TCP 协议(同时关闭)
- TCP的连接和关闭
- TCP的连接和关闭
- TCP的连接和关闭
- L1-018. 大笨钟
- POJ1679 The Unique MST —— 次小生成树
- Android Retrofit框架请求复杂json数据
- cocopods
- 快速乘-模板
- TCP连接的同时打开和同时关闭
- java基础(2)
- ajax基本语法
- 使用github pages创建博客
- 欧几里得扩展
- 李白打酒
- 模拟实现strstr函数
- 证垂直
- 【linux is not Unix】linux账户管理和用户组管理