TCP/IP协议和分段

3

使用TCP / IP协议时,给定客户端和服务器之间的连接,客户端发送到服务器的数据包始终按照发送顺序接收吗?

例如,如果客户端发送3个数据包A,B和C,服务器是否总是先接收A,然后是B和C,还是可能先接收C,然后是A和B?


a TCP/IP协议”?上次我检查,只有一个这样的协议……它被称为TCP/IP。 - Kerrek SB
6个回答

5

在IP层面上,数据包可以以任何顺序到达(如果它们到达的话)。在TCP层面上,数据流被保证在两端以相同的顺序排列。

这意味着是的,在使用TCP时,服务器将始终按照A、B、C的顺序接收数据


3
TCP是一种传输协议,它通过在底层IP网络上以IP数据包形式发送数据来传输数据。TCP负责确保数据的正确传输,包括对到达的数据包进行排序、重新请求丢失的数据包和丢弃重复的数据包。
TCP本身不向用户公开任何“数据包”的概念;将数据分块为IP数据包的事实是“基于IP”的实现细节。一个不同的实现,例如TCP-over-bicycle-courier,可能采用完全不同的方案。

3

2
数据包在网络传输过程中可能会被重新排序。TCP或任何基于IP协议的协议都有可能接收到乱序的数据包。 - David Schwartz
@David:这可能是事实,但就应用层而言并非如此。他不是在编写TCP/IP协议栈,而是一个应用程序。我已经在答案中添加了这个澄清。谢谢。 - Lior Cohen
2
如果你的答案应该在应用层,那么它既不连贯又具有误导性。这是因为在应用层没有数据包。这是具有误导性的,因为它暗示了应用层字节流和数据包边界之间存在一种对应关系,而实际上并不存在这种混淆可能会导致使用TCP的应用程序中出现更多的错误。 - David Schwartz
@DavidSchwartz:当然,在应用层没有数据包,但就应用程序开发人员而言,他们保证A端发送的数据总是以相同的顺序被B端接收。考虑到这一点,我们是否对使用TCP的应用程序中的错误有些过于夸张了?如果您对此感到非常强烈,我可以删除答案,除非您想提供更正意见。 - Lior Cohen
1
我纠正了答案。我认为我没有过度夸张,因为一个编写应用程序但询问数据包排序的人可能并不清楚TCP字节流与携带该数据的数据包之间的关系。这是使用TCP的应用程序中最常见的错误来源。 - David Schwartz
我的关注点是关于在服务器的一侧三次调用套接字函数send()。我所说的“packet”指的是这个。但我感谢你们所有人的纠正和澄清。 - Claudio Ferraro

2

在通过TCP套接字接收数据时,应用程序端不可能接收到不同顺序的数据。

但是,在操作系统的网络层中,数据包可能以不同的顺序接收,但TCP要求上层按顺序获取数据。操作系统的角色是再次请求未接收的碎片等,并组装这些碎片。所以,你不必担心。

另一方面,UDP没有这样的保证。


0

服务器(作为机器的物理NIC)可能以任何顺序接收它们。您的操作系统可能再次以任何顺序接收它们 - 这通常(但并非总是)是物理接收顺序。您的客户端应用程序保证按正确顺序接收它们,这是TCP的一个属性。


0

一般来说,数据包将按照发送顺序接收。但是网络可能会丢失或重新排序数据包。例如,数据包可能采用不同的路由并以不同的顺序到达。数据包可能在网络上丢失甚至重复。TCP实现负责重传丢失的数据包,确认接收到的数据包,忽略重复的数据包,所有这些都旨在准确地在接收方重建传输的字节流。

在应用程序级别,您发送一系列字节并接收一系列字节。 TCP将执行必要的操作,以确保接收到的字节流与发送的字节流相同,无论数据包在网络上发生了什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接