我已经注意到wireshark中,我能够发送4096字节的数据到HTTP网络服务器(从上传文件),但服务器似乎一次只能确认数据1460字节。为什么会这样?TCP ACK在wireshark中的数据包
1
A
回答
1
TCP段的大小限制为MSS(Maximum Segment Size,最大段大小),它基本上是MTU(最大传输单元)减去包含IP和TCP开销的字节。在典型的以太网链路上,MTU为1500字节,基本IP和TCP报头每个包含20个字节,因此MSS为1460(1500 - 20 - 20)。
如果你看到有4096个字节的长度字段指示数据包,那么它几乎肯定意味着你捕捉发射主机和Wireshark被递了大包之前它分成1460字节的块。如果您要在接收端捕获数据,您将看到单个1460字节的数据段到达,而不是一个大的4096字节数据包。
如需进一步阅读,我建议您阅读Jasper Bongertz的博客,标题为"The drawbacks of local packet captures"。
1
TCP默认使用路径MTU发现:
- 当系统发送数据包,将其设置不IP报头片标志(DF)
- 当IP路由器或者你的本地计算机看到DF网络数据包应与其下一跳链路的MTU匹配,以发送包含新MTU的反馈(RTCP分段需求)
- 当系统收到需要分段的ICMP时,它会调整MSS并再次发送数据。
执行此过程可降低网络的总体负载并提高每个数据包传输的可能性。
这就是为什么你看到1460包。
关于你的问题:服务器似乎一次只能确认数据1460字节。为什么会这样?
TCP保留跟踪窗口,定义“您可以发送多少字节的数据而无需确认”。其目的是提供流量控制机制(发送方不能发送太多无法处理的数据)和拥塞控制机制(发送方不能发送太多数据给超载网络)。窗口由接收端定义,并且在TCP估计实际信道带宽时连接期间可能会增加。所以你可能会看到一个确认几个数据包的ACK。
相关问题
- 1. Wireshark的TCP Dup的ACK - 奇怪
- 2. 如何避免在Wireshark中无序的TCP数据包
- 3. Wireshark无法将TCP数据包组装成RTMP数据包
- 4. 从wireshark数据包自定义TCP头/复制TCP头
- 5. 如何在Wireshark中为“特定数据包使用”Follow TCP stream“?
- 6. 筛选ACK数据包
- 7. Wireshark,seq和ack号码
- 8. 使用Wireshark的TCP数据包的RTT时序
- 9. 在Wireshark中计数数据包
- 10. 解剖XML通过TCP数据包Wireshark的
- 11. Ack-Push之后的TCP Ack-Fin
- 12. 如何使用Wireshark从TCP数据包中提取原始数据
- 13. nginx tcp SYN包没有收到ACK
- 14. 如何验证TCP数据包在JAVA中是否已收到ACK?
- 15. 延迟在FIN ACK TCP
- 16. AsynchronousSocketChannel.write确保TCP ACK?
- 17. 是否可以在TCP三次握手中获取SYN/ACK数据包的TCP序列号?
- 18. 解码ssl数据包wireshark
- 19. Wireshark包数据格式
- 20. 跟wireshark跟踪http数据包
- 21. Wireshark插件:在wireshark数据包解析器中获取总包大小
- 22. Wireshark-遵循TCP流
- 23. 如何在wireshark上过滤数据包
- 24. 如何阻止Windows从无法识别的SYN-ACK数据包重置TCP?
- 25. TCP重复ACK是否确认接收到正确的数据包?
- 26. Wireshark的数据包得到捆绑
- 27. 奇怪的Wireshark行为(单个数据包同时标记为TCP和UDP)
- 28. wireshark如何将某些数据包标记为“重组pdu的tcp段”
- 29. wireshark通过端口计数数据包
- 30. TCP RST数据包延迟数据包
有意义。所以这基本上意味着在接收端,由于MTU的原因,该特定段将被分割成3个更小的数据包,其有效数据长度为1460? –
没错。发送方实际上正在发送大小为1500字节(1518字节,如果您计算成帧字节本身)的以太网帧,并且每帧有效的TCP有效载荷为1460字节。这是服务器收到的。另见:https://en.wikipedia.org/wiki/Ethernet_frame#Structure –