刚刚安装了下wireshark的命令行程序tshark,顺便抓几个包分析分析
lihuideMacBook-Pro:~ lihui$ sudo tshark -i en0 port 53 Capturing on 'Wi-Fi' 1 0.000000 192.168.1.12 -> 192.168.1.1 DNS 74 Standard query 0x7ee3 A cbjs.baidu.com 2 0.000306 192.168.1.12 -> 192.168.1.1 DNS 80 Standard query 0x5325 A wwwbaidu.jomodns.com 3 0.010475 192.168.1.1 -> 192.168.1.12 DNS 359 Standard query response 0x7ee3 CNAME ecomcbjs.jomodns.com A 122.228.234.49 4 0.011521 192.168.1.1 -> 192.168.1.12 DNS 334 Standard query response 0x5325 A 122.228.234.40
都是UDP的包,想了想,瞄下nslookup的结果
lihuideMacBook-Pro:~ lihui$ nslookup > baidu.com Server: 192.168.1.1 Address: 192.168.1.1#53 Non-authoritative answer: Name: baidu.com Address: 220.181.57.217 Name: baidu.com Address: 123.125.114.144 Name: baidu.com Address: 180.149.132.47
的确,抓到的包都是我向DNS服务器之间请求相应的包,也就是请求域名解析的包,虽然UDP正确性保证没有TCP高,但是高效,况且这里仅仅是个域名解析的请求,就算有有误或者失败,大不了重来一次,也损失不大,网络流量负载也没有TCP那么大,查询任务应该主要是高效的考虑
实际上DNS域名解析过程远没有这么简单,DNS服务器之间还要进行交互同步,一段时间就会同步一下变动的记录,在服务器之间的这种同步传输是通过TCP协议来完成的,既然是同步数据正确性必须要得到保证才行,当然这个此刻我是无法抓包的
所以简单地说客户端和DNS服务器的数据交互是通过UDP完成的,而DNS服务器之间是通过TCP来同步的