什么是插座?


49

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

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


9
用外行的话说:插座就是电话。握在手中的东西使您可以与另一部手机进行通话。这个类比打破了:大多数电话对话都是点对点的。套接字连接是客户端到服务器的连接。客户端(例如但不限于工作站软件,例如浏览器)连接到服务器(例如Web服务器,文件服务器,身份验证服务器或其他服务器)。类推的另一个缺陷:当关闭套接字连接时,该套接字被破坏,必须先创建一个新的套接字,然后才能建立新的连接。
G-Man说'Restore

打个比方还不错。服务器只是一个呼叫中心,一次可以有数百个活动呼叫。
MSalters

Answers:


42

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

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


64

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

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

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

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


3
也许还提到管道早于套接字,但是一旦套接字接口添加到Unix,使用本地套接字重新实现管道就变得很有意义。
Tripleee

@tripleee:那是一个伟大的历史点。希望提供参考?
dhag 2015年

快速查阅在FreeBSD操作系统的设计与实现中的第40页 ; 文本提到了4.2BSD中的这一更改,但同时也出于性能原因而阐明了不再进行此操作。
2015年

太好了,我将其添加到我的答案中。
dhag 2015年

所有技术中最好的答案
chaosguru

7

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

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

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


7

现在是什么

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

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

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

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

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

与...相比

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

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

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

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

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

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

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


1

对于基于IP的udp或tcp,

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

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

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

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

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


5
tcp / ip只是一种套接字。还有其他与tcp / ip无关。
psusi 2015年

有多少种插座?
Abdul Al Hazred

1
@AbdulAlHazred,我知道ip网络使用的四种常见类型,ip6相同,unix两种,ipx两种。我没有看过ax25,atm或appletalk。linux上支持其他协议,而linux不支持某些协议。在大多数情况下,每个协议都有stream(tcp)和datagram(udp)套接字。原始套接字也很常见,imcp也可能具有套接字接口。
hildred

关键是,这个答案是不完整的,因为它仅涵盖一种类型的套接字,而误导性的是,它通常将套接字表示为始终是网络套接字,尤其是IP(AF_INET)套接字。
Tripleee

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.