默认UDP套接字加上Connect()调用是一个连接的UDP套接字。我知道与TCP和UDP有关的差异,但在这里我想知道套接字的区别
答案 0 :(得分:11)
当使用TCP套接字时,tcp堆栈负责处理发送到网络的数据并将其传送到接收方,重新传输直到接收方确认为止。 TCP还负责流量控制,即以适当的速率为网络连接和接收器发送数据。最后,TCP确保接收器以正确的顺序获取数据一次。
使用UDP,程序员直接管理到网络的传输,并且必须处理丢失和无序数据包以及流量控制和分段数据到可以通过网络连接传输的数据包。
最后,由于udp和tcp是不同的协议,它们需要防火墙中的不同设置,以便在服务器位于防火墙后面时允许传递到服务器。此外,您无法将数据从已连接(或未连接)的UDP套接字发送到TCP套接字,反之亦然。
连接UDP套接字只意味着send()和recv()可用于向连接的地址发送数据和从连接的地址发送数据,但仍然是UDP数据被发送和接收,因此所有上述差异都适用。如果仅使用套接字进行点对点通信,则可以在UDP套接字上调用connect()。
答案 1 :(得分:5)
众所周知,作为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-to-B段中,源端口号作为“返回地址”的一部分 - 当B想要将一个段发送回A时,B-to-A段中的目标端口将采用其来自A-to-B段的源端口值的值(完整的返回地址是A的IP地址和源端口号)。
关于命名法的最后评论:这里我一般使用术语“数据报”,表示TCP和UDP协议的协议数据单元(PDU)。 Kurose和Ross使用“段”具有相同的意图。但是,严格地说,“segment”是TCP协议的PDU,而“datagram”是UDP的PDU。