套接字(流)与套接字(数据报)之间有什么区别?为什么要一个使用另一个?

最佳答案

很久以前,我读了一个很好的类比来解释两者之间的区别。我不记得我在哪里读过它,不幸的是我不能相信作者的想法,但是无论如何,我还是在核心类比中增加了很多我自己的知识。因此,这里去:

流套接字就像一个电话-一侧发出调用,另一侧接听,您彼此打个招呼(TCP中的SYN/ACK),然后交换信息。完成后,您就说再见(TCP中的FIN/ACK)。如果一方听不到再见,他们通常会回拨另一方,因为这是意外事件。通常,客户端将重新连接到服务器。可以保证数据不会以与发送时不同的顺序到达,并且可以合理地保证数据不会被损坏。

数据报套接字就像在类中传递注释一样。考虑以下情况:您不是直接在将笔记传递给的人旁边;而是在您旁边。便笺将因人而异。它可能无法到达目的地,并且可能会在到达目的地时进行修改。如果您将两个便笺传递给同一个人,则它们可能会以您不希望的顺序到达,因为这些便笺通过教室的路线可能不相同,一个人可能不会像另一个人那样快地传递便笺,依此类推。 。

因此,在按顺序获取信息时,请使用流套接字,而完整无缺是很重要的。文件传输协议(protocol)是一个很好的例子。您不希望下载某些文件,其内容会随机随机播放并已损坏!

如果订单不如及时交付重要(请考虑使用VoIP或游戏协议(protocol)),而又不想增加流的开销(这就是DNS主要是数据报协议(protocol)的原因,以便服务器可以使用),则可以使用数据报套接字。迅速地立即响应许多请求),或者当您不太在乎数据是否到达目的地时。

为了扩展VoIP/游戏案例,此类协议(protocol)包括其自己的数据排序机制。但是,如果一个数据包损坏或丢失,您就不想等待流协议(protocol)(通常是TCP)发出重新发送请求-您需要快速恢复。 TCP可能需要花费几分钟才能恢复,对于游戏或VoIP这样的实时协议(protocol),甚至三秒钟也可能是无法接受的!使用像UDP这样的数据报协议(protocol),使软件可以非常快速地从此类事件中恢复,方法是简单地忽略丢失的数据或比TCP更快地重新请求。

VoIP是简单地忽略丢失数据的理想选择-一方只会听到一小段差距,类似于在接收不良的手机上与某人通话时所发生的情况。游戏协议(protocol)通常会稍微复杂一些,但是采取的措施通常是忽略丢失的数据(如果随后接收的数据取代丢失的数据),重新请求丢失的数据或请求完整的状态更新确保客户端的状态与服务器的状态同步。

10-04 10:46
查看更多