gpt4 book ai didi

c - TCP/UDP 和以太网 MTU 分段

转载 作者:可可西里 更新时间:2023-11-01 02:33:35 25 4
gpt4 key购买 nike

我已经阅读了各种在线网站和教程,但我仍然感到困惑。如果消息大于 IP MTU,则 send() 返回发送的字节。消息的其余部分会怎样?我是否要再次调用 send() 并尝试发送消息的其余部分?还是 IP 层应该自动处理某些事情?

最佳答案

如果您使用的是 TCP,那么呈现给您的接口(interface)就是字节流接口(interface)。您无需担心字节流如何从连接的一端到达另一端。你可以忽略IP层的MTU。事实上,您可以完全忽略 IP 层。

当您调用 send() 时,您机器上的 TCP 堆栈将处理您插入发送调用的字节流所需的所有细节,以便从 recv( ) 在连接的另一端调用。

要记住的一件事是,对于 TCP,您正在处理一个流,这意味着一个 send() 可能导致数据到达多个 recv()调用和多个 send() 调用可能导致数据到达单个 recv() 调用。你无法控制这个。您正在处理一个字节流,每次调用 recv() 都可以返回从 1 到当前未完成数量的任意字节数(允许足够的缓冲区传递给 recv()调用)。

因为评论者要求它 ;)

在大多数 TCP 堆栈上,send() 很可能无法发送所有内容,因为 TCP 堆栈的缓冲区已满并且(可能)TCP 窗口也已满并且流量控制正在运行,这意味着在远程端确认一些数据之前,堆栈无法发送更多数据,并且它不准备代表您再进行缓冲。我还没有遇到过仅出于 MTU 考虑就会拒绝 send() 的 TCP 堆栈,但我想一些精简的嵌入式系统可能会那样做......

无论如何,如果 send() 返回的字节数少于您提供的字节数,那么您应该在某个时候重新发送剩余的数据。通常 send() 会阻塞并等待它可以发送所有数据,如果您已将套接字设置为非阻塞模式,那么您可能不想在失败时立即重试发送发送所有内容,因为您可能会陷入困境...

更具体地说明您正在使用的操作系统可能对您有用。

关于c - TCP/UDP 和以太网 MTU 分段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2407435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com