TCP/UDP和以太网MTU碎片

Fan*_*ier 3 c tcp fragmentation send mtu

我在线阅读了各种网站和教程,但我仍感到困惑.如果消息大于IP MTU,则send()返回发送的字节.消息的其余部分会发生什么?我是否send()再次打电话并尝试发送其余信息?或者是IP层应该自动处理的东西?

Len*_*ate 6

如果您使用的是TCP,那么呈现给您的界面就是字节流.您无需担心字节流如何从连接的一端传递到另一端.您可以忽略IP层的MTU.实际上,您可以完全忽略IP层.

当您send()在计算机上调用TCP堆栈时,将处理您正在推送到发送调用的字节流所需的所有详细信息,以便从recv()连接另一端的调用中显示.

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

评论者提出要求;)

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

无论如何,如果send()返回的数量小于您提供的字节数,那么您应该在某个时刻重新发送剩余的数据.通常send()会阻塞并等待它可以发送所有数据,如果您已将套接字设置为非阻塞模式,那么您可能不希望立即重试发送,如果它无法发送所有内容,因为您可能最终紧紧的循环......

您可能更有兴趣了解您正在使用的操作系统.

  • +1,但是为了完成你还应该处理这个问题最感兴趣的内容:如果`send`返回的值小于要发送的请求字节(一个非常不可能的情况,因为栈将尝试处理如果必要,您有责任稍后尝试发送其余数据. (5认同)