我正在筛选一些网络跟踪并在我自己的机器上注意到,当我通过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或其他数据包上:应用程序还是操作系统?
答案 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的方式。