Sockets 数据在tcp套接字中停留的时间和位置

Sockets 数据在tcp套接字中停留的时间和位置,sockets,tcp,kernel,tcp-ip,Sockets,Tcp,Kernel,Tcp Ip,TCP发送方应用程序希望发送数据,所以它使用write()系统调用将数据写入套接字,然后write()返回。现在,内核和NIC驱动程序会根据tcp连接的属性(拥塞窗口和所有属性)在后台通过有线传输的数据量来实现socket-to-NIC 现在,在客户端返回成功的接收通知(TCP ACK)之前,这些数据是否一直保存在套接字中 我想知道数据被保留多长时间和位置,以便在tcp数据包丢失的情况下可以再次发送。tcp是一种可靠的传输方式。它自动处理重传。如果确实发生数据丢失,连接将被视为断开/丢失,并且您

TCP发送方应用程序希望发送数据,所以它使用write()系统调用将数据写入套接字,然后write()返回。现在,内核和NIC驱动程序会根据tcp连接的属性(拥塞窗口和所有属性)在后台通过有线传输的数据量来实现socket-to-NIC

现在,在客户端返回成功的接收通知(TCP ACK)之前,这些数据是否一直保存在套接字中


我想知道数据被保留多长时间和位置,以便在tcp数据包丢失的情况下可以再次发送。

tcp是一种可靠的传输方式。它自动处理重传。如果确实发生数据丢失,连接将被视为断开/丢失,并且您的代码将在后续套接字操作中开始接收错误代码,直到您关闭套接字为止。您不需要担心使用TCP(仅使用UDP)手动重新传输数据。一旦数据进入内核,它将为您处理其余的数据。是的,数据一直保存在内核中,直到对等方确认它,然后根据需要重新传输,直到套接字内部超时。

谢谢Remy。我在源代码中确认,我们将数据保存在套接字缓冲区中,直到得到ack,然后才释放已确认的数据。我确实理解“可靠”交付的tcp语义。我知道内核会处理数据。我只是想知道怎么做。我感兴趣的部分是了解应用程序写入套接字和离开以及套接字写入电线的异步本质。所以,举个例子,如果我想知道某个特定的数据块何时到达接收器,我现在不能从应用程序的角度来看。应用程序写入套接字并离开。丢失可能会导致重新传输。同样,您不需要在TCP中手动处理重新传输。您的代码一开始不应该试图跟踪该信息。一旦数据进入内核,假设它将被发送并继续。检测低级TCP确认的唯一方法是直接嗅探网络适配器,例如使用pcap库。在应用层,知道数据是否已到达接收器的唯一方法是接收器是否在协议层发回确认,您的应用程序必须从套接字读取确认并根据需要进行处理。