使用TCP / IP协议时,给定客户端和服务器之间的连接,客户端发送到服务器的数据包始终按照发送顺序接收吗?
例如,如果客户端发送3个数据包A,B和C,服务器是否总是先接收A,然后是B和C,还是可能先接收C,然后是A和B?
使用TCP / IP协议时,给定客户端和服务器之间的连接,客户端发送到服务器的数据包始终按照发送顺序接收吗?
例如,如果客户端发送3个数据包A,B和C,服务器是否总是先接收A,然后是B和C,还是可能先接收C,然后是A和B?
在IP层面上,数据包可以以任何顺序到达(如果它们到达的话)。在TCP层面上,数据流被保证在两端以相同的顺序排列。
这意味着是的,在使用TCP时,服务器将始终按照A、B、C的顺序接收数据。
http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Data_transfer
在通过TCP套接字接收数据时,应用程序端不可能接收到不同顺序的数据。
但是,在操作系统的网络层中,数据包可能以不同的顺序接收,但TCP要求上层按顺序获取数据。操作系统的角色是再次请求未接收的碎片等,并组装这些碎片。所以,你不必担心。
另一方面,UDP没有这样的保证。
服务器(作为机器的物理NIC)可能以任何顺序接收它们。您的操作系统可能再次以任何顺序接收它们 - 这通常(但并非总是)是物理接收顺序。您的客户端应用程序保证按正确顺序接收它们,这是TCP的一个属性。
一般来说,数据包将按照发送顺序接收。但是网络可能会丢失或重新排序数据包。例如,数据包可能采用不同的路由并以不同的顺序到达。数据包可能在网络上丢失甚至重复。TCP实现负责重传丢失的数据包,确认接收到的数据包,忽略重复的数据包,所有这些都旨在准确地在接收方重建传输的字节流。
在应用程序级别,您发送一系列字节并接收一系列字节。 TCP将执行必要的操作,以确保接收到的字节流与发送的字节流相同,无论数据包在网络上发生了什么。