众所周知,send()的返回值可能小于length,这意味着消息的一部分而不是整个消息已经到达。我应该发送2个内容分别为“ABC”和“DEF”的数据包,它们的长度为3.我想在send()被调用以传输“ABC”之后通过send()发送“DEF”。但是,有一种情况是“ABC”的send()的返回值小于其长度,3。我认为有可能无法按顺序传递消息。例如,如果“ABC”的返回值为2,则收到的消息为“ABDEF”。
TCP中的send()函数是否保证按顺序到达?
答案 0 :(得分:3)
首先,send()本身不保证任何东西,send()只将你想通过网络发送的数据写入套接字的缓冲区。它由操作系统分段(放置在TCP段中),管理传输的可靠性。如果底层缓冲区已满,那么您将获得一个低于您想要写入的字节数的返回值。这通常表示操作系统没有快速清空缓冲区,即将数据写入缓冲区的速率高于数据发送到网络的速率(或由另一方读取的速率) )。
其次,TCP是一种流协议,如果你发送()“ABC”然后发送“DEF”,则不能保证数据如何被分段,它可能最终在一个数据包或六个数据包中。就像把数据写入文件一样。
第三,网络堆栈(OS中的TCP / IP实现)保证了按顺序交付,以及TCP承诺的其他好处 - 可靠性,拥塞控制,流量控制等。