写点什么

论 Http、Socket、WebSocket、WebService(SOAP) 之间的区别

用户头像
Damon
关注
发布于: 2021 年 05 月 19 日

作者:Damon

博客:http://www.damon8.cn

程序猿 Damon | 微服务 | 容器化 | 自动化

何为 HTTP

HTTP 是基于请求响应式的,即通信只能由客户端发起,服务端做出响应,无状态,无连接。

无状态:每次连接只处理一个请求,请求结束后断开连接。

无连接:对于事务处理没有记忆能力,服务器不知道客户端是什么状态。

以往实现即时通讯的手段:

轮询:客户端定时向服务器发送 Ajax 请求,服务器接到请求后马上返回响应信息并关闭连接。

长轮询:客户端向服务器发送 Ajax 请求,服务器接到请求后 hold 住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

长连接:在页面里嵌入一个隐蔵 iframe,将这个隐蔵 iframe 的 src 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。

Socket 是什么?

Socket 是操作系统提供的对于传输层(TCP / UDP)抽象的接口,是一个编程概念,而 Websocket 与 HTTP 一样是一个成文的互联网协议。

Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。

当两台主机通信时,必须通过 Socket 连接,Socket 则利用 TCP/IP 协议建立 TCP 连接。TCP 连接则更依靠于底层的 IP 协议,IP 协议的连接则依赖于链路层等更低层次。

WebSocket 又是啥?

WebSocket 与 Socket 没有直接联系。WebSocket 是双向通信协议,模拟 Socket 协议,可以双向发送或接受信息。

由起:

HTTP 协议有一个缺陷:通信只能由客户端发起。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其他特点包括:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是 80 和 443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是 ws(如果加密,则为 wss),服务器网址就是 URL。

Websocket 使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket 协议使用 80 端口;运行在 TLS 之上时,默认使用 443 端口。

WebSocket 与 HTTP 的关系

相同点:

1. 都是一样基于 TCP 的,都是可靠性传输协议。

2. 都是应用层协议。

不同点:

1. WebSocket 是双向通信协议,模拟 Socket 协议,可以双向发送或接受信息。HTTP 是单向的。

2. WebSocket 是需要握手进行建立连接的。

联系:

1. WebSocket 在建立握手时,数据是通过 HTTP 传输的。但是建立之后,在真正传输时候是不需要 HTTP 协议的。

SOAP 是干嘛的?

讲述 SOAP,先来讲解 WebService:

WebService 是一种跨编程语言和跨操作系统平台的远程调用技术。

跨编程语言和跨操作平台:就是说服务端程序采用 java 编写,客户端程序则可以采用其他编程语言编写,反之亦然!

跨操作系统平台:则是指服务端程序和客户端程序可以在不同的操作系统上运行。

远程调用:就是一台计算机 a 上的一个程序可以调用到另外一台计算机 b 上的一个对象的方法,譬如,银联提供给商场的 pos 刷卡系统,商场的 POS 机转账调用的转账方法的代码其实是跑在银行服务器上。再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以 webservice 服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的 SOA 应用。

从表面上看,WebService 就是一个应用程序向外界暴露出一个能通过 Web 进行调用的 API,把调用这个 WebService 的应用程序叫做客户端,而把提供这个 WebService 的应用程序叫做服务端。从深层次看,WebService 是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。

WebService 平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService 平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service 平台必须提供一种标准来描述 Web service,让客户可以得到足够的信息来调用这个 Web service。最后,我们还必须有一种方法来对这个 Web service 进行远程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种 RPC 协议还必须与平台和编程语言无关。

WebService 平台技术:

XML+XSD、SOAP、WSDL 就是构成 WebService 平台的三大技术。

XML:

WebService 采用 HTTP 协议传输数据,采用 XML 格式封装数据(即 XML 中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML 是 WebService 平台中表示数据的格式。除了易于建立和易于分析外,XML 主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。XML 解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16 位,32 位,64 位?这些细节对实现互操作性很重要。

XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService 平台就是用 XSD 来作为其数据类型系统的。当你用某种语言(如 VB.NET 或 C#)来构造一个 Web service 时,为了符合 WebService 标准,所有你使用的数据类型都必须被转换为 XSD 类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。

SOAP (Simple Object Access Protocol 简单对象访问协议):

WebService 通过 HTTP 协议发送请求和接收结果时,发送的请求内容和结果内容都采用 XML 格式封装,并增加了一些特定的 HTTP 消息头,以说明 HTTP 消息的内容格式,这些特定的 HTTP 消息头和 XML 内容格式就是 SOAP 协议。SOAP 提供了标准的 RPC 方法来调用 Web Service。

SOAP 协议 = HTTP 协议 + XML 数据格式

SOAP 协议定义了 SOAP 消息的格式,SOAP 协议是基于 HTTP 协议的,SOAP 也是基于 XML 和 XSD 的,XML 是 SOAP 的数据编码方式。SOAP 请求是 HTTP POST 的一个专用版本,遵循一种特殊的 xml 消息格式 Content-type 设置为: text/xml 任何数据都可以 xml 化。打个比喻:HTTP 就是普通公路,XML 就是中间的绿色隔离带和两边的防护栏,SOAP 就是普通公路经过加隔离带和防护栏改造过的高速公路。

WSDL:

好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。WebService 也一样,WebService 客户端要调用一个 WebService 服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService 服务器端首先要通过一个 WSDL 文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个 url 地址表示,服务通过什么方式来调用。

WSDL(Web Services Description Language)就是这样一个基于 XML 的语言,用于描述 Web Service 及其函数、参数和返回值。它是 WebService 客户端和服务器端都能理解的标准格式。因为是基于 XML 的,所以 WSDL 既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的 Web service 生成 WSDL 文档,又能导入 WSDL 文档,生成调用相应 WebService 的代理类代码。

WSDL 文件保存在 Web 服务器上,通过一个 url 地址就可以访问到它。客户端要调用一个 WebService 服务之前,要知道该服务的 WSDL 文件的地址。WebService 服务提供商可以通过两种方式来暴露它的 WSDL 文件地址:1. 注册到 UDDI 服务器,以便被人查找。2. 直接告诉给客户端调用者。


结束福利

开源实战利用 k8s 作微服务的架构设计代码:

https://gitee.com/damon_one/spring-cloud-k8shttps://gitee.com/damon_one/spring-cloud-oauth2
复制代码

欢迎大家 star,多多指教。

关于作者

  笔名:Damon,技术爱好者,长期从事 Java 开发、Spring Cloud 的微服务架构设计,以及结合 docker、k8s 做微服务容器化,自动化部署等一站式项目部署、落地。Go 语言学习,k8s 研究,边缘计算框架 KubeEdge 等。公众号 程序猿Damon 发起人。个人微信 MrNull008,个人网站:Damon | Micro-Service | Containerization | DevOps,欢迎來撩。

欢迎关注:InfoQ

欢迎关注:腾讯自媒体专栏

精彩推荐

欢迎关注




发布于: 2021 年 05 月 19 日阅读数: 1105
用户头像

Damon

关注

God bless the fighters. 2020.03.11 加入

欢迎关注公众号:程序猿Damon,长期从事Java开发,研究Springcloud的微服务架构设计。目前主要从事基于K8s云原生架构研发的工作,Golang开发,长期研究边缘计算框架KubeEdge、调度框架Volcano、容器云KubeSphere研究

评论

发布
暂无评论
论Http、Socket、WebSocket、WebService(SOAP)之间的区别