TCP 碎片 - 未读字节

TCP fragmentation - unread bytes

this SO 问题略有不同。

假设接收方希望数据包最多为 100 字节。 假设在时间 X 缓冲区中实际上有 100 个字节可用,但由于某些原因,接收方只确定它需要读取其中的 75 个字节。

数据不是从套接字读取会发生什么情况?

示例:
使用标志 MSG_PEEK(参见 here),接收方确定缓冲区中有 75 字节的完整有效回复。剩余的 25 个字节必须是下一个数据包的开始。 接收方选择从缓冲区中仅删除 75 个字节(即 ::recv(),没有 MSG_PEEK 标志),在缓冲区中留下 25 个字节 unread/unmoved。

there are actually 100 bytes available in the buffer, but for reasons the receiver only determines it needs to read 75 of those.

我猜receiver指的是从TCP套接字读取的应用程序。剩下的 25 个字节只是留在套接字缓冲区中,以便稍后读取。如果在此之前关闭套接字,则数据将丢失。

使用 MSG_PEEK 标志,读取的数据根本不会从缓冲区中删除,因此读取后它仍然包含所有 100 个字节。

从应用程序级别,您从 TCP 套接字接收连续的数据流。数据是否以及如何被分段甚至分段以进行传输并不重要,并且对应用程序不可见。您可以读取任何大小的块中的数据,而不管源应用程序如何写入它。

Say the receiver expects packets to be at most 100 bytes.

如果您尝试参考 TCP 的最大段大小 (MSS),则 IPv4 的最小 最大传输单元 (MTU)是576字节,所以最小MSS是536字节。