it-swarm.cn

什么是插座?

有人可以告诉我什么是插座吗?我在SSL等的许多缩写词中看到了它。

另外,为什么叫插座?仅仅是因为这是他们发明的名字吗?还是他们想出的名字?

57
chrisjlee

套接字只是通信的逻辑端点。它们存在于传输层上。您可以在套接字上发送和接收内容,可以绑定和侦听套接字。套接字特定于协议,机器和端口,并在数据包的标头中进行寻址。

Beej的 网络编程进程间通信 的指南都提供了有关如何使用套接字的很好的信息,甚至 回答这个确切的问题

48
Shawn J. Goff

用最简单的术语来说,套接字是代表网络连接的伪文件。一旦创建了套接字(使用正确的原语和正确的参数来标识其他主机),对套接字的写入就会转换为网络数据包,然后发送出去,并且可以从套接字读取从网络接收的数据。

一方面,套接字与管道非常相似:套接字看起来就像使用它们的程序的文件一样,但不会导致对磁盘的读写。相反,它们允许与另一个程序通信(对于管道而言,是本地的,对于套接字而言,可能是远程的)。正如您所提到的,它们还提供双向通信(就像一对正确连接的管道一样)。

最后,单台机器上的程序通常使用标准网络协议(例如TCP)进行通信;一路回到网络硬件(如果有的话!),计算校验和等等,只是回到同一个主机上,这是浪费,这是Unix域套接字的来源。它们与常规套接字非常相似,除了它们将进程连接在同一主机上而不是远程进程上,并且根本不尝试使用任何网络资源。这样,它们成为了进程间通信的媒介。

正如三人所提到的那样,在BSD的历史过程中,管道的引入要比套接字更早,并且一旦存在就可以使用套接字重新实现。相同的参考文件FreeBSD操作系统的设计和实现提到,出于性能原因,然后将管道恢复为非套接字实现:这无疑突出了管道共享相似性这一事实。

74
dhag

现在是什么

套接字或“套接字”可以是几件事情:

首先,它是一个思想模型和一个应用程序编程接口(API)/。这意味着您需要遵循一组规则,并可以根据精确指定的约定使用一组函数来编写执行某些操作的程序。在这种特殊情况下,something表示与另一个程序交换数据。

通常,套接字API广泛抽象了“通信”的细节。它通过一种(几乎)一致且完全相同的切饼刀形式封装了与您交谈的对象以及操作方式。
您可以在不同的“域”(例如“ unix套接字”或“ internet套接字”)和不同类型的通信中创建套接字(例如“数据报”套接字或“流”套接字)并与不同的接收者交谈,一切工作都完全相同(99%,显然您必须考虑细微的差异)。

您不需要知道(甚至都不希望知道!)是在同一台计算机上还是在另一台计算机上与另一个程序进行对话,或者这些计算机之间是否存在IPv4或IPv6网络,或者也许其他您从未听说过的协议。

socket 也是创建“ socket”的库函数(或syscall)的名称,这是一种特殊的文件(Unix中的所有文件都是一份文件)。

与...相比.

套接字与管道和名称管道属于同一类别

管道是在同一台计算机上的读取器和写入器(均为程序)之间的单向通信的一种方式。它模拟stream数据(就像TCP)一样。
也就是说,从管道的角度来看,不存在单独的“消息”或“数据块”。您可以将任意数量的数据复制到“一端”,其他人可以按照与您相同的字节顺序在“另一端”读取任意数量的数据(不一定相同,也不必一次读取)推入。

一个named管道就是一个管道在文件系统中拥有一个名称。也就是说,它的外观和行为就像文件一样,它出现在目录列表中,您可以打开它,对其进行写入等。请注意,您还可以创建套接字专用文件(将是命名套接字) 。

另一方面,套接字是双向(“双工”)通信的一种方式,这意味着您可以写入和读取同一套接字,并且您可以不需要两个单独的插座即可进行双向通讯。
另外,套接字可以充当流(与管道相同),或者可以发送离散的,不可靠的消息,或者可以发送离散的,有序的消息(前两个在任何域上都起作用,最后一个仅在“ unix域”上)。它可以向完全不同的计算机上的某人发送消息(或模拟流)。在某些情况下,套接字甚至可以进行一对多通信(多播)的形式。

考虑到这一点,很明显,套接字做的事情要复杂得多,并且一般比管道有更多的开销(基本上只不过是往返于缓冲区的简单memcpy!) ,但是如果您创建本地套接字(即在同一台计算机上),则操作系统通常会应用经过高度优化的快速路径,因此实际上并没有太大的区别。

关于网络有时提到的进程间通信

是的,套接字是进程间通信的一种可能方式(共享内存和管道是替代方法的示例)。如上所述,它们同时全部用于“联网”。

8
Damon

一个套接字的抽象。它为应用程序提供了一个接口,使应用程序可以利用操作系统资源来调解和组织任意数量的应用程序对有限资源的使用,从而利用系统资源(在这种情况下为网络连接)。

如果通过套接字发送的数据可以看作是邮件的信封,那么套接字就是您的邮箱。您将邮箱(套接字)附加到房屋(程序)上,然后将外发邮件(数据)放入其中。在预定的时间,邮递员(操作系统)随身携带并提取您的外发邮件,并放下同一邮箱中的所有外来邮件。您的外发邮件将通过邮递员的卡车(网络连接)与您所有邻居的邮件一起代您传送给收件人。这使您可以与远方的人通信,而无需自己交付信件的费用,时间,困难等。

至于为什么称其为“ sockets”,发明者可以随心所欲地称呼它的想法可能在这里起了很大的作用。不过,在我看来,这并不是一个坏名字:)

7
Andrew Lambert

对于IP上的udp或tcp,

套接字地址是IP地址和端口号的组合。

IP地址是互联网上一台机器的地址,例如unix.stackexchange.com has address 198.252.206.140

但是,每台计算机必须能够提供多种服务,因此大多数计算机将在端口80上提供http(网页),在端口22上提供ssh等。

因此,unix.stackexchange.com:8080端口unix.stackexchange.com(套接字)是此网站的访问点。

但是,还有其他类型的套接字,请参见下面的注释。

2
ctrl-alt-delor

我相信您问过网络方面的问题。因此,TCP服务使用套接字作为通信点,并且由IP地址,协议和端口号组成。

0
Dragos Alexe