有人可以告诉我什么是插座吗?我在SSL等的许多缩写词中看到了它。
另外,为什么叫插座?仅仅是因为这是他们发明的名字吗?还是他们想出的名字?
有人可以告诉我什么是插座吗?我在SSL等的许多缩写词中看到了它。
另外,为什么叫插座?仅仅是因为这是他们发明的名字吗?还是他们想出的名字?
Answers:
用最简单的术语来说,套接字是代表网络连接的伪文件。一旦创建了套接字(使用适当的原语和适当的参数来标识其他主机),对套接字的写入就会转换为网络数据包,然后发送出去,并且可以从套接字读取从网络接收的数据。
一方面,套接字与管道非常相似:套接字看起来就像使用它们的程序的文件一样,但是不会导致对磁盘的读写。相反,它们允许与另一个程序通信(对于管道而言,是本地的,对于套接字而言,可能是远程的)。正如您所提到的,它们还提供双向通信(就像一对正确连接的管道一样)。
最后,单台机器上的程序通常使用标准网络协议(例如TCP)进行通信;一路回到网络硬件(如果有的话!),计算校验和等等,只是回到同一台主机上,那是浪费的:那是Unix域套接字的引入。这与常规套接字非常相似,除了它们连接同一主机上的进程而不是远程进程,并且根本不尝试使用任何网络资源。这样,它们成为了进程间通信的媒介。
正如三人所提到的那样,在BSD的历史过程中,管道的引入要比套接字更早,一旦存在,就可以使用套接字重新实现。相同的参考资料《 FreeBSD操作系统的设计和实现》提到,出于性能方面的考虑,然后将管道恢复为非套接字实现:这无疑凸显了管道共享相似性这一事实。
一个套接字的抽象。它为应用程序提供了一种接口,使应用程序可以利用操作系统资源来调解和组织任意数量的应用程序对有限资源的使用,从而利用系统资源(在这种情况下为网络连接)。
如果通过套接字发送的数据可以看作是邮件的信封,那么套接字就是您的邮箱。您将邮箱(套接字)附加到房屋(程序)上,然后将外发邮件(数据)放入其中。在预定的时间,邮递员(操作系统)随即出现并提取您的外发邮件,并丢弃同一邮箱中的所有外来邮件。您的外发邮件将通过邮递员的卡车(网络连接)与您所有邻居的邮件一起代您传送给收件人。这使您可以与远方的人通信,而无需自己交付信件的费用,时间,困难等。
至于为什么称其为“ sockets”,发明者可以随心所欲地称呼它的想法可能在这里起了很大的作用。不过,在我看来,这并不是一个坏名字:)
套接字或“套接字”可以是几件事情:
首先,它是一个思想模型和一个应用程序编程接口(API)。这意味着您需要遵循一组规则,并可以根据精确指定的约定使用一组函数来编写执行某些操作的程序。在这种特殊情况下,某种意义就是与另一个程序交换数据。
通常,套接字API广泛抽象了“通信”的细节。它通过一种(几乎)一致且完全相同的cookie-cutter形式封装了您与之交谈的人以及如何与之交谈。
您可以在不同的“域”(例如“ unix套接字”或“ internet套接字”)中以及不同类型的通信(例如“数据报”套接字或“流”套接字)中创建套接字,并与不同的接收者对话,并且所有工作原理都完全一样(99%,显然您必须考虑细微的差异)。
您不需要知道(甚至都不希望知道!)是在同一台计算机上还是在另一台计算机上与另一个程序进行对话,或者这些计算机之间是否存在IPv4或IPv6网络,或者也许其他您从未听说过的协议。
socket
也是创建“套接字 ” 的库函数(或syscall)的名称,套接字是一种特殊的文件(Unix中的所有文件都是文件)。
套接字与管道和名称管道属于同一类别
管道是同一计算机上的读取器和写入器(均为程序)之间单向通信的一种方式。它模拟数据流(就像TCP)。
也就是说,从管道的角度来看,不存在单独的“消息”或“数据块”。您可以将任意数量的数据复制到“一端”,其他人可以按照与您相同的字节顺序在“另一端”读取任意数量的数据(不一定相同,也不必一次读取)推入。
一个命名管道,那么,一个简单的管道,其拥有的文件系统的名称。也就是说,它的外观和行为就像文件一样,它出现在目录列表中,您可以打开它,对其进行写入等。请注意,您还可以创建套接字专用文件(将是命名套接字) 。
另一方面,套接字是双向通信(“双工”)的一种方式,这意味着您可以在同一个套接字中进行读写操作,并且不需要两个单独的套接字进行双向通信。
另外,套接字可以充当流(与管道相同),或者可以发送离散的,不可靠的消息,或者可以发送离散的,有序的消息(前两个在任何域上起作用,最后一个仅在“ unix域”上起作用) )。它可以向完全不同的计算机上的某人发送消息(或模拟流)。在某些情况下,套接字甚至可以进行一对多通信(多播)的形式。
考虑到这一点,很明显套接字比管道要复杂得多,并且通常比管道有更多的开销(管道基本上不是简单的memcpy
往返缓冲区!),但是如果您创建本地套接字(即在同一套接字上)计算机),操作系统通常会使用经过高度优化的快速路径,因此实际上并没有太大的区别。
关于网络有时提到的进程间通信
是的,套接字是进程间通信的一种可能方式(共享内存和管道是替代方法的示例)。如上所述,它们同时全部用于“联网”。
对于基于IP的udp或tcp,
套接字地址是IP地址和端口号的组合。
IP地址是互联网上机器的地址,例如 unix.stackexchange.com has address 198.252.206.140
但是,每台计算机必须能够提供多种服务,因此大多数计算机将在端口80上提供http(网页),在端口22上提供ssh等。
因此,(套接字)的unix.stackexchange.com:80
端口是此网站的访问点。80
unix.stackexchange.com
但是,还有其他类型的套接字,请参见下面的注释。
AF_INET
)套接字。