应用层如何感知传输层链路故障
比如,一条普通的http连接底层依赖了一条普通的tcp连接,当某些故障导致tcp断掉了,http如何感知呢?
结论:tcp连接本质上是逻辑上的连接,依靠两边的操作系统内核维护了一些变量来表示连接的不同状态,所以只有在两端间真正有数据包传送的时候,才可能会改变现有的逻辑状态到一个新状态。
以下实验已将socket keepalive关闭
实验1:应用层有新数据发送时
实验过程
-
client 与 server 建立TCP连接
-
通过scapy构造RST包“欺骗”server关闭连接来模拟链路故障,此时client并不知情server端已关闭(send(IP(dst=“192.168.57.3”)/TCP(sport=42752, dport=12345, seq=992635624, flags=“R”)))
-
client发送数据
-
可以看到server由内核代为返回了RST包
抓包详情如下:
其中称192.168.57.100为client,192.168.57.3为server
每个包解释如下:
-
seq=1-3,TCP三次握手建立连接
-
seq=12,用