0000 38 f9 d3 ce 10 a6 b0 6e bf 6a 4c 40 08 00 45 00 8......n.jL@..E.
0010 00 76 00 00 00 00 96 11 4c 7d 72 72 72 72 c0 a8 .v......L}rrrr..
0020 32 6d 00 35 f3 27 00 62 5b c2 0c 5a 81 80 00 01 2m.5.'.b[..Z....
0030 00 03 00 00 00 00 03 77 77 77 05 62 61 69 64 75 .......www.baidu
0040 03 63 6f 6d 00 00 01 00 01 c0 0c 00 05 00 01 00 .com............
0050 00 02 cb 00 0f 03 77 77 77 01 61 06 73 68 69 66 ......www.a.shif
0060 65 6e c0 16 c0 2b 00 01 00 01 00 00 01 18 00 04 en...+..........
0070 3d 87 a9 7d c0 2b 00 01 00 01 00 00 01 18 00 04 =..}.+..........
0080 3d 87 a9 79 =..y
UDP 和 TCP 的通信机制非常不同,作为可靠的传输协议,TCP 协议需要通信的双方通过 三次握手 建立 TCP 连接后才可以通信,但是在 30 年前的 DNS 查询的场景中我们其实并不需要稳定的连接(或者以为不需要),每一次 DNS 查询都会直接向命名服务器发送 UDP 数据报,与此同时常见 DNS 查询的数据包都非常小,TCP 建立连接会带来以下的额外开销:
- TCP 建立连接需要进行三次网络通信;
- TCP 建立连接需要传输 ~130 字节的数据;
- TCP 销毁连接需要进行四次网络通信;
- TCP 销毁连接需要传输 ~160 字节的数据;
文章插图
- 使用 TCP 协(共 330 字节)
- 三次握手 — 14x3(Ethernet) + 20x3(IP) + 44 + 44 + 32 字节
- 查询协议头 — 14(Ethernet) + 20(IP) + 20(TCP) 字节
- 响应协议头 — 14(Ethernet) + 20(IP) + 20(TCP) 字节
- 使用 UDP 协议(共 84 字节)
- 查询协议头 — 14(Ethernet) + 20(IP) + 8(UDP) 字节
- 响应协议头 — 14(Ethernet) + 20(IP) + 8(UDP) 字节
需要注意的是,我们在这里计算结果的前提是 DNS 解析器只需要与一个命名服务器或者权威服务器进行通信就可以获得 DNS 响应,但是在实际场景中,DNS 解析器可能会递归地与多个命名服务器进行通信,这也加倍地放大了 TCP 协议在额外开销上的劣势 。如果 DNS 查询的请求体和响应分别是 15 和 70 字节,那么 TCP 相比于 UDP 协议会增加 ~250 字节和 ~145% 的额外开销,所以当请求体和响应的大小比较小时,通过 TCP 协议进行传输不仅需要传输更多的数据,还会消耗更多的资源,多次通信以及信息传输带来的时间成本在 DNS 查询较小时是无法被忽视的,TCP 连接带来的可靠性在 DNS 的场景中没能发挥太大的作用 。
TCP今天的网络状况其实没有几十年前设计的那么简单,我们不仅遇到了 IPv4 即将无法分配的状况,而且还需要引入 DNSSEC 等机制来保证 DNS 查询和请求的完整性以及传输安全,总而言之,DNS 协议需要处理的数据包越来越大、数据也越来越多,但是『为什么当需要传输的数据较多时我们就必须使用 TCP 协议呢?』,如果继续使用 UDP 协议就不能完成 DNS 解析么 。
从理论上来说,一个 UDP 数据包的大小最多可以达到 64KB,这对于一个常见的 DNS 查询其实是一个非常大的数值;但是在实际生产中,一旦数据包中的数据超过了传送链路的最大传输单元(MTU,也就是单个数据包大小的上限,一般为 1500 字节),当前数据包就可能会被分片传输、丢弃,部分的网络设备甚至会直接拒绝处理包含 EDNS(0) 选项的请求,这就会导致使用 UDP 协议的 DNS 不稳定 。
TCP 作为可靠的传输协议,可以非常好的解决这个问题,通过序列号、重传等机制能够保证消息的不重不漏,消息接受方的 TCP 栈会对分片的数据重新进行拼装,DNS 等应用层协议可以直接使用处理好的完整数据 。同时,当数据包足够大的时候,TCP 三次握手带来的额外开销比例就会越来越小,与整个包的大小相比就会趋近于 0:
- 当 DNS 数据包大小为 500 字节时,TCP 协议的额外开销为 ~41.2%;
- 当 DNS 数据包大小为 1100 字节时,TCP 协议的额外开销为 ~20.7%;
- 当 DNS 数据包大小为 2300 字节时,TCP 协议的额外开销为 ~10.3%;
- 当 DNS 数据包大小为 4800 字节时,TCP 协议的额外开销为 ~5.0%;
文章插图
所以,我们在 DNS 中存储较多的内容时,TCP 三次握手以及协议头带来的额外开销就不是关键因素了,不过我们 TCP 三次握手带来的三次网络传输耗时还是没有办法避免的,这也是我们在目前的场景下不得不接受的问题 。
推荐阅读
- 迷迭香缩阴的使用方法,迷迭香纯露的使用方法
- Mysql建立、删除索引及使用
- 使用Openssl制作自签证书,并应用于自己MQTT服务器通讯
- 为什么大多数IP地址通常以192.168开头?
- 退役军人优待证有什么作用?
- 《寄生虫》结局 寄生虫大结局
- 喜茶为什么那么火,喜茶为什么这么火的原因
- 屋后为什么不能种花,都匀毛尖为什么这么贵
- 竹节虫是昆虫吗,为什么 最大的竹节虫有多长
- 全自动洗碗机的使用方法