假设我运行一个脚本同时向3个不同的DNS服务器发送多个DNS请求,它是否会共享相同的源端口号?换句话说,那些服务器会响应单个端口吗?还是会有冲突?谢谢!
答案 0 :(得分:3)
首先,一个"端口"只是一个数字。所有"连接到端口"真正代表的是一个包含在其目的端口"中指定的数字的数据包。标题字段。
现在,您的问题有两个答案,一个用于有状态协议,另一个用于无状态协议。
对于无状态协议(即UDP),没有问题,因为"连接"不存在 - 多个人可以将数据包发送到同一个端口,他们的数据包将以任何顺序到达。没有人在"连接"状态。
对于有状态协议(如TCP),连接由4元组标识,包括源端口和目标端口以及源和目标IP地址。因此,如果两台不同的机器连接到第三台机器上的同一端口,则有两个不同的连接,因为源IP不同。如果同一台机器(或两台NAT后面或共享相同的IP地址)连接两次到一个远端,则连接由源端口(通常是随机的高编号端口)区分。
简单地说,如果我从客户端连接到同一个Web服务器两次,这两个连接将具有来自我的视角的不同源端口和来自Web服务器的目标端口。因此,即使两个连接都具有相同的源和目标IP地址,也没有歧义。
端口是一种多路复用IP地址的方法,以便不同的应用程序可以侦听相同的IP地址/协议对。除非应用程序定义自己的更高级别协议,否则无法复用端口。如果使用相同协议的两个连接具有相同的源和目标IP以及相同的源和目标端口,则它们必须是相同的连接。
答案 1 :(得分:0)
这当然是可能的,DNS服务器应该全部响应。我在scapy中执行了此操作:
% sudo scapy
Welcome to Scapy (2.2.0)
>>> pkt1=IP(dst="8.8.8.8")/UDP(sport=60000)/DNS(id=1,qd=DNSQR(qname="www.cnn.com"))
>>> pkt2=IP(dst="8.8.4.4")/UDP(sport=60000)/DNS(id=1,qd=DNSQR(qname="www.cnn.com"))
>>> pkt3=IP(dst="192.231.221.2")/UDP(sport=60000)/DNS(id=1,qd=DNSQR(qname="www.cnn.com"))
>>> send(pkt1); send(pkt2); send(pkt3)
.
Sent 1 packets.
.
Sent 1 packets.
.
Sent 1 packets.
>>>
来自同一主机的tcpdump会话:
# tcpdump -n port 60000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on xn0, link-type EN10MB (Ethernet), capture size 65535 bytes
capability mode sandbox enabled
13:55:29.539612 IP 192.231.221.77.60000 > 8.8.8.8.53: 1 A? www.cnn.com. (29)
13:55:29.548176 IP 192.231.221.77.60000 > 8.8.4.4.53: 1 A? www.cnn.com. (29)
13:55:29.549064 IP 8.8.8.8.53 > 192.231.221.77.60000: 1 5/0/0 CNAME www.cnn.com.vgtf.net., CNAME cnn-cop.gslb.vgtf.net., A 157.166.238.48, A 157.166.238.17, A 157.166.239.177 (138)
13:55:29.557538 IP 192.231.221.77.60000 > 192.231.221.2.53: 1 A? www.cnn.com. (29)
13:55:29.557821 IP 8.8.4.4.53 > 192.231.221.77.60000: 1 6/0/0 CNAME www.cnn.com.vgtf.net., CNAME cnn-56m.gslb.vgtf.net., A 157.166.248.10, A 157.166.249.10, A 157.166.248.11, A 157.166.249.11 (154)
13:55:29.558134 IP 192.231.221.2.53 > 192.231.221.77.60000: 1 0/13/0 (240)
从同一个IP +端口向不同服务器发送三个数据包,三个数据包正在回答。