一个数据包可以包含多个Websocket吗?

Wor*_*ess 2 wireshark websocket

当我注意到这种框架时,我正在使用 Wireshark 检查服务器和浏览器之间的 websocket 流量:

No.     Time           Source          Destination   Protocol  Length Info
 144342 8212.033150000 127.0.0.1       127.0.0.1     WebSocket 821    WebSocket Text [FIN] 

Frame 144342: 821 bytes on wire (6568 bits), 821 bytes captured (6568 bits) on interface 0
Ethernet II, Src: 00:00:00_00:00:00 (00:00:00:00:00:00), Dst: 00:00:00_00:00:00 (00:00:00:00:00:00)
Internet Protocol Version 4, Src: 127.0.0.1 (127.0.0.1), Dst: 127.0.0.1 (127.0.0.1)
Transmission Control Protocol, Src Port: http-alt (8080), Dst Port: 53749 (53749), Seq: 1132, Ack: 603, Len: 755
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x00
    .... 0001 = Opcode: Text (1)
    0... .... = Mask: False
    .111 1110 = Payload length: 126 Extended Payload Length (16 bits)
    Extended Payload length (16 bits): 140
    Payload
        Text: {"type":"COLLABORATIVE_COMMANDS","remoteUser":"null","key":"1c78c08f-5d2d-445a-a63c-3a211d2f0336","messageBroadcast":{"smartPath":["null"]}}
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x00
    .... 0001 = Opcode: Text (1)
    0... .... = Mask: False
    .111 1110 = Payload length: 126 Extended Payload Length (16 bits)
    Extended Payload length (16 bits): 329
    Payload
        Text [truncated]: {"type":"COLLABORATIVE_COMMANDS","remoteUser":"","key":"1c78c08f-5d2d-445a-a63c-3a211d2f0336","messageBroadcast":{"cameraInfos":{"target":{"x":0,"y":0,"z":0},"camPos":{"x":557.0133301398326,"y":159.5460628202445,"z":342.4
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x00
    .... 0001 = Opcode: Text (1)
    0... .... = Mask: False
    .111 1110 = Payload length: 126 Extended Payload Length (16 bits)
    Extended Payload length (16 bits): 141
    Payload
        Text: {"type":"COLLABORATIVE_COMMANDS","remoteUser":"","key":"1c78c08f-5d2d-445a-a63c-3a211d2f0336","messageBroadcast":{"colourEditedMeshes":true}}
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x00
    .... 0001 = Opcode: Text (1)
    0... .... = Mask: False
    .111 1110 = Payload length: 126 Extended Payload Length (16 bits)
    Extended Payload length (16 bits): 129
    Payload
        Text: {"type":"COLLABORATIVE_COMMANDS","remoteUser":"","key":"1c78c08f-5d2d-445a-a63c-3a211d2f0336","messageBroadcast":{"explode":"0"}}
Run Code Online (Sandbox Code Playgroud)

这是否意味着我的数据包中有多个网络套接字?这怎么可能 ?

Rem*_*eau 6

如果您阅读 WebSocket 规范RFC 6455,您将看到 WebSocket 数据包是成帧的,其中每个帧都有自己的标头和有效负载。请记住,TCP 是流式传输。发送方和接收方并不关注 TCP 帧,而是关注这些帧内的有效负载。WebSocket 发送方将发送一个 WebSocket 标头及其有效负载,然后是下一个 WebSocket 标头及其有效负载,依此类推。WebSocket 接收器将读取 WebSocket 标头及其有效负载,然后读取下一个 WebSocket 标头及其有效负载,依此类推。通常,Nagle 算法在 TCP 套接字上启用,它会根据高效网络传输的需要将应用程序数据拆分并组合成 TCP 帧。这是由对应用程序透明的 TCP 堆栈处理的。因此,是的,如果 Nagle 决定以这种方式传输它们,则可以看到多个 WebSocket 帧出现在单个 TCP 帧内。如果 WebSocket 数据包在短时间内发送,Nagle 可能会将它们合并,因此只需传输单个 TCP 帧,而不是单独的 TCP 帧。