TCP / IP套接字是Atomic吗?

时间:2017-04-13 21:22:55

标签: sockets tcp network-programming

据我了解,如果写入的数据量很小,对TCP / IP套接字的写入将是原子的。原子,我的意思是接收器将接收所有数据或没有数据。但是,如果写入的数据量很大,则不是原子的。我对么?如果是这样,那么重要吗?

谢谢, 鲍勃

2 个答案:

答案 0 :(得分:2)

没有。 TCP是字节流协议。没有消息,没有类似数据报的行为。

答案 1 :(得分:1)

对于UDP,这是事实,因为应用程序写入的所有数据都是在一个UDP数据报中发送的。

对于TCP,这不是真的,除非应用程序一次只发送1个字节的数据。写入TCP套接字会将所有数据写入与该套接字关联的缓冲区。然后TCP将在后台从该缓冲区读取数据并将其发送到接收器。 TCP在一个TCP段中实际发送的数据量取决于其流量控制机制的变量以及其他因素,包括:

  • 接收由其他节点(接收方)发布的窗口
  • 尚未确认的先前航段中发送的数据量
  • 慢启动和拥塞避免算法状态
  • 协商的最大段大小(MSS)

在TCP中,您永远不能假设应用程序写入套接字的内容实际上是由接收方读取的。套接字缓冲区中的数据可以在一个或多个TCP段中发送给接收方。在数据可用的任何时刻,接收器都可以执行套接字读取并返回当时实际可用的任何数据。

当然,所有发送的数据最终都会到达接收方,如果中间没有故障阻止,并且接收方没有关闭连接或在数据到达之前停止读取。