networking - 使用 UDP 的 netcat 的奇怪行为

标签 networking udp netcat

我注意到与 netcat 和 UDP 一起使用的奇怪行为。我启动了一个监听 UDP 端口的 netcat 实例(实例 1):

nc -lu -p 10000

所以我启动了另一个 netcat 实例(实例 2)并尝试将数据报发送到我的进程:
nc -u 127.0.0.1 10000

我看到了数据报。但是如果我关闭实例 2 并重新启动 netcat(实例 3):
nc -u 127.0.0.1 10000

我在实例 1 的终端上看不到数据报。显然,操作系统在实例 3 相对于实例 2 分配了不同的 UDP 源端口,问题就在那里:如果我使用相同的实例 2 源端口(例如 50000):
 nc -u -p 50000 127.0.0.1 10000

netcat 的实例 1 再次接收数据报。 UDP是一种无连接协议(protocol),为什么?这是标准的 netcat 行为吗?

最佳答案

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

在这里你可以看到它创建了一个 UDP 套接字,将其设置为地址重用,并将其绑定(bind)到端口 10,000。一旦收到第一个数据报(来自端口 52,832),它就发出 connect系统调用将其“连接”到 127.0.0.1:52,832。对于 UDP,一个 connect拒绝所有与 connect 中的 IP 和端口不匹配的数据包.

关于networking - 使用 UDP 的 netcat 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7696862/

相关文章:

Bash 脚本语句

java - 使用 kryo 注册类(class)的策略

delphi - 通过 DataSnap 的 TCP/IP 连接

sockets - D语言: UDP client does not receive reply

c - send() 和 receive() 使用一个套接字?

Java 聊天服务器通过 NETCAT 连接

使用 WSAWaitforMultipleEvents() 的非阻塞套接字函数的概念

python - 向 scapy 添加新协议(protocol)(类似于 ARP)

string - 无法附加到 UDP 监听器 C# 中接收的字符串

php - 按列对平面文件中的数据进行排序