时间:2011-10-28 23:42:11

标签: tcp

我正在筛选一些网络跟踪并在我自己的机器上注意到,当我通过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)

在高层次上,我想知道为什么差异 - 导致不同行为的原因是什么?什么控制应用程序响应是否放在请求ack或其他数据包上:应用程序还是操作系统?

1 个答案:

答案 0 :(得分:6)

此行为取决于操作系统和应用程序。在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的方式。