jia*_*103 5 networking udp netcat debian-jessie
在对此处描述的问题进行故障排除时,我尝试了一些非常基本的方法:我尝试通过 UDP 设置一个非常基本的 netcat 连接,但我发现它没有按预期工作。
与下面的 TCP 插图一样,我希望 UDP 案例在窗口 2 中输入时在窗口 1 上回显相同的输出;相反,在 UDP 情况下,我在窗口 1 中没有输出。
我在笔记本电脑上运行 Debian Jessie,并且使用以下捕获过滤器运行 Wireshark:
udp and not (port 123 or port 5353 or port 1900)
Run Code Online (Sandbox Code Playgroud)
在一个终端窗口中,我通过运行以下命令开始了 TCP 测试:
$ nc -l 6900
Run Code Online (Sandbox Code Playgroud)
在第二个终端窗口中,我运行了以下命令:
$ nc localhost 6900
Run Code Online (Sandbox Code Playgroud)
在窗口 2 中,我键入“one”并按 Enter,然后键入“two”并按 Enter,最后按 Ctrl+D 退出。
在“one”上按 Enter 后,我看到“one”在窗口 1 中回显。在“two”上按 Enter 后,我看到“two”在窗口 1 中回显。当我按下 Ctrl+D 时,两个 netcat 实例都退出并返回到提示。
这表明我可以毫无问题地建立 TCP 连接。接下来,我尝试了UDP。
窗口 1:
$ nc -l -u 6900
Run Code Online (Sandbox Code Playgroud)
窗口 2:
$ nc -u localhost 6900
Run Code Online (Sandbox Code Playgroud)
这很有趣。我想我只能输入“一”,按回车,然后“二”,然后按回车,然后我就自动回到了窗口 2 中的提示。
在窗口 1 上,我没有看到任何输出。
我-v
在窗口 1 中重试:
$ nc -v -l -u 6900
Listening on [0.0.0.0] (family 0, port 6900)
Run Code Online (Sandbox Code Playgroud)
当我-v
在窗口 2 中重试时很有趣:
$ nc -v -u localhost 6900
$
Run Code Online (Sandbox Code Playgroud)
就像 netcat 从来没有跑过一样;我立即返回提示。
更新:如果我替换localhost
为127.0.0.1
,则有进展。
随着“服务器”在窗口 1 中侦听:
$ nc -v -l -u 6900
one
two
three
Run Code Online (Sandbox Code Playgroud)
键入“一”、“二”和“三”时,我能够从 Window 2 得到输出:
$ nc -u 127.0.0.1 6900
one
two
three
^C
Run Code Online (Sandbox Code Playgroud)
将-v
一直困扰着,因为它是与上面相同。
使用 macOS,我得出了不同的结论。关键是IPv6。localhost
解析为 IPv6 和 IPv4。但是,以下命令行将导致nc
侦听 IPv4:
nc -l -u 6900
Run Code Online (Sandbox Code Playgroud)
结果:
$ lsof -n -i:6900
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 63923 fuzzy 3u IPv4 0xad7f669b928a178b 0t0 UDP *:6900
Run Code Online (Sandbox Code Playgroud)
现在,当您使用它来“连接”时:
nc -u localhost 6900
Run Code Online (Sandbox Code Playgroud)
...它实际上连接到 IPv6。当你使用127.0.0.1
它不会。
但是,它不会连接,因为 UDP 是无连接的。因此,无法知道连接的远程端是否真的存在。因此,它无法检测到它应该回退到 IPv4。您的消息将被发送,但没有任何东西在监听这些消息。
发送时,可以观察到以下情况:
$ tcpdump -i lo0 udp port 6900
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
00:46:37.543273 IP6 localhost.54473 > localhost.6900: UDP, length 6
Run Code Online (Sandbox Code Playgroud)
使用 TCP,它将尝试在 IPv6 上连接,确定这不起作用,然后使用 IPv4 重试:
$ tcpdump -i lo0 port 6900
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
00:50:21.495107 IP6 localhost.64306 > localhost.6900: Flags [SEW], seq 1432891337, win 65535, options [mss 16324,nop,wscale 5,nop,nop,TS val 766376063 ecr 0,sackOK,eol], length 0
00:50:21.495136 IP6 localhost.6900 > localhost.64306: Flags [R.], seq 0, ack 1432891338, win 0, length 0
00:50:21.495231 IP localhost.64307 > localhost.6900: Flags [S], seq 307818799, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 766376063 ecr 0,sackOK,eol], length 0
00:50:21.495283 IP localhost.6900 > localhost.64307: Flags [S.], seq 4254625238, ack 307818800, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 766376063 ecr 766376063,sackOK,eol], length 0
00:50:21.495295 IP localhost.64307 > localhost.6900: Flags [.], ack 1, win 12759, options [nop,nop,TS val 766376063 ecr 766376063], length 0
00:50:21.495306 IP localhost.6900 > localhost.64307: Flags [.], ack 1, win 12759, options [nop,nop,TS val 766376063 ecr 766376063], length 0
Run Code Online (Sandbox Code Playgroud)
您可以强制nc
使用 IPv4:
nc -4u localhost 6900
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10023 次 |
最近记录: |