參考:centos 6中single-request-reopen參數說明 http://coolnull.com/3820.html
說明:
在RHLE6/CENTOS6的環境里,需要在/etc/resolv.conf添加以下參數options single-request-reopen。具體原因請看下面。
具體:
一. 在RHEL5/CentOS5/Ubuntu 10.04等linux下,dns的解析請求過程如下
1 主機從一個隨機的源端口,請求 DNS的AAAA 記錄,
2 主機接受dns服務器返回AAAA記錄,
3 主機從一個另一個隨機的源端口,請求 DNS的A 記錄,
4 主機dns 服務器返回A記錄,
二. 如果是RHEL6/CentOS6,交互過程有所不同,如圖:
1 主機從一個隨機的源端口,請求 DNS的A 記錄,
2 主機從同一個源端口,請求 DNS的AAAA 記錄,
3 主機接受dns服務器返回A記錄,
4 主機接受 dns服務器返回AAAA記錄,
三. 上面3,4並沒有嚴格的先后順序,實際的順序受網絡環境,服務器環境的影響
理論上講centos6的這種工作機制,效率更高,端口復用度更高,能節省更多的資源。
但是這里也同樣存在着一個問題。比如在存在防火牆等機制的網絡環境中,同樣源目的ip,同樣源目的port,同樣的第4層協議的連接會被防火牆看成是同一個會話,因此會存在返回包被丟棄現象。如下圖。
此時的整個dns解析過程如下:
1 主機從一個隨機的源端口,請求 DNS的A 記錄,
2 主機從同一個源端口,請求 DNS的AAAA 記錄,
3 主機先收到dns返回的AAAA記錄,
4 防火牆認為本次交互通信已經完成,關閉連接,
5 於是剩下的dns服務器返回的A記錄響應包被防火牆丟棄
6 等待5秒超時之后,主機因為收不到A記錄的響應,重新通過新的端口發起A記錄查詢請求,此后的機制等同於centos5)
7 主機收到dns的A記錄響應;
8 主機從另一個新的源端口發起AAAA
9 主機收到dns的AAAA記錄響應;
我們看到在這個解析的序列里面,dns解析有5秒的延遲發生。所以當用linux系統安裝大量遠程包的時候宏觀上看延遲就非常大了(linux是不緩存dns解析記錄的)。
總結:
那么到底options single-request-reopen這個參數的作用是什么的,man 5 resolv.conf的結果如下
#man 5 resolv.conf single-request-reopen (since glibc 2.9)The resolver uses the same socket for the A and AAAA requests.Some hardware mistakenly only sends back one reply.When that happens the client sytem will sit and wait for the second reply.Turn- ing this option on changes this behavior so that if two requests from the same port are not handled correctly it will close the socket and open a new one before sending the second request.