WebSocket与 Socket的区别

关于 WebSocket协议

  • WebSocket是应用层协议, 基于 TCP协议的, 只需完成一次 Http请求, 就能与服务端建立持久性的连接, 进行数据双向传输, 直到关闭请求, 此协议出来之前 Web应用只能通过 ajax轮询或 long poll方式频繁 Http请求, 来获取实时数据, 导致严重浪费资源, 且 Http请求的 Head信息量也多, 并发压力大的情况也无法保证短时间间隔, 远不如通过 WebSocket协议实现的双向数据传输方式

连接过程

  1. WebSocket在首次 Http请求时请求头里主要包含

Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: 7gcWknWVyxiBBua8ZCsfrQ==
Connection: Upgrade
Upgrade: websocket

  • Connection: Upgrade和 Upgrade: websocket告知 Apache, Nginx等服务器要切换协议, 请求换成 WebSocket协议
  • Sec-WebSocket-Version锁定 WebSocket协议版本, 为了避免不兼容
  • Sec-WebSocket-Extensions用于协议扩展(增强)
  • Sec-WebSocket-Key浏览器随机生成的 Base64 encode值, 用于标识此次连接
  1. 服务器响应头信息

Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 96SudKfGB54Oo8FX2X3O3TeJRRk=

  • Upgrade: websocket和 Connection: Upgrade告知浏览器协议切换成功
  • Sec-WebSocket-Accept是将浏览器传过去的 Sec-WebSocket-Key再次加密后返回给浏览器的, 用于证明连接成功
  1. 通过 WebSocket协议实现的聊天室网站, 参考地址 https://getstream.io/chat/demos/team/

请求网址:wss://chat-us-east-1.stream-io-api.com/connect?json=%7B%22user_id%22%3A%22raspy-wave-1%22%2C%22user_details%22%3A%7B%22id%22%3A%22raspy-wave-1%22%2C%22name%22%3A%22Raspy%20wave%22%2C%22image%22%3A%22https%3A%2F%2Fgetstream.io%2Frandom_png%2F%3Fname%3DRaspy%2Bwave%22%7D%2C%22user_token%22%3A%22eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoicmFzcHktd2F2ZS0xIn0.FW-TvKdSgvKCu3cQLrYkHYn8vrz73gH8Dur0wYAFx1E%22%2C%22server_determines_connection_id%22%3Atrue%7D&api_key=gx5a64bj4ptz&authorization=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoicmFzcHktd2F2ZS0xIn0.FW-TvKdSgvKCu3cQLrYkHYn8vrz73gH8Dur0wYAFx1E&stream-auth-type=jwt&x-stream-client=stream-chat-javascript-client-browser-1.6.2
请求方法: GET
远程地址: 52.71.169.154:443
状态码: 101 Switching Protocols
版本: HTTP/1.1

响应头:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 96SudKfGB54Oo8FX2X3O3TeJRRk=

请求头:
Host: chat-us-east-1.stream-io-api.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Sec-WebSocket-Version: 13
Origin: https://getstream.io
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: 7gcWknWVyxiBBua8ZCsfrQ==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

关于 Socket接口(网络编程)

  • 通常讲的 Socket是网络编程里应用层与 TCP/UDP(传输层)之间的(抽象层)接口, 另外一个是 Unix操作系统中的文件系统
  • 网络编程的 Socket连接需要一对套接字(双向通信的端点), 服务器端和客户端, 之间的连接分为三个步骤:
  1. 服务器监听: 服务器端不定位具体的客户端, 处于等待连接的状态, 实时监控网络状态
  2. 客户端请求: 由客户端先请求连接, 将自己的套接字描述发给服务器端
  3. 连接确认: 当服务器端监听到或接收到客户端的连接请求时, 服务器端先建立一个新的线程, 把服务器端的套接字描述发给客户端, 最后客户端确认此描述, 意味着建立了一个连接, 而服务器端套接字继续处于监听状态, 继续接收其他客户端连接请求
  • Socket连接可以指定两种传输层协议, 即 TCP或 UDP, 当指定 TCP建立连接时, 该 Socket连接叫做 TCP连接, 而采用 UDP, 就叫 UDP连接, 非连接

简单比较

  • WebSocket与 Socket没有任何关系. 就好像 Java与 JavaScript的关系
  • WebSocket是应用层协议, 但 Socket网络编程接口, 而不是协议
  • 协议选择上 WebSocket优先, 然后是通过 Socket接口实现 TCP, 或者实时性要求极高, 且可以容忍偶尔丢包的情况可以选择 UDP

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

猜你喜欢

转载自blog.csdn.net/qcl108/article/details/106676730
今日推荐