网络编程中的流和数据报之间有什么区别?


Answers:


304

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

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

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

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

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

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

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


3
简而言之,包括SYNACK的细节。
LazerSharks

2
这个示例或一个非常相似的示例来自Linux编程接口。2010年版在1155和1159页上包含这些示例。–
Josh

30

流套接字:

  • 服务器和客户端之间的专用和端到端通道。
  • 使用TCP协议进行数据传输。
  • 可靠无损。
  • 以相似的顺序发送/接收数据。
  • 恢复丢失/错误数据的时间很长

数据报套接字:

  • 服务器与客户端之间没有专用的端对端通道。
  • 使用UDP进行数据传输。
  • 并非100%可靠,并且可能会丢失数据。
  • 数据发送/接收顺序可能不同。
  • 不在乎或快速恢复丢失/错误的数据。

数据发送的顺序是否相同(不仅仅是“相似”)?即。将数据包排序机制构建到流套接字中没有意义
Matthew D. Scholefield,

流通信中的数据包以“相似”的顺序发送和接收,这意味着不能保证将数据包本身按顺序传送到接收主机,但是TCP会找出差异,在数据包到达时重新排列并请求任何内容似乎一路迷路了。
亚历杭德罗·布拉斯科

这就说得通了。也许只是将其区别开来然后放到下面(因为如果我正确理解的话,当仅指数据包的发送顺序时,在两种情况下,数据发送/接收的顺序可能都不会相同)。
马修·斯科尔菲尔德

@Rick更准确地说,套接字被称为端到端点,因为传输协议负责将消息传递到一个或多个网络端点。
亚历杭德罗·布拉斯科

0

如果是网络编程,我认为从套接字开始将是一个不错的开始。
socket = ip + port
三种类型的套接字
流(TCP,顺序和传递得到保证,无重复,无长度或字符边界的数据,面向连接,可靠,并发)
数据报(UDP,基于数据包,无连接,数据报)大小限制,数据可能丢失或重复,无法保证顺序,不可靠)
原始(直接访问较低层协议IP,ICMP)
对于哪种套接字必须使用哪种传输协议,我没有看到任何严格的传输协议类型规则并且可靠性不应被误认为是因为在两端都处于活动状态的情况下UDP是可以实现的。
可靠性更像是传递的可靠性,因为通过使用TCP作为传输协议进行序列号检查(这在UDP中不存在)是更好的选择。最好使用Wireshark tcpdump等网络协议分析器来查看软件的功能。验证或将理论与实际操作结合到纸上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.