sockets - TCP 中的 send() 函数是否保证按顺序到达?

标签 sockets tcp network-programming

众所周知,send()的返回值可以小于length,表示到达的是消息的一部分,而不是全部。我应该发送2个数据包,内容分别为“ABC”和“DEF”,长度为3。我想在调用send()传输“ABC”后通过send()发送“DEF”。但是,有一种情况是“ABC”的 send() 的返回值小于它的长度 3。我认为消息可能没有按顺序传递。例如,如果“ABC”的返回值为 2,则接收到的消息为“ABDEF”。

TCP 中的 send() 函数是否保证按顺序到达?

最佳答案

首先,send() 本身不保证任何东西,send() 只是将您要通过网络发送的数据写入套接字的缓冲区。它由操作系统分段(放置在 TCP 段中),操作系统管理传输的可靠性。如果底层缓冲区已满,那么您将获得一个低于您要写入的字节数的返回值。这通常表明缓冲区没有被操作系统足够快地清空,即您将数据写入缓冲区的速率高于将数据发送到网络(或由另一方读取)的速率).

其次,TCP 是一种流协议(protocol),如果您先发送 ()“ABC”,然后发送“DEF”,则无法保证数据将如何分段,它可能会以一个数据包或六个数据包结束。就像将数据写入文件一样。

第三,网络堆栈(操作系统中的 TCP/IP 实现)保证按顺序交付,以及 TCP promise 的其他好处 - 可靠性、拥塞控制、流量控制等。

关于sockets - TCP 中的 send() 函数是否保证按顺序到达?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25405821/

相关文章:

c - 为什么我不能在 Ubuntu 中创建原始套接字?

node.js - 使用 unix 套接字连接 docker websocket

java - Netty4 - TCP 服务器 - 使用 Camel 进行基本测试

用于与 IoT 设备通信的 Java TCP 服务器

java - 在 2 个线程唤醒之前,JFrame 不会显示组件

c - MSG_PEEK 套接字读取/接收时的错误行为

c - 最好有一个长的或多个短的 UDP 套接字?

java - 如何在使用socket时在android studio中搜索网络?

c# - Message Queue 服务不可用

java - 如何检查用户意外终止连接