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

20

默认的UDP套接字加上Connect()调用后,就成为连接的UDP套接字。我知道TCP和UDP相关的区别,但这里我只想了解套接字方面的不同之处。


除了TCP的可靠性之外,你还有其他意思吗? - Some programmer dude
是的,除了两者之间的连接方向差异之外。 - arjun gulyani
给出的答案有哪些是好的,@arjun gulyani? - sanepete
@sanepete 这些答案解释了TCP和UDP作为协议之间的区别,但是并没有关于套接字的内容。 - arjun gulyani
2个回答

20
使用TCP套接字时,tcp堆栈负责将数据发送到网络并传送给接收方,重传直到被接收方确认。TCP还负责流量控制,即以适当的速率传输数据到网络连接和接收方。最后,TCP确保接收方恰好一次性按正确顺序获得数据。
使用UDP时,程序员直接管理网络传输,并且必须注意丢失和乱序包,以及流量控制和将数据分片成可以在网络连接上传输的数据包。
最后,因为UDP和TCP是不同的协议,所以如果服务器在防火墙后面,则需要在防火墙中设置不同的设置才能允许它们通过。此外,不能从已连接(或非连接)的UDP套接字发送数据到TCP套接字,反之亦然。
连接UDP套接字仅意味着可以使用send()和recv()将数据发送到和从连接的地址接收,但仍然发送和接收UDP数据,因此所有上述差异都适用。如果仅使用套接字进行点对点通信,则会在UDP套接字上调用connect()。

1
一个好的链接是这个 - http://www.cs.dartmouth.edu/~campbell/cs60/socketprogramming.html - Xofo
上面的链接不错,但与这个主题关系不大。请注意。 - FaceBro
@Maf 这位发帖者询问了TCP和UDP之间的区别,但链接提供的是关于一般套接字编程API的内容。 - undefined
在链接中,@FaceBro提供了一些通用的套接字编程API,并且还特别强调了TCP和UDP编程之间的区别。 - undefined
1
@Maf 那样并不有帮助,发帖者并不需要一本关于这个的完整书籍(我相信他可以很容易地自己找到一本),而且也不准确。 - undefined
显示剩余4条评论

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)。Kurose和Ross使用“段”具有相同的意图。然而,严格来说,“段”是TCP协议的PDU,而“数据报”是UDP的PDU。

你写的很多东西都没有意义。寻找路径与TCP或UDP无关。TCP和UDP都包含有关数据包源的信息。然后我就停止阅读了。这应该被删除。 - Vega4
5
@Rafal,老实说,我不确定我是否理解你的意思。首先,我没有像你说的那样表明“找到路径”与“TCP或UDP有关”。此外,引用Kurose和Ross的话,“重要的是要注意,UDP套接字完全由由目标IP地址和目标端口号组成的二元组进行标识”,这正是我所说的。我在我的回答中没有发现任何错误——难道我们面临的是语言问题吗?请问您能否澄清您在这里的顾虑是什么? - Humberto Fioravante Ferro
1
这个伟大答案中唯一的语言错误是在"a connectionless protocol as UDP have to identify"中。只需将"have"替换为"has"。非常感谢你的答案@HumbertoFioravanteFerro。技术细节非常好,你引用了我第二喜欢的计算机网络书籍,就在Tanenbaum等人的"自下而上"方法之后。@Vega4,你能解释一下为什么你对这个答案写了这么粗鲁的评论而没有任何技术上的理由吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接