TCP最初设计用于支持端到端连接,即主机与主机之间的直接通信。虽然其间存在网桥和路由器,但这些设备不会触及TCP头部或有效负载。然而如今情况已然不同。 如今我们面临着网络地址转换器、防火墙、入侵防御系统和网络加速器等设备。这些设备可能修改TCP头部、发送确认或重置报文,甚至直接丢弃数据包。更糟糕的是,这些设备不仅分布在网络两端,有时还会出现在网络中间节点。
设想网络B上的主机A与网络Z上的主机Y存在连接。在网络B前方部署的广域网加速器通过伪造主机Y的确认应答来提升吞吐量,使主机A能以最大速率发送数据。该加速器将负责所有缓冲与重传操作。 然而,网络Z前端的入侵防御系统正丢弃来自主机A的无害但可疑数据包。主机Y无法接收该数据包,自然不会发送确认。网络B前端的广域网加速器尝试重传,但数据包再次被丢弃。最终加速器超时,向主机A和主机Y发送重置信号。
当用户投诉后,主机A的系统管理员试图排查问题时会看到什么?他会发现数据包从主机A发出后得到主机Y的确认,但主机Y未返回应用层响应,随后主机Y重置了连接——没有任何迹象表明存在问题或解释主机Y重置连接的原因。 主机Y的系统管理员又会看到什么?她会发现主机A突然停止发送数据包,随后发送了重置请求——同样没有任何迹象表明存在问题,也无法解释主机A为何重置连接。
认为主机A与主机Y直接通信的假设是错误的,这种假设导致每位管理员都将连接失败归咎于对方系统。
为了解明事态,您需要关注IP报文头追踪数据中那些看似"无足轻重"的字段值,例如"服务类型"、"标识符"、"标志位"以及"生存时间"(TTL)等字段。 这些字段的变化(例如:含数据的报文TTL为47,而无数据的报文TTL为127)能表明报文源自两个不同来源。
同时比较主机A和主机Y的跟踪记录能直指问题核心。不仅能发现单一记录中存在而另一记录缺失的数据包,所有无关紧要的IP头字段、TCP端口或序列号的变动,都将百分之百地表明这些主机并未直接通信。
可能无法关闭网络加速器或入侵防御系统(而且这样做可能也不明智),但了解它们的存在及其运作方式,能让你在问题发生时更有机会理解并解决问题。
