Answers:
很久以前,我读了一个很好的类比来解释两者之间的区别。我不记得我在哪里读过它,不幸的是我不能相信作者的想法,但是无论如何,我还是在核心类比中增加了很多我自己的知识。因此,这里去:
流套接字就像一个电话-一侧发出呼叫,另一侧应答,您彼此打个招呼(TCP中的SYN / ACK),然后交换信息。完成后,您说再见(TCP中的FIN / ACK)。如果一方听不到再见,他们通常会回拨另一方,因为这是意外事件。通常,客户端将重新连接到服务器。可以保证数据不会以与发送时不同的顺序到达,并且可以合理地保证数据不会被损坏。
数据报套接字就像在类中传递注释。考虑以下情况:您不是直接在将笔记发送给的人旁边;便笺将因人而异。它可能无法到达目的地,并且可能会在到达目的地时进行修改。如果您将两个便笺传递给同一个人,则它们可能会以您不希望的顺序到达,因为这些便笺通过教室的路径可能不相同,一个人可能不会像另一个人那样快地传递便笺,依此类推。 。
因此,在按顺序获取信息时,请使用流套接字,而完整无缺是很重要的。文件传输协议是一个很好的例子。您不希望下载某些文件,其内容会随机随机播放并损坏!
如果订单不如及时交付那么重要(请考虑使用VoIP或游戏协议),而又不想增加流的开销(这就是DNS主要是数据报协议的原因,以便服务器可以使用),则可以使用数据报套接字。很快地立即响应许多请求),或者当您不太在乎数据是否到达目的地时。
为了扩展VoIP /游戏情况,此类协议包括其自己的数据排序机制。但是,如果一个数据包损坏或丢失,您就不想等待流协议(通常是TCP)发出重新发送请求-您需要快速恢复。TCP可能需要花费几分钟才能恢复,对于游戏或VoIP之类的实时协议,甚至三秒钟也是无法接受的!使用像UDP这样的数据报协议,使软件可以非常快速地从此类事件中恢复,方法是简单地忽略丢失的数据或比TCP更快地重新请求它。
VoIP是简单地忽略丢失数据的理想选择-一方只会听到一小段间隙,类似于在接收不良的手机上与某人通话时所发生的情况。游戏协议通常会稍微复杂一些,但是采取的措施通常是忽略丢失的数据(如果随后接收到的数据取代丢失的数据),重新请求丢失的数据或请求完整的状态更新确保客户端的状态与服务器的状态同步。
流套接字:
数据报套接字:
如果是网络编程,我认为从套接字开始将是一个不错的开始。
socket = ip + port
三种类型的套接字
流(TCP,顺序和传递得到保证,无重复,无长度或字符边界的数据,面向连接,可靠,并发)
数据报(UDP,基于数据包,无连接,数据报)大小限制,数据可能丢失或重复,无法保证顺序,不可靠)
原始(直接访问较低层协议IP,ICMP)
对于哪种套接字必须使用哪种传输协议,我没有看到任何严格的传输协议类型规则并且可靠性不应被误认为是因为在两端都处于活动状态的情况下UDP是可以实现的。
可靠性更像是传递的可靠性,因为通过使用TCP作为传输协议进行序列号检查(这在UDP中不存在)是更好的选择。最好使用Wireshark tcpdump等网络协议分析器来查看软件的功能。验证或将理论与实际操作结合到纸上。