Mir*_*chi 32 networking udp netcat
我注意到一个使用netcat和UDP的奇怪行为.我启动一个侦听UDP端口的netcat实例(实例1):
nc -lu -p 10000
Run Code Online (Sandbox Code Playgroud)
所以我启动另一个netcat实例(实例2)并尝试将数据报发送到我的进程:
nc -u 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)
我看到了数据报.但是,如果我关闭实例2并重新启动netcat(实例3):
nc -u 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)
我无法在实例1的终端上看到数据报.实际上,操作系统在实例3处为实例2分配了不同的UDP源端口,问题在于:如果我使用相同的instance2源端口(例如50000):
nc -u -p 50000 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)
再次,netcat的实例1接收数据报.UDP是一种连接较少的协议,为什么呢?这是标准的netcat行为吗?
Dav*_*rtz 40
在nc
侦听UDP套接字时,它会"锁定"到它接收的第一个数据包的源端口和源IP.查看此跟踪:
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(10000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
recvfrom(3, "f\n", 2048, MSG_PEEK, {sa_family=AF_INET, sin_port=htons(52832), sin_addr=inet_addr("127.0.0.1")}, [16]) = 2
connect(3, {sa_family=AF_INET, sin_port=htons(52832), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到它创建了一个UDP套接字,将其设置为地址重用,并将其绑定到端口10,000.一旦收到第一个数据报(来自端口52,832),它就会发出connect
系统调用"连接"它到127.0.0.1:52,832.对于UDP,a connect
拒绝所有与IP中的IP和端口不匹配的数据包connect
.
使用-k
选项:
nc -l -u -k 0.0.0.0 10000
Run Code Online (Sandbox Code Playgroud)