【发布时间】:2015-04-02 02:21:57
【问题描述】:
我创建了某种类型的客户端/服务器应用程序,它有自己的数据 ACK 系统。由于一些限制,它最初是用 TCP 编写的,但基础是考虑 UDP 编写的。
我发送到服务器的数据包有自己的封装(数据包 ID 和数据包大小标头。我知道 UDP 也有校验和,所以我没有为此添加标头),但我知道 TCP 是如何工作的服务器可能不会收到整个数据包,所以我收集并缓冲接收到的数据,直到收到完整的有效数据包。
现在我有机会将我的客户端/服务器程序更改为 UDP,并且我知道与 TCP 的一个区别是接收数据的顺序与发送的顺序不同(这就是我添加数据包 ID 标头的原因)。
我想知道的是:如果我发送多个数据包,是否会在没有保证顺序但保证封装的情况下接收它们?我的意思是,如果我稍后发送一个大小为 1000 字节的数据包和另一个大小为 400 字节的数据包,服务器会收到 2 个数据包,一个是 1000 字节,另一个是 400 字节,还是有机会收到 200 个那 1000 个字节,然后是 1000 个字节中的 400 个字节,然后是 TCP 那样的其余字节?
【问题讨论】:
-
你真的不应该用“数据包”这个词来指代这么多不同的东西。可以在任意数量的数据包中发送的协议数据单元应称为“消息”。
-
嗯,我在应用层称它们为数据包,而且,正如我在任何地方(包括 wiki)所阅读的那样,人们在这一层谈论它们时就是这样理解它们的。我看到他们在谈论消息时也谈论传输层并且必须区分消息和数据包。
-
计算机科学对数据包的定义是“在 Internet 或任何其他数据包交换网络上的起点和终点之间路由的数据单元。”确实,这个词有时被用来表示其他东西,但是当你谈论涉及实际数据包的系统时,使用同一个词来表示两个完全不同的东西会引起混淆。
标签: sockets tcp udp difference