网线断了是什么状态-续

之前测试的场景是两个主机直接连接,中间没有其他设备。在现实情况中,这种做法几乎是不存在的。一端连接主机的网线,其另一端通常接入的是交换机,集线器之类的网络设备。

在这种情况(除接入一个交换机之外,其他设定与之前相同)下,执行前篇进行的各种操作,可能会有不同的结论。

一、 从B主机(win7+s.exe)上拔掉网线

B主机此时所处的场景,其实与前篇中的一样。拔掉了它的网线,系统会立即感知到,提示:“网络电缆没有插好”。当B系统提示“网络电缆没有插好”时,让s.exe执行如下几个特殊动作(其实与前篇B端的结论一样)。

  • s.exe不执行send/recv操作:TCP状态始终是“ESTABLISHED”。
  • s.exe仅执行一次recv操作:TCP状态始终是“ESTABLISHED”。
  • s.exe仅执行一次send操作:从执行完send开始算起,经过20秒左右(通常为20秒),系统将连接销毁。

A的表现有所不同,因为网线的另一头是插在中间设备上的,拔掉B上的网线后,A与中间设备还是连接完好的。因此,系统没有任何感知,显示机器处于连接状态。当B系统提示“网络电缆没有插好”时,让c.exe执行如下几个特殊动作。

  • c.exe不执行send/recv操作:显然,系统将始终认为TCP是“ESTABLISHED”状态。
  • c.exe仅执行一次recv操作:TCP状态始终是“ESTABLISHED”。
  • c.exe仅执行一次send操作:该报文会不断地被重传,重传5-7次(测试结果),最后一次重传后若还等不来ACK,则销毁连接。

二、 从A主机(winXP+c.exe)上拔掉网线

B系统感知不到这个变化,系统显示网络线路是通的。当A系统提示“网络电缆没有插好”时,让s.exe执行操作:

  • s.exe不执行send/recv操作:TCP状态始终是“ESTABLISHED”。
  • s.exe仅执行一次recv操作:TCP状态始终是“ESTABLISHED”。
  • s.exe仅执行一次send操作:该报文会不断地被重传,重传4次(测试结果),最后一次重传后若还等不来ACK,则销毁连接。

A系统此时的状况与前篇的A端的结论一样,系统会立即感知到变化,并提示:“网络电缆没有插好”。当A提示“网络电缆没有插好”时,让c.exe执行如下动作:

  • c.exe不执行send/recv操作:10秒左右(通常为10秒),系统将连接销毁。
  • c.exe仅执行一次recv操作:10秒左右(通常为10秒),系统将连接销毁。
  • c.exe仅执行一次send操作:10秒左右(通常为10秒),系统将连接销毁。

三、 剪断网线

剪断主机B与中间设备间的网线,与情况一结论一致。剪断主机A与中间设备间的网线,与情况二结论一致。

小结

两篇文章是对测试结果的记录,由于所使用的机器配置,操作系统(win7、winXP),以及程序实现都是十分具体的东西。因此,测试得出的数据不具备普遍性,不必太在意具体数值。所得出的TCP的一些行为,在其他系统的实现中,可能也有所不同,这里只基于看到的事实做个总结。

按系统能否直接感知到线路状况来进行分类:

线路的断开是系统可以感知到的(系统已知道线路断了):有些系统(winXP)会在感知到之后的n秒钟将连接销毁;有些系统(win7)在感知到之后并不做反应,直到第一次send调用后的n秒钟再将连接销毁。

线路的断开是系统感知不到的(系统不知道线路已在某处断开):系统会在send出的报文段发生n次重传而得不到ACK时销毁连接。

还有,在测试时没有考虑TCP的keep-alive机制,这个机制默认是关闭的,在程序中没有开启。