Sockets 什么';网络编程中流和数据报的区别是什么?

Sockets 什么';网络编程中流和数据报的区别是什么?,sockets,network-programming,datagram,Sockets,Network Programming,Datagram,套接字(流)和套接字(数据报)之间有什么区别?为什么要用一个而不是另一个 很久以前,我读过一个很好的比喻来解释两者之间的区别。我不记得我在哪里读到的,所以很不幸,我不能相信作者的想法,但无论如何,我也在核心类比中添加了很多我自己的知识。下面是: 流套接字就像一个电话——一边打电话,另一边接听,你们互相打招呼(TCP中的SYN/ACK),然后交换信息。一旦完成,就说再见(TCP中的FIN/ACK)。如果一方没有听到再见,他们通常会叫另一方回来,因为这是一个意外事件;通常,客户端将重新连接到服务器。

套接字(流)和套接字(数据报)之间有什么区别?为什么要用一个而不是另一个

很久以前,我读过一个很好的比喻来解释两者之间的区别。我不记得我在哪里读到的,所以很不幸,我不能相信作者的想法,但无论如何,我也在核心类比中添加了很多我自己的知识。下面是:

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

数据报套接字类似于在类中传递注释。考虑一下你不是直接挨着你递给笔记的人的情况;这张便条将在人与人之间传递。它可能无法到达目的地,并且在到达目的地时可能会被修改。如果你把两张笔记传给同一个人,它们可能会以你不希望的顺序到达,因为笔记穿过教室的路线可能不同,一个人传递笔记的速度可能不如另一个人快,等等

因此,当信息有序且完整时,使用流套接字非常重要。文件传输协议就是一个很好的例子。你不想下载一个文件,它的内容被随机地乱丢和损坏

当订单不如及时交付重要时(想想VoIP或游戏协议),当您不希望流的开销更大时(这就是为什么DNS主要是一个数据报协议,因此服务器可以非常快速地同时响应许多请求),您会使用数据报套接字,或者当您不太关心数据是否到达目的地时

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

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

流套接字:

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

  • 服务器和客户机之间没有专用的端到端通道
  • 使用UDP进行数据传输
  • 不是100%可靠,可能会丢失数据
  • 发送/接收的数据顺序可能不同
  • 无需在意或快速恢复丢失/错误的数据

如果是网络编程,我认为从套接字开始将是一个良好的开端。
套接字=ip+端口
有三种类型的插座
流(TCP、保证订单和交付、无重复、数据无长度或字符边界、面向连接、可靠、并发)
数据报(UDP、基于数据包、无连接、数据报大小限制、数据可能丢失或复制、顺序不保证、不可靠)
raw(直接访问下层协议IP、ICMP)
对于传输协议类型,我看不到任何严格的规则,比如套接字必须使用什么传输协议,不应该弄错什么传输协议和可靠性,因为在两端都处于活动状态的情况下,UDP是可实现的。

可靠性更像是交付的可靠性,因为使用TCP作为UDP中不存在的传输协议进行序列号检查。最好使用wireshark tcpdump等网络协议分析器来查看您的软件到底在做什么;这是一种验证,或者说是将论文中的理论与实际工作相结合

这个例子,或者是一个非常类似的例子,来自Linux编程接口。2010年版在1155和1159页上有这些例子。谢谢!很好的解释。数据不是按相同的顺序发送(而不仅仅是“相似”)吗?也就是说,在流socket中构建数据包排序机制是没有意义的。流通信中的数据包以“类似”的顺序发送和接收,因为数据包本身不能保证按顺序发送到接收主机,但TCP会找出差异,当他们到达时重新整理包裹,并要求任何在途中丢失的东西。这是有道理的。也许只是把它作为一个区别去掉,然后把它放在下面(因为如果我理解正确的话,当只提到数据包的发送顺序时,在这两种情况下,数据的发送/接收顺序可能不一样)。@Rick更准确地说,套接字被称为端到端点,因为传输协议负责将消息传递到一个或多个网络端点。