【发布时间】:2017-10-02 09:05:45
【问题描述】:
我在 Wireshark 中注意到我能够向 HTTP 网络服务器发送 4096 字节的数据(通过上传文件),但是服务器似乎一次只能确认 1460 字节的数据。为什么会这样?
【问题讨论】:
我在 Wireshark 中注意到我能够向 HTTP 网络服务器发送 4096 字节的数据(通过上传文件),但是服务器似乎一次只能确认 1460 字节的数据。为什么会这样?
【问题讨论】:
TCP 段的大小限制为 MSS(最大段大小),它基本上是 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"。
【讨论】:
TCP 默认使用路径 MTU 发现:
执行此过程是为了减少网络上的整体负载并增加每个数据包传递的概率。
这就是您看到 1460 个数据包的原因。
关于您的问题:服务器似乎一次只确认 1460 个字节的数据。为什么会这样?
TCP 跟踪窗口定义了“你可以在没有确认的情况下发送多少字节的数据”。其目的是提供流量控制机制(发送方不能发送太多无法处理的数据)和拥塞控制机制(发送方不能发送太多数据使网络过载)。窗口由接收方定义,在连接过程中 TCP 将估计实际信道带宽时可能会增加。因此,您可能会看到一个确认多个数据包的 ACK。
【讨论】: