TCP的设计是为了支持端到端的连接,也就是一台主机与另一台主机直接通信。当然,中间有网桥和路由器,但这些设备并不接触TCP头和有效载荷。然而,现在的情况已经不是这样了。现在我们有了网络地址翻译器、防火墙、入侵防御系统和网络加速器等东西。所有这些东西可能会修改TCP头,发送确认或重置,或者只是将数据包丢进位桶。更糟糕的是,这些设备在网络的两端,有时也在中间。
想象一下,网络B上的主机A与网络Z上的主机Y连接的情况,在网络B的前面有一个WAN加速器,它通过欺骗主机Y的确认来增加吞吐量,这使得主机A可以以最快的速度发送数据。加速器会负责所有的缓冲和重传。不幸的是,网络Z前面的入侵防御系统正在从主机A中丢弃一个无辜但看起来可疑的数据包,主机Y永远不会看到它,所以不承认它。网络B前面的WAN加速器重新发送,但当然数据包又被丢掉了。加速器最终会超时,并向主机A和主机Y发送复位。
当主机A的系统管理员试图弄清楚用户投诉后发生了什么?他看到数据包离开主机A得到主机Y的确认,但主机Y没有应用层的响应,然后主机Y重置了连接,没有任何迹象表明有什么问题,也没有说明主机Y为什么重置连接。Y主机的系统管理员看到了什么?她看到主机A刚刚停止发送数据包,然后发送了一个复位,同样没有任何迹象表明有任何问题,也没有任何迹象表明主机A为什么要复位连接。
主机A与主机Y直接通信的假设是错误的,做出这样的假设会导致每个管理员将连接失败的原因归咎于其他系统。
为了弄清楚发生了什么,你需要注意IP头跟踪数据中"无趣"字段的值,这些字段包括"服务类型"、ID、Flags和"生存时间"(TTL)。这些字段的变化,例如有数据的数据包的TTL为47,无数据的数据包的TTL为127,可以告诉你数据包来自两个不同的来源。
比较来自主机A和主机Y的跟踪,可以发现问题的症结所在。你不仅可以在一个跟踪中看到另一个跟踪中没有的数据包,而且所有这些无趣的IP头字段或TCP端口或序列号的变化将100%地确定这些主机之间没有直接通信。
可能无法关闭网络加速器或入侵防御系统(这可能也不是一个好主意),但知道它们在那里,知道它们在做什么,就能在问题发生时更好地理解和纠正。