究竟什么是套接字?为什么不能使用套接字替代HTTP协议?

16

套接字只是两台计算机之间的连接吗?

如果可以建立套接字,为什么我们还要使用HTTP连接呢?


20
我们已经有轮子了,为什么还需要汽车呢? - Marc B
1
当您可以控制两端并且有特定用例(例如将推送消息到桌面应用程序)时,使用套接字是有优点的。唯一的问题是,它会限制某些只允许HTTP的环境(例如JavaScript)。但是,如果您的用例是HTML /基本文件传输,则HTTP具有优势,因为它还携带相关信息,如内容长度、用户代理等。 - Matt Lyons-Wood
4个回答

26
我假设这是一个关于套接字和HTTP连接之间关系的非常普遍的问题。我还假设"HTTPConnection"并不涉及特定的API /运行环境,尽管它的驼峰式术语可能会暗示其他方面。
现在,让我们来介绍一下OSI模型

The OSI Model

OSI模型描述了网络通信的抽象层级。一个socket是一个概念,将存在于第3层,即网络层,作为Internet Protocol (IP)的一部分。 HTTP比IP更高的抽象级别,通常被认为位于应用层,在OSI模型的“顶部”。
类比如下:
您可以按照同样的方式定义城市的交通和交通流量,就像我们定义网络设备一样。
- 最简单的情况下,城市是由一堆建筑物组成的。 - 随着城市的发展,人们需要从建筑物到建筑物旅行,因此他们开发出道路。道路是城市的新“层”。 - 随着更多的人使用道路,他们开始需要一套规则和法律来帮助保持每个人的安全。 - 一旦人们在道路上安全了,他们希望道路既高效又快速,因此一套灯光和标志系统有助于协调人们在道路上的行动。
两件重要的事情:
首先,每一层都依赖于其下面的层。没有建筑(目的地),道路就变得无意义。没有道路,交通规则就变得愚蠢。没有交通规则,交通信号就变得愚蠢。
第二,高层协议的细节取决于所在的城市:有时你会发现自己在一个人们靠左行驶的国家,有时他们靠右行驶。有时你可以在红灯亮起时转弯,有时不行。有时会有道路,但没有交通法规。
类比结束
因此,在互联网上,有时你需要与不同类型的服务器通信。在底层,它们可能都依赖于套接字(即互联网的“道路”),但它们都有自己的“交通法规”需要遵守 - 如HTTP、FTP或SOAP协议。

我不知道我是怎么跌跌撞撞地来到这里的,我喜欢你的比喻,只是在最后一句话我有点听不懂,高层协议的具体内容取决于你所处的位置?你是想说HTTP在美国和俄罗斯是不同的吗?当然有不同的协议,但ISO制定的协议应该得到一致的实施。相反,我会改变这个比喻,说你需要针对你所拥有的交通类型制定不同的法律——汽车可能想要走HOV,卡车可能需要称重——所有交通工具仍然使用道路,但有不同的要求并遵循不同的协议。 - vol7ron
1
有人能详细解释一下这个答案吗,以便说明像socket.io或firebase这样的框架如何利用“sockets”?我知道HTTP及其构建方式,但也许说“它使用sockets”的语义使我感到困惑。换句话说,我更希望得到一个技术上的解释而不是类比。 - Felipe

17

Http是建立在socket之上的协议。

使用Http时,您在sockets之上使用了更高层次的抽象。仍然在使用sockets。

这有点像说“为什么要使用.xyz文档,而不只是使用文件?”


2
为什么要使用电脑,当你有算盘? - user350814
1
@nebukadnezzar - 我不认为这是个好比喻。一个人要么使用电脑要么使用算盘;在使用电脑时,你并不是隐含地使用算盘,就像使用HTTPConnection会隐式地使用套接字一样。算盘并不是计算机的抽象。 - Richard JP Le Guen
@LeguRi,我想你误解了。我使用计算机这个词作为(超大型)计算器的比喻。但我理解你的观点。 :-) - user350814
@nebukadnezzar - 啊哈,我现在明白了。是的,我认为“计算器”应该是正确的词汇 ;) - Richard JP Le Guen
3
请注意,HTTP是建立在Sockets之上而不是Websockets。这让我困惑了一段时间! - Amin Jafari

6

5
假设套接字只是两个远程系统之间使用TCP/IP或UDP等低级协议传输数据的流。而HTTP是更高级别的协议,它规定了系统之间的通信方式。
举个小例子:空气是声音的传输层,但你需要词语(一种更高级别的协议)与其他人进行交流。
但最好您在这里阅读:http://en.wikipedia.org/wiki/OSI_model

这很棒! "Air是语音的传输层,但你需要用词语与其他人进行交流" - Ivan Aracki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接