Unix、BSD、TCP和Internet sockets之间的区别是什么?

12

我正在阅读《Linux编程接口》一书,它描述了Linux上使用的几种不同类型的套接字:

  • Unix域套接字
  • Berkeley套接字
  • TCP套接字
  • Internet套接字/li>

其中一件事情是,如果你想在远程主机之间通信,就不能使用Unix域套接字,因为它们用于同一主机上的IPC。你必须使用“Internet”套接字。

然而,我还是有些困惑,这与“TCP”套接字、Berkeley套接字和其他两种套接字有什么关系?它们之间的关系是什么?为什么你会同时拥有Internet套接字和TCP套接字?

简而言之,我正试图理解所有不同类型的Unix套接字以及在什么情况下使用它们(我漏掉了吗?)

1个回答

22

套接字是一种抽象。SO网站上对套接字的标签定义很好:

双向进程通信流的端点。这通常指的是通过网络连接的进程流,但并不限于此。

因此从中可以看出一个主要区别:使用网络的套接字和不使用网络的套接字。

Unix领域套接字不使用网络。它们的API使开发人员看起来(大多数情况下)与网络套接字相同,但所有通信都是通过内核进行的,并且套接字仅限于与正在运行的机器上的进程进行通信。

Berkeley套接字是我们今天在POSIX平台上所知道的网络套接字。过去存在不同的Unix开发线路(例如Berkeley或BSD,System V或sysV等)。在市场上,Berkeley套接字基本上获胜了,并且现在实际上已经成为Unix套接字的代名词。

严格来说,不存在TCP套接字。有可以使用TCP协议进行通信的网络套接字。将它们称为TCP套接字只是一种语言学上的简写,以区别使用其他协议(例如UDP、路由协议或其他协议)的套接字。

“互联网”套接字在大多数情况下是一种毫无意义的区别。它是使用网络协议的套接字。这消除了Unix领域套接字,但大多数网络协议都可用于在LAN或Internet上进行通信,而Internet只是网络集合。(请注意,也有特定于本地网络以及管理网络集合的协议。)


6
谢谢。我理解的是,实际上只有两种原始套接字 - POSIX / Berkeley 和 Unix 套接字。您可以采用 POSIX / Berkeley 套接字,并“附加”各种设置,从而将其转换为“互联网”套接字或 TCP 套接字 - 但需要 Berkeley / POSIX 套接字作为底层支持? - user997112
2
听起来差不多就是这样。您可能想使用术语“基础”而不是“原始”,因为原始套接字意味着没有任何传输层协议格式化的IP层数据报,例如TCP、UDP等。 - Duck

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