初识websocket

为什么需要websocket?

如果想要回答这个问题,那么需要从HTTP1.0、HTTP1.1、socket、Ajax轮询、Long poll说起~

HTTP 1.0协议

HTTP是一个短连接(非持久化),且通信只能由客户端发起HTTP协议做不到服务器主动向客户端推送消息。

HTTP协议这种单向请求的特点,注定了如果服务器有连接的状态变化时,客户端要获知就非常麻烦了。我们只能通过‘轮询’-每隔一段时间,就发出一个询问,了解服务器有没有新的信息。效率低、非常浪费资源。HTTP的生命周期通过 Request 来界定,也就是一个 Request 一个Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。

DNS域名解析

DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。

 

URL:统一资源定位符

统一资源定位符(Uniform Resource Locator, URL),又叫做网页地址,是互联网上标准的资源的地址(Address),用于描述一个网络上的资源。基本格式为:schema://host[:port]/path/[;url-params][?query-string][#anchor]

Ajax轮询

原理:让浏览器隔几秒钟就发送一次请求,询问服务器是否有新信息。(缺点:需要服务器有很快的处理速度和资源)

Long poll

原理:与ajax轮询原理差不多,都是采用轮询的方式,不过long poll采用的是阻塞模式(即:一直打电话,没收到就不挂电话)。也就是说,客户端发起连接后,如果没消息,就一直不返回response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。(缺点:需要服务器有很高的并发,也就是同时接待客户的能力)

 

HTTP1.1

HTTP1.1中进行了改进,支持长连接和请求的流水线处理。使得有一个keep-alive(默认开启Connection:keep-alive),也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是请记住 Request = Response,HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。

 

 

HTTP1.1是否可以取代websocket

我一直有一个疑惑:HTTP1.1里面已经有了keep-live,那么HTTP1.1本身就是一个长连接,还需要websocket做什么呢?

答案:需要。原因有以下几点:

  1. 开销:HTTP长连接的每次请求仍然需要发送头信息;而websocket仅需要在发送请求时发送头信息。
  2. 真正意义的长连接:HTTP长连接仅仅是为了复用TCP连接,只是一种口头约定,服务端可以不遵守;而websocket是完全意义上的长连接。
  3. 是否平等:http长连接依旧无法摆脱一个request对应一个response的模式,且仅允许客户端往服务端发送request,所以对于实时通信的实现依旧只能是轮询;而websocket双方是对等的,可以相互发送消息,可以实现真正意义的实时通信。

 

socket

Socket的意思是‘套接字’,它不是一个协议,是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,以实现进程在网络中通信。当两台主机通信时,让socket去组织数据,以符合指定的协议。

网络中的进程是通过socket来通信的。Socket是一种‘打开-读/写-关闭’模式的实现,服务器和客户端各自维护一个‘文件’,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。Socket是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

交互流程

 

socket三次握手

  

websocket

是一种网络通信协议(持久化),应用层协议。最大的特点是:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话

websocket 官网APIhttps://developer.mozilla.org/en-US/docs/Web/API/WebSocket

websocket 握手过程

websocket API中,浏览器和服务器只需要完成一次握手(为了建立一个Websocket连接,客户端首先要向服务器发送一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信息,其中附加信息‘Upgrade:Websocket’表明这是一个申请协议升级的HTTP请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器的websocket连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或服务器端的某一方主动的关闭连接。),两者之间就可以直接创建持久性的连接,并进行双向数据传输

 

Websocket 特点

  1. Websocket建立在TCP协议之上;
  2. 握手阶段采用HTTP协议;
  3. 可以发送文本/二进制数据;
  4. 数据格式比较轻量,性能开销小,通信高效。
  5. 协议标识符是ws。例如:ws://example.com:80/some/path
  6. 解决了轮询造成的同步延迟问题(服务端可以主动推送信息给客户端)
  7. 解决了服务器需要反复解析HTTP协议,减少了资源的开销(由于websocket只需要一次HTTP握手,服务端就能一直与客户端保持通信,直到关闭连接;且HTTP协议经常头部内容比主体内容还长也比较浪费资源)

 

 

 

python之socket接口测试

pip包:https://pypi.org/project/websocket_client/

 

posted @ 2020-04-27 15:44  小嘉欣  阅读(206)  评论(0编辑  收藏  举报