如何使用netcat/socat/telnet手动连接到websocket



我正试图"手动"连接到参考websocket echo服务器,以了解协议的工作原理(我使用socat)。但是,服务器总是在不提供答案的情况下关闭连接。知道为什么吗?

我是这样做的:

socat - TCP:echo.websocket.org:80

然后,我在终端中粘贴以下文本:

GET /?encoding=text HTTP/1.1
Origin: http://www.websocket.org
Connection: Upgrade
Host: echo.websocket.org
Sec-WebSocket-Key: P7Kp2hTLNRPFMGLxPV47eQ==
Upgrade: websocket
Sec-WebSocket-Version: 13

我在同一台机器上的firefox中嗅探了与开发人员工具的连接参数,在那里它可以完美地工作:因此,我认为它们是正确的。但是,在那之后,服务器会立即关闭连接,而不会提供答案。为什么?如何"手动"实现协议?

我想在我的终端中进行类型测试,并让服务器用我键入的内容进行回复(它在网络浏览器中工作)。

我认为您想修改套接字流以将\n(换行)转换为CRLF。执行info socat生成详细信息,其中包括以下修饰符:

crnl   Converts the default line termination character NL ('n',  0x0a)
       to/from CRNL ("rn", 0x0d0a) when writing/reading on this chan-
       nel (example).  Note: socat simply strips all CR characters.

所以我认为你应该能够做到这一点:

socat - TCP:echo.websocket.org:80,crnl

我想补充一点,我的WebSocket工具weblocat可以帮助调试WebSocket协议,尤其是与socat:结合使用时

$ websocat - ws-c:sh-c:"socat -v -x - tcp:echo.websocket.org:80" --ws-c-uri ws://echo.websocket.org
> 2018/07/03 16:30:06.021658  length=157 from=0 to=156
 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a  GET / HTTP/1.1..
 48 6f 73 74 3a 20 65 63 68 6f 2e 77 65 62 73 6f  Host: echo.webso
 63 6b 65 74 2e 6f 72 67 0d 0a                    cket.org..
 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 55 70 67 72  Connection: Upgr
 61 64 65 0d 0a                                   ade..
 55 70 67 72 61 64 65 3a 20 77 65 62 73 6f 63 6b  Upgrade: websock
 65 74 0d 0a                                      et..
 53 65 63 2d 57 65 62 53 6f 63 6b 65 74 2d 56 65  Sec-WebSocket-Ve
 72 73 69 6f 6e 3a 20 31 33 0d 0a                 rsion: 13..
 53 65 63 2d 57 65 62 53 6f 63 6b 65 74 2d 4b 65  Sec-WebSocket-Ke
 79 3a 20 59 76 36 32 44 31 57 6d 7a 79 79 31 65  y: Yv62D1Wmzyy1e
 69 6d 62 47 6d 68 69 61 67 3d 3d 0d 0a           imbGmhiag==..
 0d 0a                                            ..
--
< 2018/07/03 16:30:06.164057  length=201 from=0 to=200
 48 54 54 50 2f 31 2e 31 20 31 30 31 20 57 65 62  HTTP/1.1 101 Web
 20 53 6f 63 6b 65 74 20 50 72 6f 74 6f 63 6f 6c   Socket Protocol
 20 48 61 6e 64 73 68 61 6b 65 0d 0a               Handshake..
 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 55 70 67 72  Connection: Upgr
 61 64 65 0d 0a                                   ade..
 44 61 74 65 3a 20 54 75 65 2c 20 30 33 20 4a 75  Date: Tue, 03 Ju
 6c 20 32 30 31 38 20 31 33 3a 31 35 3a 30 30 20  l 2018 13:15:00 
 47 4d 54 0d 0a                                   GMT..
 53 65 63 2d 57 65 62 53 6f 63 6b 65 74 2d 41 63  Sec-WebSocket-Ac
 63 65 70 74 3a 20 55 56 6a 32 74 35 50 43 7a 62  cept: UVj2t5PCzb
 58 49 32 52 4e 51 75 70 2f 71 48 31 63 5a 44 6e  XI2RNQup/qH1cZDn
 38 3d 0d 0a                                      8=..
 53 65 72 76 65 72 3a 20 4b 61 61 7a 69 6e 67 20  Server: Kaazing 
 47 61 74 65 77 61 79 0d 0a                       Gateway..
 55 70 67 72 61 64 65 3a 20 77 65 62 73 6f 63 6b  Upgrade: websock
 65 74 0d 0a                                      et..
 0d 0a                                            ..
--
ABCDEF
> 2018/07/03 16:30:12.707919  length=13 from=157 to=169
 82 87 40 57 f5 88 01 15 b6 cc 05 11 ff           ..@W.........
--
< 2018/07/03 16:30:12.848398  length=9 from=201 to=209
 82 07 41 42 43 44 45 46 0a                       ..ABCDEF.
--
ABCDEF
> 2018/07/03 16:30:14.528333  length=6 from=170 to=175
 88 80 18 ec 05 a8                                ......
--
< 2018/07/03 16:30:14.671629  length=2 from=210 to=211
 88 00                                            ..
--

如果手动驱动的socat -v -x - TCP:echo.websocket.org:80,crnl(在另一个答案中提到)出现故障,您可以在上面描述的会话中将其与WebSocat驱动的socat进行比较。

带有socat调试转储的反向(服务器)示例:

socat -v -x tcp-l:1234,fork,reuseaddr exec:'websocat -t ws-u:stdio: mirror:'

或者,这里有一种方法可以从命令行仅使用corephp连接并读取wss安全websocket流中的流。

php -r '$sock=stream_socket_client("tls://echo.websocket.org:443",$e,$n,30,STREAM_CLIENT_CONNECT,stream_context_create(null));if(!$sock){echo"[$n]$e".PHP_EOL;}else{fwrite($sock,"GET / HTTP/1.1rnHost: echo.websocket.orgrnAccept: */*rnConnection: UpgradernUpgrade: websocketrnSec-WebSocket-Version: 13rnSec-WebSocket-Key: ".rand(0,999)."rnrn");while(!feof($sock)){var_dump(fgets($sock,2048));}}'

其他类似的例子,从另一个wss服务器拉:(不要得到rekt)

php -r '$sock=stream_socket_client("tls://stream.binance.com:9443",$e,$n,30,STREAM_CLIENT_CONNECT,stream_context_create(null));if(!$sock){echo"[$n]$e".PHP_EOL;}else{fwrite($sock,"GET /stream?streams=btcusdt@kline_1m HTTP/1.1rnHost: stream.binance.com:9443rnAccept: */*rnConnection: UpgradernUpgrade: websocketrnSec-WebSocket-Version: 13rnSec-WebSocket-Key: ".rand(0,999)."rnrn");while(!feof($sock)){var_dump(explode(",",fgets($sock,512)));}}'

相关内容

  • 没有找到相关文章

最新更新