【问题标题】:Data payload in a TCP ackTCP ack 中的数据负载
【发布时间】:2011-10-29 08:46:37
【问题描述】:

我正在筛选一些网络跟踪,并在我自己的机器上注意到,当我通过 HTTP 连接时,数据包看起来像:

client --> server: GET
server --> client: tcp ack
server --> client: HTTP response
client --> server: tcp ack

但是,我查看了几年前保存的一些 CIFS (SMB) 跟踪。我看到了类似的东西:

client --> server: Create Request 
server --> client: Create response (This packet also acks the request)

在高层次上,我想知道为什么会出现差异 - 是什么导致了不同的行为?是什么控制应用程序响应是放在请求确认还是另一个数据包上:应用程序还是操作系统?

【问题讨论】:

    标签: tcp


    【解决方案1】:

    此行为取决于操作系统和应用程序。在linux中,内核不直接发送ACK,而是等待固定的毫秒数(大约200毫秒),希望有一些数据要发送回来,可以让ACK捎带数据。

    如果计时器关闭,则立即发送 ACK。

    示例 1。

    Client sends the GET request.
    
    Server tries to create a http response, but before it does that 200ms are gone
    and it must send the ACK before the http response.
    

    示例 2。

    Client sends the GET request.
    
    Server creates a http response within the timer limit, and the ACK can piggyback
    the data.
    

    意思是,如果您的应用程序在生成该响应时变慢,则将发送 ACK 而不捎带数据。并且还取决于操作系统,延迟计时器可以更高/更低,并再次改变 ACK 的发送方式。

    【讨论】:

    • 可以在任何 TCP 初始化设置中指定延迟计时器吗?
    • 您可以使用 TCP_QUICKACK 选项和 IPPROTO_TCP 下的 setsockopt 将其关闭(顺便说一句不可移植)。但是更改值可能是不可能的,因为我相信它是硬编码的,除非有一个新添加的 sysctl (或类似的东西)。
    • 在我设置 TCP socket 选项禁用 TCP Quick ACK 后,我仍然没有得到组合数据包的回复:opt = 0; setsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (char *) &opt, sizeof(opt));
    • 你也可以使用 ip routes serverfault.com/a/952638/87556
    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 2019-07-16
    • 2017-10-12
    • 2011-05-17
    • 1970-01-01
    • 2011-04-28
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多