我正在通过TCP协议从Windows套接字接收数据。为此我正在使用阻止recv()
。
我的问题是:当操作系统(OS)允许读取tcp缓冲区时
(从tcp的角度来看)?在操作系统发送ACK
收到的数据后会发生吗?
答案 0 :(得分:1)
出于所有实际目的,您应该将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
不会给你相同的数据。