我有一个应用程序正在从套接字读取 TCP 数据。发送设备正在向另一端的服务器套接字发送完整的 1400 字节数据。在此过程中,数据包被分段/分割成 1024 字节段和 376 字节段。为了在我的应用程序端正确接收数据,我必须读取套接字两次并在应用程序级别组装数据包,这可能会在大量流量的情况下出现问题。
从我读到的所有内容来看,TCP 段的重新组装是在 IP 层上处理的。我正在运行 Windows Server 2012,我的应用程序正在使用 Winsock。有没有办法配置操作系统以重新组装这些数据包,因为它们在该层的端口上被接收?
答案1
TCP 是一种流式协议,而不是消息协议。操作系统中的 TCP 堆栈确保数据以正确的顺序转发到应用程序,并且不会丢失数据,也不会出现数据重复。它不关心保持任何数据包边界,因为正如我所说,TCP 是一种流式协议。此外,发送方可以自由地将单个写入拆分为多个数据包或将多个写入合并为单个数据包。它将进行拆分以使数据包大小适应 MTU/PMTU,以避免在传送过程中出现数据包碎片,并进行合并以减少传送开销。
因此,应用程序永远不应该依赖于隐式消息边界,因为发送应用程序已经写入了数据,而应该使用显式(应用程序级)消息边界。
有没有办法配置操作系统,使其在该层的端口上接收到这些数据包时重新组装它们?
不可以,你必须在申请中妥善处理。