【问题标题】:TCP ACK of packets in wiresharkWireshark中数据包的TCP ACK
【发布时间】:2017-10-02 09:05:45
【问题描述】:

我在 Wireshark 中注意到我能够向 HTTP 网络服务器发送 4096 字节的数据(通过上传文件),但是服务器似乎一次只能确认 1460 字节的数据。为什么会这样?

【问题讨论】:

    标签: http tcp wireshark tcp-ip


    【解决方案1】:

    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"

    【讨论】:

    • 有道理。所以这基本上意味着在接收方,由于 MTU,该特定段将被分成 3 个较小的数据包,有效数据长度为 1460?
    • 对。发送方实际发送的以太网帧大小为 1500 字节(1518 字节,如果您计算成帧字节本身),有效 TCP 有效负载为每帧 1460 字节。这就是服务器接收的内容。另见:en.wikipedia.org/wiki/Ethernet_frame#Structure
    【解决方案2】:

    TCP 默认使用路径 MTU 发现:

    • 当系统向网络发送数据包时,它在 IP 标头中设置了不分段标志 (DF)
    • 当 IP 路由器或您的本地计算机看到应该分段以匹配下一跳链路的 MTU 的 DF 数据包时,它会发送包含新 MTU 的反馈(需要 RTCP 分段)
    • 当系统收到所需的 ICMP 碎片时,它会调整 MSS 并再次发送数据。

    执行此过程是为了减少网络上的整体负载并增加每个数据包传递的概率。

    这就是您看到 1460 个数据包的原因。

    关于您的问题:服务器似乎一次只确认 1460 个字节的数据。为什么会这样?

    TCP 跟踪窗口定义了“你可以在没有确认的情况下发送多少字节的数据”。其目的是提供流量控制机制(发送方不能发送太多无法处理的数据)和拥塞控制机制(发送方不能发送太多数据使网络过载)。窗口由接收方定义,在连接过程中 TCP 将估计实际信道带宽时可能会增加。因此,您可能会看到一个确认多个数据包的 ACK。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2016-04-19
      • 2017-10-12
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多