TCP 套接字和连接的 UDP 套接字之间的区别



默认UDP套接字加上Connect()调用是连接的UDP套接字。我知道与TCP和UDP相关的差异,但在这里我想知道套接字的差异

使用 TCP 套接字时,tcp 堆栈负责将数据发送到网络并传送到接收器,重新传输它直到接收器确认。TCP还负责流量控制,即以适合网络连接和接收器的速率传输数据。最后,TCP确保接收方以正确的顺序精确地获取数据一次。

使用UDP,程序员直接管理到网络的传输,并且必须处理丢失和无序的数据包,以及流量控制和分段数据以通过网络连接传输的数据包。

最后,由于 udp 和 tcp 是不同的协议,因此它们需要在防火墙中设置不同的设置,以便在服务器位于防火墙后面时允许通过服务器。此外,您不能将数据从已连接(或未连接)UDP 套接字发送到 TCP 套接字,反之亦然。

连接 UDP 套接字仅意味着 send() 和 recv() 可用于向连接的地址发送数据或从连接的地址发送数据,但它仍然是发送和接收的 UDP 数据,因此上述所有差异都适用。在 UDP 套接字上调用 connect() 是如果您仅使用该套接字进行点对点通信,您将执行的操作。

众所周知

,作为TCP和UDP的传输协议在传输源多路复用单个IP地址,并在目的地解复用另一个IP地址。这就是端口号出现的原因。两种协议多路复用/解复用 IP 地址的方式是使它们的套接字不同的原因。

为了使用TCP传输一些数据,您只需将数据报放入套接字中,它将流经先前创建的连接。反过来,UDP 是无连接的。连接的存在与否要求每个套接字的标识符格式不同:TCP 套接字由四重 {源 IP 地址、源端口号、目标 IP 地址、目标端口号} 标识,而 UDP 套接字由元组 {目标 IP 地址、目标端口号} 标识。

如上所述,当TCP服务收到一些数据报时,它需要知道谁发送了它("谁"是IP地址+端口号),以便将其正确转发给应用程序。因此,当具有不同源 IP 的两个 TCP 数据报到达主机时,它们必然会传递到两个不同的套接字(即使目标相同)。如果没有不同的套接字,则根本不会有连接处理(即TCP将是无连接的)。

对于 UDP 套接字,

规则是不同的:如果两个到达的 UDP 数据报具有相同的目标 IP 地址和端口号,则无论它们的源 IP 地址和/或源端口号(它们可能相等或不相等)都将转发到同一套接字。如果传输是无连接的,为什么要打扰不同的插座?

请记住,独立于它们各自的套接字标识符格式,TCP和UDP数据报都标识发送方的端口号;也就是说,即使是UDP这样的无连接协议也必须识别传输的发送者,正如Kurose和Ross在他们相当不错的书"计算机网络 - 自上而下的方法"中所解释的那样:

您现在可能想知道,源端口号的目的是什么?在 A 到 B 分段中,源端口号充当"返回地址"的一部分 — 当 B 想要将分段发送回 A 时,B 到 A 分段中的目标端口将从 A 到 B 分段的源端口值中获取其值(完整的返回地址是 A 的 IP 地址和源端口号)。

关于命名法的最后一点:在这里,我笼统地使用了术语"数据报",表示TCP和UDP协议的协议数据单元(PDU)。Kurose和Ross使用"segment"的意图相同。但是,严格地说,"段"是TCP协议的PDU,而"数据报"是UDP的PDU。

最新更新