当recv返回?

时间:2014-05-05 12:04:09

标签: windows tcp recv

我正在通过TCP协议从Windows套接字接收数据。为此我正在使用阻止recv()

我的问题是:当操作系统(OS)允许读取tcp缓冲区时 (从tcp的角度来看)?在操作系统发送ACK收到的数据后会发生吗?

2 个答案:

答案 0 :(得分:1)

出于所有实际目的,您应该将TCP接收视为由两个独立过程组成:

  • 操作系统接收TCP数据并将其确认给另一方,将其存储在您的进程无法访问的内部内核缓冲区中
  • 当您recv或任何等效的系统调用时,操作系统将数据从其内部缓冲区复制到用户空间缓冲区

一旦TCP接收到窗口中的数据并通过校验和和所有数据,另一方就无法撤销它。这意味着如果它在您读取数据之前或之后发送ACK并不重要。此外,操作系统可能需要再次确认(例如,如果ACK丢失)。因此,确认数据的时间与从套接字读取无关(然而,广告窗口确实如此)。

这样做的结果是你做recv对连接没有影响。您可以将recv视为从套接字缓冲区到应用程序缓冲区的花哨memcpy

答案 1 :(得分:0)

您可以在应用程序中随时致电recv。如果套接字阻塞,则在TCP内部接收缓冲区中存在某些数据之前,recv将不会返回。

如果对等体发送一些数据,TCP栈应负责发送ACK。现在调用recv会导致数据从TCP堆栈缓冲区复制到传输到' recv`的缓冲区。

正如@cnicutar在另一个答案中指出的那样,即使你没有打电话给recv,TCP也会发送ACK以保持连接正常。应用程序可以调用recv,将数据放入缓冲区,从而导致TCP缓冲区被刷新。另一个recv不会给你相同的数据。