Unix vs BSD vs TCP vs Internet套接字?

use*_*112 7 unix sockets linux posix tcp

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

  • Unix域名
  • 伯克利
  • TCP
  • 互联网

本书所说的一件事是,如果你想在远程主机之间进行通信,你就不能使用Unix域套接字,因为它们用于同一主机上的IPC.你必须使用"互联网"套接字.

但是,我仍然有点困惑这与"TCP"套接字,Berkeley套接字和其他2有什么关系?他们的关系是什么?为什么你会有一个Internet套接字和一个TCP套接字?

总之,我试图理解所有(我错过了什么?)各种不同类型的Unix套接字以及在什么情况下我会使用它们?

Duc*_*uck 14

套接字是一种抽象.SO上用于套接字的标记定义与以下任何内容一样好:

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

因此,主要的区别是(1)使用网络和(2)不使用网络的套接字.

Unix 套接字不使用网络.它们的API使得开发人员(大多数)看起来与网络套接字相同,但所有通信都是通过内核完成的,而套接字仅限于与运行它们的机器上的进程通信.

Berkeley套接字是我们今天所知的POSIX平台上的网络套接字.在过去,有不同的Unix开发线(例如Berkeley或BSD,System V或sysV等).Berkeley套接字基本上在市场上获胜,并且现在实际上是Unix套接字的同义词.

严格来说,没有TCP套接字.有些网络套接字可以使用TCP协议进行通信.它只是一种语言学家的简写,将它们称为TCP套接字,以使用其他协议(例如UDP,路由协议或诸如此类的东西)将它们与套接字区分开来.

"互联网"套接字大多是无意义的区别.它是使用网​​络协议的套接字.这消除了Unix域套接字,但大多数网络协议可用于在LAN或Internet上进行通信,这只是网络的集合.(尽管请注意,有一些特定于本地网络的协议以及管理网络集合的协议.)

  • 谢谢你.所以我认为只有两个原始套接字 - POSIX/Berkeley和Unix域.您可以使用POSIX/Berkeley和"bolt-on"各种设置,有效地将其转换为"Internet"套接字或TCP套接字 - 但您需要一个Berkeley/POSIX插槽用于底层? (3认同)
  • 听起来不错。您可能想要使用术语“base”而不是“raw”,因为原始套接字意味着 IP 层数据报,没有任何传输层协议格式,例如 tcp、udp 等。 (2认同)