TCP-IP详解:TCP半打开连接及同时打开同时关闭

参考资料:TCP-IP详解

主要介绍:半打开连接,同时打开,同时关闭

TCP半打开连接

如果一方已经关闭或者异常终止连接而另外一方却还不知道,这样的连接就称为半打开连接(Half open connection)。处于半打开的连接,如果双方不进行数据通信,是发现不了问题的,只有在通信是才真正的察觉到这个连接已经处于半打开状态,如果双方不传输数据的话,仍处于连接状态的一方就不会检测另外一方已经出现异常

半打开连接的一个常见的原因是客户端或者服务器突然掉电而不是正常的结束应用程序后再关机,这样即使重新启动后,原来的连接信息已经消失了,对端仍然保持半打开状态,如果需要发数据的话,这边收到之后 其实发现这个连接并不存在了,就会回复RST包告知,这个时候就需要重新建立连接了!

接下来使用SSH协议复制一下这个场景:

1. 打开SSH Secure Shell Client,然后登陆到远程的Linux服务器 192.168.1.104 DST PORT 22

2. 建立连接成功,可以在client进行linux操作

3. 需要模拟服务器出现异常,先关掉网卡,然后关机(关掉网卡,为了避免关机时服务器主动退出发送FIN包)

4. 这样服务器已经出现异常关闭,但是此时Client端并没有任何察觉,这个时候连接已经处于半打开状况

5. 重新打开服务器

6. 操作客户端,发现已经出现了异常,无法通信,并提示重新连接, 这个时候实际上客户端发送的包被服务器给RST了,因为之前的连接信息已经丢失了

7. 重新连接之后可以正常的进行通信

服务器重新启动,之前的连接信息都已经丢失,所以它将复位所以信息,因此它不知道数据报文段提到的连接,处理原则就是接收方以复位做应答。下面的图就是这个例子的tcpdump图示:

从图中可以看到36077包是服务器异常之后发的包,但是服务器并没有识别这个连接,发送36078 RST包做应答。


同时打开

两个应用程序同时彼此执行主动打开的情况,2端的端口需要一致,这就需要双方都熟知端口,这种情况发生的概率很小 ,这里简单的介绍一下

场景:

1. PC1的应用程序使用端口7777 与PC2的端口8888  执行主动打开

2. PC2的应用程序使用端口8888 与PC1的端口7777 执行主动打开

3. SYN包同时打开对端,这种情况即为同时打开

TCP中,对于同时打开它仅建立一条连接而不是两条连接,状态变迁图如下:同时发送SYN包,然后收到进行确认直接进入ESTABLISHED状态,可以看到同时打开需要连接建立需要4个报文段,比三次握手多一次!

我有尝试制造一下这种场景,使用tcpdump来抓一下图示,但是没有复现出来,这个地方就借用教科书中的图来看下


从图中我们可以看到前4个报文就是同时打开的2个SYN 和2个ACK。


同时关闭

有同时打开,理所应当的也有同时关闭的场景,TCP协议也允许同时关闭。状态变化可以看到下图了,同时发送FIN包,两端同时执行主动关闭,进入FIN_WAIT_1的状态,从FIN_WAIT_1状态收到FIN包的时候进入CLOSING状态,然后回复ACK,进入TIME_WAIT状态。


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值