Linux 中暂停的 TCP 进程到底做什么和不做什么?

Linux 中暂停的 TCP 进程到底做什么和不做什么?

关于使用 NetGui 的 TCP 连接(并使用 wireshark 进行分析):

我使用以下命令在两台 PC 之间建立 TCP 连接nc -p 11111 等等...用于服务器,以及用于客户端的相应端口,以便它们确实能够发送和读取(在 pc2(服务器)中)消息。

之后,我按下Ctrl Z在 pc2(服务器应暂停)中,并使用 pc1(客户端)发送一些消息。通过使用网络状态监测命令我能够看到缓冲区中等待的消息。在将服务器带回前台之前我停止了tcpdump在这两台电脑之间的路由器中捕获并意识到这些消息已经发送(如预期)但也已被服务器确认。

现在,如果服务器在消息离开缓冲区时(即在处理并移至另一层时)确认消息,这些消息是否真的被服务器从缓冲区“抓取”?如果是这样,那么暂停意味着什么?

但是,如果消息在处理之前被确认,那么 pc1 会不会认为这些消息已经被处理,因此缓冲区是空闲的,并继续发送消息直到窗口变为零值?如果是这样,以下公式的含义是什么?

rwnd = ReceiveBuffer - (LastByteReceived – LastByteReadByApplication)

我哪里错了?

答案1

当内核 TCP 堆栈从 NIC 驱动程序接收到 TCP 段时,内核中的 TCP 堆栈会确认这些段。因此,TCP 接收窗口代表内核中的缓冲区,如果目标进程从未读取内核中缓冲的传入数据,则接收窗口将被填满,发送方将停止发送。

然后,发送方将开始执行“零窗口探测”;也就是说,它将发送空的 TCP 段,只是为了让接收方 TCP 堆栈发回带有接收窗口更新的 Ack,以查看接收窗口中是否有空余空间,以便发送方可以再次开始发送。一旦目标进程最终读取内核为其缓冲的一些数据,发送方的下一个零窗口探测将导致带有接收窗口更新的 Ack,显示接收窗口中有空余空间,因此发送方将恢复发送带有有效载荷的 TCP 段。

相关内容