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

问题描述 投票:0回答:2

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

的差异
sockets tcp network-programming udp
2个回答
20
投票

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

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

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

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


12
投票
众所周知,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)。黑濑和罗斯使用“段”一词的目的相同。不过,严格来说,“段”是 TCP 协议的 PDU,而“数据报”是 UDP 协议的 PDU。

© www.soinside.com 2019 - 2024. All rights reserved.