刨根问底HTTP和WebSocket协议(二)

供稿:hz-xin.com     日期:2024-04-30

上篇介绍了HTTP1.1协议的基本内容,这篇文章将继续分析WebSocket协议,然后对这两个进行简单的比较。

WebSocket协议还很年轻,RFC文档相比HTTP的发布时间也很短,它的诞生是为了创建一种「 双向通信 」的协议,来作为HTTP协议的一个替代者。那么首先看一下它和HTTP(或者HTTP的长连接)的区别。

上一篇中提到WebSocket的目的就是解决网络传输中的双向通信的问题,HTTP1.1默认使用持久连接(persistent connection),在一个TCP连接上也可以传输多个Request/Response消息对,但是HTTP的基本模型还是一个Request对应一个Response。这在双向通信(客户端要向服务器传送数据,同时服务器也需要实时的向客户端传送信息,一个聊天系统就是典型的双向通信)时一般会使用这样几种解决方案:

WebSocket的目的是取代HTTP在双向通信场景下的使用,而且它的实现方式有些也是基于HTTP的(WS的默认端口是 80 和 443 )。现有的网络环境(客户端、服务器、网络中间人、代理等)对HTTP都有很好的支持,所以这样做可以充分利用现有的HTTP的基础设施,有点向下兼容的意味。

简单来讲,WS协议有两部分组成:握手和数据传输。

出于兼容性的考虑,WS的握手使用HTTP来实现(此文档中提到未来有可能会使用专用的端口和方法来实现握手),客户端的握手消息就是一个「普通的,带有Upgrade头的,HTTP Request消息」。所以这一个小节到内容大部分都来自于RFC2616,这里只是它的一种应用形式,下面是RFC6455文档中给出的一个客户端握手消息示例:

可以看到,前两行跟HTTP的Request的起始行一模一样,而真正在WS的握手过程中起到作用的是下面几个header域。

如果服务器接受了这个请求,可能会发送如下这样的返回信息,这是一个标准的HTTP的Response消息。 101 表示服务器收到了客户端切换协议的请求,并且同意切换到此协议。RFC2616规定只有切换到的协议「比HTTP1.1更好」的时候才能同意切换。

ws协议默认使用 80 端口,wss协议默认使用 443 端口。

在握手之前,客户端首先要先建立连接,一个客户端对于一个相同的目标地址(通常是域名或者IP地址,不是资源地址)同一时刻只能有一个处于CONNECTING状态(就是正在建立连接)的连接。从建立连接到发送握手消息这个过程大致是这样的:

如果客户端没有处于代理环境中,它就要首先建立一个到达目标地址的直接的TCP连接。

服务端指的是所有参与处理WebSocket消息的基础设施,比如如果某服务器使用Nginx(A)来处理WebSocket,然后把处理后的消息传给响应的服务器(B),那么A和B都是这里要讨论的服务端的范畴。

如果请求是HTTPS,则首先要使用TLS进行握手,如果失败,则关闭连接,如果成功,则之后的数据都通过此通道进行发送。

之后服务端可以进行一些客户端验证步骤(包括对客户端header域的验证),如果需要,则按照RFC2616来进行错误码的返回。

如果一切都成功,则返回成功的Response握手消息。

此握手消息是一个标准的HTTP Response消息,同时它包含了以下几个部分:

一旦这个握手发出去,服务端就认为此WebSocket连接已经建立成功,处于OPEN状态。它就可以开始发送数据了。

Sec-WebSocket-Version可以被通信双方用来支持更多的协议的扩展,RFC6455中定义的值为 13 ,WebSocket的客户端和服务端可能回自定义更多的版本号来支持更多的功能。其使用方法如上文所述。

WebSocket中所有发送的数据使用帧的形式发送。客户端发送的数据帧都要经过掩码处理,服务端发送的所有数据帧都不能经过掩码处理。否则对方需要发送关闭帧。

一个帧包含一个帧类型的标识码,一个负载长度,和负载。负载包括扩展内容和应用内容。

帧类型是由一个4位长的叫Opcode的值表示,任何WebSocket的通信方收到一个位置的帧类型,都要以连接失败的方式断开此连接。
RFC6455中定义的帧类型如下所示:

具体的每一项代表什么意思在这里就不做详细的阐述了。

同样作为应用层的协议,WebSocket在现代的软件开发中被越来越多的实践,和HTTP有很多相似的地方,这里将它们简单的做一个纯个人、非权威的比较:

这一篇简单地将WebSocket协议介绍了一遍,篇幅有点长了,数据帧也没有来得及详述。下篇会继续深扒WebSocket帧传输,另外将通过实例探讨一些WebSocket协议实际使用中的问题。

刨根问底HTTP和WebSocket协议(一)
WebSocket和Socket的区别(WebSocket外传)
刨根问底HTTP和WebSocket协议(三)



web前端开发都有哪些常见框架结构?
答:http是应用层的协议,它的传输层是tcp协议。可以说sock通信是web服务的底层通信,没有socket也就没有http协议,跟谈不上web服务了 二,体系架构 主要有c/s架构和b/s架构,c/s主要由一般需要在客户端安装的应用程序和远程...

HTML5 Web Socket和Web Worker的区别以及使用方法
答:一、WEB SOCKET 1、Web Socket是一种协议、本质上和http、tcp一样、协议是用来说明数据是如何传输的,写过一个小的在线聊天使用了socket.io、之后总结这个项目 2、Web Socket的前缀有两种:(1)ws:// 不是加密的、...

Web前端开发者应该要懂的HTTP协议!
答:分层的好处是把各个相对独立的功能解耦,层与层之间通过规定好的接口来通信。如果以后需要修改或者重写某一个层的实现,只要接口保持不变也不会影响到其他层的功能。如何理解HTTP与TCP/IP、DNS的关系呢?当客户端访问Web站点时...

http接口和webservice接口的区别
答:web service相对http (post/get)有好处吗?1.接口中实现的方法和要求参数一目了然 2.不用担心大小写问题 3.不用担心中文urlencode问题 4.代码中不用多次声明认证(账号,密码)参数 5.传递参数可以为数组,对象等...web ...

在游览器与WEB服务器之间信息交互的过程中使用的协议是什么
答:在游览器与WEB服务器之间信息交互的过程中使用的协议是HTTP。HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上...

TCP/IP和HTTP的区别和联系是什么?
答:tcp/ip 是个协议族 从链路层 一直到到应用层 而 http 只是应用层的一个web通讯协议 , 超文本链接协议 要想使网络通讯,除了需要网线把设备连接起来,还需要一些规定来规定怎样通讯发射怎样的东西,代表什么样的意思,...

HTTP协议是什么意思
答:HTTP 协议定义服务器端和客户端之间文件传输的沟通方式。目前HTTP协议的版本是Http1.1。RFC 2616描述了HTTP协议的具体信息。这个协议已经成为浏览器和Web站点之间的标准。当我上网的时候底层是如何进行交互的?当访问者点击一个...

web浏览器和服务器使用http协议不能确保通信的
答:可靠性。HTTP协议的作用,它规定了浏览器和Web服务器通信数据的格式,也就是说浏览器和web服务器通信需要使用http协议,但是不能http协议不能确保通信的可靠性。因为该协议较为简单,在网络数据传输中信息处于非加密状态,也就...

http接口和webservice接口的区别在哪?
答:web service相对http (post/get)有好处吗?1.接口中实现的方法和要求参数一目了然 2.不用担心大小写问题 3.不用担心中文urlencode问题 4.代码中不用多次声明认证(账号,密码)参数 5.传递参数可以为数组,对象等...web ...

http 协议和 web 应用有状态和无状态
答:1、什么是 Web 应用程序的无状态性?说基于 http 协议的 web 应用程序是请求——应答模式是无状态的,我们可以这样理解:每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面...