为啥 WebSocket 实现在传输多个文件时比 HTTP/2 Push 慢? (Node.js / 去)

Posted

技术标签:

【中文标题】为啥 WebSocket 实现在传输多个文件时比 HTTP/2 Push 慢? (Node.js / 去)【英文标题】:Why is WebSocket implementation slower than HTTP/2 Push at transferring multiple files? (Node.js / Go)为什么 WebSocket 实现在传输多个文件时比 HTTP/2 Push 慢? (Node.js / 去) 【发布时间】:2017-08-03 17:53:04 【问题描述】:

我一直在 Node 和 Go 中试验 WebSockets 和 HTTP/2 库。我的基本设置是创建客户端和服务器,从服务器重复发送文件并测量每个文件在客户端可用之前的时间。

令我惊讶的是,HTTP/2 Push 实现的性能明显优于 WebSocket(总时间快 5 倍以上)。我做错了吗?

下面是我的Gorilla WebSocket 和node-ws 服务器:

package main

import (
  "net/http"
  "io/ioutil"
  "log"
  "github.com/gorilla/websocket"
)

var file []byte

var upgrader = websocket.Upgrader
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,


func handler(w http.ResponseWriter, r *http.Request) 
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil 
        log.Fatal(err)
    

    for i := 0; i < 100; i++ 
      conn.WriteMessage(2, file)
    


func main() 
  file, _ = ioutil.ReadFile("<path-to-file>")

  http.HandleFunc("/", handler)
  err := http.ListenAndServeTLS(":443", "<path-to-cert>", "<path-to-key>", nil)
  if err != nil 
    panic("ListenAndServe: " + err.Error())
  

节点

const WebSocket = require('ws');
const https = require('https');
const fs = require('fs');

const options = 
  key: fs.readFileSync('<path-to-key>'),
  cert: fs.readFileSync('<path-to-cert>')
;

var file = fs.readFileSync('<path-to-file>')

var httpServer = new https.createServer(options).listen(443);

var wss = new WebSocket.Server(
  server: httpServer,
  perMessageDeflate: false
);

wss.on('connection', function(ws) 
  for (let i = 0; i < repetition; i++) 
    ws.send(file);
  
);

【问题讨论】:

你只显示了三分之一的相关代码(只显示了 Websocket 服务器,而不是 HTTP/2 推送或客户端实现)并询问了你没有粘贴的结果(但你做了总结)......我们应该如何应对? 另外注意:HTTP/2 推送既有浏览器上 HTTP 缓存的优点,也有 HTTP/2 是跨所有请求的持久 TCP/IP 连接的优点(没有新连接打开),而每次刷新页面时都会打开新的 Websocket 连接。我不确定您的要求是什么,但测试可能有点偏向 HTTP/2(当涉及到第一次客户端/连接时,这些速度是不正确的)。 【参考方案1】:

见https://github.com/gorilla/websocket/issues/228。 OP 正在测量使用 HTTP/2 Push 打开流的时间,而不是通过流传输所有数据的时间。 OP 发现 Websocket 比 HTTP/2 推送更快。

【讨论】:

以上是关于为啥 WebSocket 实现在传输多个文件时比 HTTP/2 Push 慢? (Node.js / 去)的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket 的实现

java socket多文件传输问题

WebSocket 是啥原理?为啥可以实现持久连接

java中怎么用socket 一次传多个文件啊?

[文档和源码分享] 基于QT和websocket协议的多线程文件传输

WebSocket