当在客户端采取wireshark跟踪时,它似乎是:
---SYN---> <-SYN-ACK- ---ACK---> -HTTPGET->
但是,当在服务器端采用相同stream量的wireshark跟踪时,它似乎是:
---SYN---> <-SYN-ACK- -HTTPGET->
其中HTTPGET分组看起来是SYN-ACK的ACK,因为它具有与先前的ACK分组相同的序列和ACK编号。
同样的事情稍后会以相反的方式发生:
当在服务器端采取wireshark跟踪时,它似乎是:
-HTTPGET-> <---ACK--- <-200-OK--
但wirehark跟踪采取相同的客户端的stream量,似乎是:
-HTTPGET-> <-200-OK--
在200OK似乎是HTTPGET的ACK,因为它具有与先前的ACK分组相同的序列和确认号码。
所以我的问题是有没有已知的networking元素,作为一个中间人做TCP捎带?
我相信这会给两个同行带来一些问题,因为他们似乎永远在等待“缺失”的ACK:例如:
*在服务器端200OK重复ACK,因为它正在等待TCP三次握手中的第三个ACK(已经被捎带到随后的HTTPGET中)。
*在客户端重新传输HTTPGET,因为原来的无捎带的ACK永远不会到达。
这里是示例痕迹: http : //goo.gl/7V0pah
看了很多传输过程中发生的变化,我终于发现了一个能够合理解释为什么客户端正在考虑来自服务器的数据包乱序的问题。
查看时间戳选项,特别是查看从服务器到客户端的数据包的时间戳值字段。 从服务器来看,这些数据源始于从SYN-ACK中的7236650到最后一个数据包中的7246570。
但是,在客户端收到时,SYN-ACK数据包中的时间戳值已被修改为值1068916716.其余数据包从服务器发送到客户端,而不修改时间戳记值。
所以从客户的angular度来看,时间戳从1068916716到7236708.换句话说,它正在倒退,这当然是客户考虑数据包失序的一个合理的原因。
所以,你有我的猜测是你的问题的根本原因是SYN-ACK中的时间戳被破坏。
在达到这个猜测之前,我从包迹线上观察了很多其他有趣的事实。 虽然这些其他数据点并不能解释你的问题,但它们可能仍然是相关的数据点供进一步调查。 我使用Wireshark来检查数据包捕获,但是任何可以解码所有TCP头的工具都可以。
0x5b1f开始,并从该值开始递增,直到到达最后一个数据包的0x51d3 。 但是,在接收端,第一个数据包在到达时具有不同的IPID。 它是0xd5f5 。 我还注意到ID为0x51c2的数据包被延迟,并在ID为0x51c4的数据包之后到达。 0x2770从SYN-ACK数据包上的0x0000开始,然后从第二个数据包上的0x2770到最后的0x2770 。 0x2766的数据包丢失了。 剩下的ID按顺序到达客户端。 0x2767的数据包)时,客户端用初始SYN-ACK的序列号的SYN-ACK而不是刚收到的数据包进行响应。 它忽略了它所得到的ACK并不断重发请求。 换句话说,客户端的行为就好像刚收到一个无序的数据包。 如果客户端只是因为服务器向客户端丢失了ACK而这样做,那么显然这是客户端TCP堆栈中的一个错误。 我怀疑这个数据包有什么问题。 此数据包在从服务器到客户端的传输中广告的窗口大小增加了。 然而,由于窗户几乎没有满,这不太可能成为问题。 在ICMP错误信息中发现时,涉及的中间件没有办法调整所有的更改。 因此,我相信在发送数据包之前有select地减lessTTL可以用来识别沿途的哪个路由器正在encryption数据包。 (除非提供商决定放弃所有相关的ICMP数据包,否则您将无法debugging问题,如果是这种情况,则应该查找其他提供商。)