有人可以向我解释一下什么是套接字吗?我在 SSL 等上下文中的许多缩写词中看到它。
还有,为什么叫socket呢?纯粹是因为这是他们发明的名字吗?或者这是他们想出的第一个名字?
答案1
套接字是代表网络连接的伪文件。一旦创建了套接字(标识另一台主机和端口),对该套接字的写入将转换为发送出去的网络数据包,并且可以从套接字读取从网络接收的数据。
套接字类似于管道。对于使用它们的程序来说,两者看起来都像文件。两者都促进进程间通信。管道与本地程序通信;套接字与远程程序进行通信。正如您所提到的,套接字还提供双向通信(就像一对正确连接的管道一样)。
最后,单机上的程序通常使用标准网络协议(例如 TCP)进行通信;如果一直到网络硬件(如果有的话!)、计算校验和等,只是为了回到同一主机,那将是一种浪费。 Unix 域套接字处理这种情况。它们绕过网络连接同一主机上的进程而不是远程进程。
正如 Tripleee 提到的,在 BSD 的历史进程中,管道的引入早于套接字,并且一旦存在,就使用套接字重新实现。相同的参考文献,FreeBSD操作系统的设计与实现,提到出于性能原因,管道随后恢复为非套接字实现。
答案2
答案3
现在,这是什么?
套接字或“套接字”可以有多种含义:
首先,它是一个思维模型和一个应用程序编程接口(API)。这意味着您有一组需要遵循的规则和一组函数,您可以使用它们根据精确指定的合同编写执行某些操作的程序。在这种特殊情况下,某物意味着与另一个程序交换数据。
套接字 API 广泛抽象了“通信”的一般细节。它通过一种(几乎)一致且相同的千篇一律的形式封装了您与谁交谈以及如何交谈。
您可以在不同的“域”(例如“unix套接字”或“互联网套接字”)和不同类型的通信(例如“数据报”套接字或“流”套接字)中创建套接字,并与不同的接收者通信,一切工作原理都完全相同(嗯,99%,显然有一些细微的差异,你必须考虑在内)。
您不需要知道(而且您甚至不想知道!)您是否与同一台计算机或不同计算机上的另一个程序通信,或者这些计算机之间是否存在 IPv4 或 IPv6 网络,或者可能是其他网络您从未听说过的协议。
socket
也是创建的库函数(或系统调用)的名称“插座”,这是一种特殊的文件(Unix 中的一切都是文件)。
与...相比如何?
套接字与管道和名称管道属于同一类别
管道是一种手段单程同一台计算机上的读者和作者(两者都是程序)之间的通信。它模拟一个溪流数据(就像 TCP)。
也就是说,从管道的角度来看,不存在单独的“消息”或“数据块”。您可以将任意数量的数据复制到“一端”,其他人可以按照与您相同的字节顺序在“另一端”读取任意数量的数据(不一定相同,也不一定一次性)把它推了进去。
A命名的管道就是管道它在文件系统中拥有一个名称。也就是说,它的外观和行为就像一个文件,它出现在目录列表中,您可以打开它,写入它等等。请注意,您还可以创建套接字特殊文件(这将是一个命名套接字) 。
另一方面,套接字是一种手段两种方式(“双工”)通信,这意味着您可以在同一套接字中写入和读取,并且不需要两个单独的套接字来进行双向通信。
此外,套接字可以充当流(与管道相同),或者可以发送离散的、不可靠的消息,或者可以发送离散的、有序的消息(前两个在任何域上工作,最后一个仅在“unix域”上工作) )。它可以向完全不同的计算机上的某人发送消息(或模拟流)。在某些条件下,套接字甚至可以进行某种形式的一对多通信(多播)。
考虑到这一点,很明显套接字做了更复杂的事情,一般来说比管道有更多的开销(基本上只是简单地memcpy
往返于缓冲区!),但是如果您创建本地套接字(即在同一台计算机上),操作系统通常会应用经过高度优化的快速路径,因此有确实没有太大区别。
有时在网络方面提到进程间通信
是的,套接字是进程间通信的一种可能方式(共享内存和管道是替代方案的示例)。同时,如上所述,它们被用于“网络”。
答案4
对于 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
然而还有其他类型的套接字,请参阅下面的评论。