我需要用作websockify
代理。最终设置将是:
- 网页上的 websocket 连接到
websockify
同一台机器上的服务器 websockify
服务器发起与在其他地方监听的 TCP 套接字程序的连接(在本例中为同一台机器)- TCP套接字接收信息,执行计算,回答
websockify
websockify
得到答案,并将信息发送到网页上的套接字- 答案显示在用户的浏览器中
然而,由于某种原因,websockify
拒绝进一步传递信息并比预期更早收到 FIN 消息。Websockify 显示“不支持:未知操作码 0x01”。
为了调查此案,我创建了一个 MWE 并使用 拦截了流量tcpdump
。
设置如下:
首先,我运行
netcat -v -v -l -p 40000
- 这就是我们想要接收信息的应用程序然后,我运行
websockify --verbose 50000 localhost:40000
- 这是代理命令最后,我运行- 这是一个与代理
wscat -c localhost:50000
建立 websocket 连接的应用程序websockify
当我用 发送某些内容时wscat
,wscat
的连接就会断开,代码为 1003。引用RFC 6455:
1003 表示端点正在终止连接,因为它收到了无法接受的数据类型(例如,如果端点收到二进制消息,则只能理解文本数据的端点可能会发送此数据)。
下面是该设置的直观表示(错误消息‘由于关闭 1003 而断开连接’之所以这样写,是因为我手动改变了源代码以提取有关断开连接的更多信息):
以下是引起我注意的第 11、12、13 和 14 号数据包:
Frame 11: 81 bytes on wire (648 bits), 81 bytes captured (648 bits)
Encapsulation type: Ethernet (1)
Arrival Time: Sep 19, 2017 20:35:46.491762000 CEST
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1505846146.491762000 seconds
[Time delta from previous captured frame: 3.788711000 seconds]
[Time delta from previous displayed frame: 3.788711000 seconds]
[Time since reference or first frame: 3.887638000 seconds]
Frame Number: 11
Frame Length: 81 bytes (648 bits)
Capture Length: 81 bytes (648 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ethertype:ip:tcp:http:websocket:data-text-lines]
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)
Destination: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Source: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 67
Identification: 0x1581 (5505)
Flags: 0x02 (Don't Fragment)
0... .... = Reserved bit: Not set
.1.. .... = Don't fragment: Set
..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0x2732 [validation disabled]
[Header checksum status: Unverified]
Source: 127.0.0.1
Destination: 127.0.0.1
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]
TCP Src Port: 53832, Dst Port: 50000, Seq: 225, Ack: 130, Len: 15
Src Port: 53832
Dest Port: 50000
[Stream index: 0]
[TCP Segment Len: 15]
Sequence number: 225 (relative sequence number)
[Next sequence number: 240 (relative sequence number)]
Acknowledgment number: 130 (relative ack number)
1000 .... = Header Length: 32 bytes (8)
Flags: 0x018 (PSH, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 1... = Push: Set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······AP···]
Window size value: 350
[Calculated window size: 44800]
[Window size scaling factor: 128]
Checksum: 0xfe37 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - Timestamps: TSval 1764320477, TSecr 1764319312
Kind: Time Stamp Option (8)
Length: 10
Timestamp value: 1764320477
Timestamp echo reply: 1764319312
[SEQ/ACK analysis]
[iRTT: 0.000021000 seconds]
[Bytes in flight: 15]
[Bytes sent since last PSH flag: 15]
TCP payload (15 bytes)
[PDU Size: 15]
WebSocket
1... .... = Fin: True
.000 .... = Reserved: 0x0
.... 0001 = Opcode: Text (1)
1... .... = Mask: True
.000 1001 = Payload length: 9
Masking-Key: 2f0bda1c
Masked payload
Payload
Line-based text data
alamakota
Frame 12: 102 bytes on wire (816 bits), 102 bytes captured (816 bits)
Encapsulation type: Ethernet (1)
Arrival Time: Sep 19, 2017 20:35:46.492378000 CEST
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1505846146.492378000 seconds
[Time delta from previous captured frame: 0.000616000 seconds]
[Time delta from previous displayed frame: 0.000616000 seconds]
[Time since reference or first frame: 3.888254000 seconds]
Frame Number: 12
Frame Length: 102 bytes (816 bits)
Capture Length: 102 bytes (816 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ethertype:ip:tcp:http:websocket]
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)
Destination: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Source: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 88
Identification: 0xd42e (54318)
Flags: 0x02 (Don't Fragment)
0... .... = Reserved bit: Not set
.1.. .... = Don't fragment: Set
..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0x686f [validation disabled]
[Header checksum status: Unverified]
Source: 127.0.0.1
Destination: 127.0.0.1
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]
TCP Src Port: 50000, Dst Port: 53832, Seq: 130, Ack: 240, Len: 36
Src Port: 50000
Dest Port: 53832
[Stream index: 0]
[TCP Segment Len: 36]
Sequence number: 130 (relative sequence number)
[Next sequence number: 166 (relative sequence number)]
Acknowledgment number: 240 (relative ack number)
1000 .... = Header Length: 32 bytes (8)
Flags: 0x018 (PSH, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 1... = Push: Set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······AP···]
Window size value: 350
[Calculated window size: 44800]
[Window size scaling factor: 128]
Checksum: 0xfe4c [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - Timestamps: TSval 1764320478, TSecr 1764320477
Kind: Time Stamp Option (8)
Length: 10
Timestamp value: 1764320478
Timestamp echo reply: 1764320477
[SEQ/ACK analysis]
[This is an ACK to the segment in frame: 11]
[The RTT to ACK the segment was: 0.000616000 seconds]
[iRTT: 0.000021000 seconds]
[Bytes in flight: 36]
[Bytes sent since last PSH flag: 36]
TCP payload (36 bytes)
[PDU Size: 36]
WebSocket
1... .... = Fin: True
.000 .... = Reserved: 0x0
.... 1000 = Opcode: Connection Close (8)
0... .... = Mask: False
.010 0010 = Payload length: 34
Payload
Close
Status code: Unsupported Data (1003)
Reason: Unsupported: Unknown opcode 0x01
Frame 13: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)
Encapsulation type: Ethernet (1)
Arrival Time: Sep 19, 2017 20:35:46.492394000 CEST
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1505846146.492394000 seconds
[Time delta from previous captured frame: 0.000016000 seconds]
[Time delta from previous displayed frame: 0.000016000 seconds]
[Time since reference or first frame: 3.888270000 seconds]
Frame Number: 13
Frame Length: 66 bytes (528 bits)
Capture Length: 66 bytes (528 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ethertype:ip:tcp]
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)
Destination: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Source: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 52
Identification: 0x1582 (5506)
Flags: 0x02 (Don't Fragment)
0... .... = Reserved bit: Not set
.1.. .... = Don't fragment: Set
..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0x2740 [validation disabled]
[Header checksum status: Unverified]
Source: 127.0.0.1
Destination: 127.0.0.1
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]
TCP Src Port: 53832, Dst Port: 50000, Seq: 240, Ack: 166, Len: 0
Src Port: 53832
Dest Port: 50000
[Stream index: 0]
[TCP Segment Len: 0]
Sequence number: 240 (relative sequence number)
Acknowledgment number: 166 (relative ack number)
1000 .... = Header Length: 32 bytes (8)
Flags: 0x010 (ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······A····]
Window size value: 350
[Calculated window size: 44800]
[Window size scaling factor: 128]
Checksum: 0xfe28 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - Timestamps: TSval 1764320478, TSecr 1764320478
Kind: Time Stamp Option (8)
Length: 10
Timestamp value: 1764320478
Timestamp echo reply: 1764320478
[SEQ/ACK analysis]
[This is an ACK to the segment in frame: 12]
[The RTT to ACK the segment was: 0.000016000 seconds]
[iRTT: 0.000021000 seconds]
Frame 14: 106 bytes on wire (848 bits), 106 bytes captured (848 bits)
Encapsulation type: Ethernet (1)
Arrival Time: Sep 19, 2017 20:35:46.494661000 CEST
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1505846146.494661000 seconds
[Time delta from previous captured frame: 0.002267000 seconds]
[Time delta from previous displayed frame: 0.002267000 seconds]
[Time since reference or first frame: 3.890537000 seconds]
Frame Number: 14
Frame Length: 106 bytes (848 bits)
Capture Length: 106 bytes (848 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ethertype:ip:tcp:http:websocket]
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)
Destination: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Source: 00:00:00_00:00:00 (00:00:00:00:00:00)
Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 92
Identification: 0x1583 (5507)
Flags: 0x02 (Don't Fragment)
0... .... = Reserved bit: Not set
.1.. .... = Don't fragment: Set
..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0x2717 [validation disabled]
[Header checksum status: Unverified]
Source: 127.0.0.1
Destination: 127.0.0.1
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]
TCP Src Port: 53832, Dst Port: 50000, Seq: 240, Ack: 166, Len: 40
Src Port: 53832
Dest Port: 50000
[Stream index: 0]
[TCP Segment Len: 40]
Sequence number: 240 (relative sequence number)
[Next sequence number: 280 (relative sequence number)]
Acknowledgment number: 166 (relative ack number)
1000 .... = Header Length: 32 bytes (8)
Flags: 0x018 (PSH, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 1... = Push: Set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······AP···]
Window size value: 350
[Calculated window size: 44800]
[Window size scaling factor: 128]
Checksum: 0xfe50 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - Timestamps: TSval 1764320478, TSecr 1764320478
Kind: Time Stamp Option (8)
Length: 10
Timestamp value: 1764320478
Timestamp echo reply: 1764320478
[SEQ/ACK analysis]
[iRTT: 0.000021000 seconds]
[Bytes in flight: 40]
[Bytes sent since last PSH flag: 40]
TCP payload (40 bytes)
[PDU Size: 40]
WebSocket
1... .... = Fin: True
.000 .... = Reserved: 0x0
.... 1000 = Opcode: Connection Close (8)
1... .... = Mask: True
.010 0010 = Payload length: 34
Masking-Key: 3daec4d6
Masked payload
Payload
Close
Status code: Unsupported Data (1003)
Reason: Unsupported: Unknown opcode 0x01
它似乎wscat
发送了一个操作码(0x1),但它websockify
被理解为 0x01 并且无法识别,但我不知道为什么。
我如何让这个设置工作?我尝试websockify
使用不同的程序(浏览器 websocket 实现、wscat
替代方案)进行连接,但都失败了。
答案1
我遇到了同样的问题:
socket.send("hi"); // websockify chokes
...通过以下方法修复:
b = new Blob(["hi", "\n"], {type: 'text/plain'});
socket.send(b); // works as expected