套接字到底是啥?为啥我们不能使用套接字而不是 HTTP?

Posted

技术标签:

【中文标题】套接字到底是啥?为啥我们不能使用套接字而不是 HTTP?【英文标题】:What are Sockets afterall? Why can't we use sockets instead of HTTP?套接字到底是什么?为什么我们不能使用套接字而不是 HTTP? 【发布时间】:2011-06-13 13:05:09 【问题描述】:

套接字只是两台机器之间的连接吗?如果可以建立套接字,为什么我们还要使用 HTTPConnection ?

【问题讨论】:

既然有了***,为什么还需要汽车? 当您可以控制两端并且您有特定的用例(例如,将消息推送到桌面应用程序)时,使用套接字是有好处的。唯一的问题是您限制了某些只允许 HTTP 的环境类型(例如 javascript)。如果您的用例是 html/基本文件传输,那么 HTTP 的优势在于它还携带相关信息,例如内容长度、用户代理等。 【参考方案1】:

我认为这是一个关于套接字和 HTTP 连接之间关系的非常普遍的问题。我还假设“HTTPConnection”不是指涉及特定 API/运行时/环境的东西,即使它是一个 camel cased 术语删除空格的方式可能暗示其他情况。

现在已经不碍事了,我向您介绍OSI model:

OSI 模型描述了网络通信的抽象级别。 socket 是一个存在于第 3 层某处的概念,Network Layer,作为 Internet Protocol (IP) 的一部分。

HTTP 是比 IP 更高的抽象,通常被认为在应用层中,处于 OSI 模型的“顶部”。

类比

您可以在不同“层”定义城市的交通和交通,就像我们定义网络的东西一样。

简单地说,一座城市就是一堆建筑物。 随着城市的发展,人们需要在建筑物之间穿梭,因此他们开发了道路。道路是城市的新“层”。 随着越来越多的人使用道路,他们开始需要一套规则和法律体系来帮助确保每个人的安全。 一旦人们在道路上安全后,他们希望道路高效快捷,因此灯光和标志系统有助于协调道路上的人们。

两件重要的事情:

首先,每一层都依赖于它“下面”的一层。没有建筑物(目的地)的道路变得愚蠢。没有道路,交通法就是愚蠢的。没有交通法规,红绿灯就傻了。

其次,较高层的具体情况因您所在的城市而异:有时您会发现自己身处一个人们在左边开车的国家,有时他们在右边开车。有时你可以打开红色,有时不能。有时有路,但没有法律。

类比结束

因此,在 Internet 上,有时您会与不同类型的服务器进行通信。在下面,它们可能都依赖于套接字(互联网的“道路”),但它们都有自己必须遵守的“交通规则”——HTTP、FTP 或 SOAP 等协议。

【讨论】:

我不知道我是怎么在这里绊倒的,我喜欢你的比喻,只是最后我失去了你,更高层的细节取决于你在哪里。您是想说美国与俄罗斯的 HTTP 不同吗?当然有不同的协议,但是 ISO 建立的协议应该得到一致的执行。相反,我会改变类比,说您需要针对您所拥有的交通类型的不同法律 - 汽车可能想要使用 HOV,卡车可能需要称重 - 所有交通仍然使用道路,但有不同的要求并遵循不同的协议。 有人可以详细说明这个答案来解释诸如socket.io或firebase之类的框架使用“套接字”是什么意思吗?我知道 HTTP 以及它是如何构建的,但也许说“它使用套接字”的语义给了我一个曲线球。换句话说,我更喜欢技术解释而不是类比【参考方案2】:

Http 是建立在套接字之上的协议。

当您使用 Http 时,您在套接字之上使用了更高级别的抽象。你还在使用套接字。

这有点像“当你可以使用文件时,为什么还要使用 .xyz 文档?”

【讨论】:

或“有了算盘,为什么还要使用电脑?”。 @nebukadnezzar - 我不认为这是一个很好的类比。一个人要么使用电脑,要么使用算盘;在使用计算机时,您不会像使用 HTTPConnection 隐式使用套接字那样隐式使用算盘。算盘不是计算机的抽象。 @LeguRi 我想你误会了。我使用术语计算机作为(超大)计算器的隐喻。但我明白你的意思。 :-) @nebukadnezzar - 啊,我现在明白了。是的,我认为“计算器”应该是这个词;) 请注意,HTTP 是建立在 Sockets 而不是 Websockets 之上的。这让我困惑了一段时间!【参考方案3】:

了解网络通信的 OSI 模型:http://en.wikipedia.org/wiki/OSI_model 它应该很好地解释每个组件的适合位置。

【讨论】:

【参考方案4】:

假设套接字只是两个远程系统之间的流,它使用 TCP/IP 或 UPD 较低级别的协议来传输数据。 HTTP 是更高级别的协议,它指定系统如何通信。

小例子:air 是语音的传输层,但你需要单词(上层协议)来与其他 ppl 通信。

但最好在这里阅读:http://en.wikipedia.org/wiki/OSI_model

【讨论】:

以上是关于套接字到底是啥?为啥我们不能使用套接字而不是 HTTP?的主要内容,如果未能解决你的问题,请参考以下文章

在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是啥?

套接字是啥意思?

冲洗插座是啥意思?

为啥我不能在 Ubuntu 中创建原始套接字?

套接字使用线程而不是 select()

套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?