q: 平時用sniffer觀察到的dns報文都在使用53/udp,什麼時候會用到53/tcp?
a: 對於dns伺服器,遞迴解析時用53/udp,區傳輸因需要可靠傳輸,必須使用53/tcp。dns伺服器的標準實現必須同時支援53/tcp和53/udp。 對於dns客戶端,預設使用53/udp進行a記錄查詢。nslookup進行a記錄查詢時,可以強制使用53/tcp。用sniffer觀察下述操作引發的通訊報文:
nslookup
> set vc
> www.anydomain.cn
rfc 1035中指出,53/udp上的udp資料區(不包括udp首部)不得超過512位元組,傳送時如果超過512位元組,將被截斷成512位元組,同時dns協議flags欄位truncated位置位。
53/tcp上的資料區最前面是big-endian序的2位元組長度域,不包括自身這2位元組,指明了後續資料長度。
更多細節參看""。
網上曾經流行過這樣乙個說法,當dns服務產生的響應資料大於512位元組(指udp資料區)時會自動改用53/tcp。注意,rfc 1035從來沒有給出過這種說法,即使確有其事那也是dns服務實現相關的,不是標準行為。
參看<> 14.8節。
名字解析器(dns client或遞迴解析中的dns server)發出udp請求報文,名字伺服器(必然是dns server)產生的udp響應資料大於512位元組時,只會向名字解析器傳送前512位元組,同時tc位置位。名字解析器通過tc位得知響應資料沒有全部返回,一般實現會選擇用tcp重新請求,名字伺服器將用tcp返回完整的響應資料。
何時用tcp是由名字解析器決定的,也就是說,名字解析器用tcp傳送請求,名字伺服器才會用tcp傳送響應,正常情況下決不會出現請求報文是udp而響應報文是tcp的情形。之所以強調正常情況下,是因為有一些非正常情況。
以bind 8.3.3為例。我曾搭建過如下測試環境:
server b(***.org.)
/client a - server a(org.)
\fake server b
client a向server a傳送udp請求報文進行a記錄查詢(1.***.org)。server a進行遞迴解析,向server b傳送udp請求報文,源埠不是53/udp。
client a向server a傳送tcp請求報文進行a記錄查詢(1.***.org)。server a進行遞迴解析,仍然向server b傳送udp請求報文而不是tcp請求報文,源埠不是53/udp。
server b收到來自server a的udp請求報文後,一般會傳送udp響應報文。現在用fakeserver b換掉server b,同樣是處理來自server a的udp請求報文。fake server b可以向server a的53/tcp主動發起連線請求,並在此tcp連線上傳送dns響應資料,源埠不要求是53/tcp。而server a居然接受來自fake server b的異常tcp響應。
不知道正常通訊中會出現此類現象否。總之,bind 8.3.3曾經支援這種異常行為。
什麼時候使用引用 什麼時候使用指標
使用引用引數的主要原因有兩個 程式設計師能修改呼叫函式中的資料物件 通過傳遞引用而不是整個資料 物件,可以提高程式的執行速度一般的原則 對於使用引用的值而不做修改的函式 如果資料物件很小,如內建資料型別或者小型結構,則按照值傳遞 如果資料物件是陣列,則使用指標 唯一的選擇 並且指標宣告為指向cons...
DNS什麼時候用UDP什麼時候用TCP來傳輸解釋
最近在處理一些dns問題,考慮用了4層交換機來實現,根據4層交換機來說做負載均衡是採用tcp或dup負載來做的,這時候我想dns用的是53埠,53是tcp和udp工用的,那麼什麼時候用tcp什麼時候用udp呢?下面是我看書結合下自己找出來的答案.主要是檢視dns報文首部中的標誌字段,dns資料頭部有...
什麼時候使用抽象類, 什麼時候使用介面
介面是一種協定,抽象類則相當於類模板。使用抽象類,而不要使用介面來分離協定與實現。如果需要提供多型層次結構的值型別,使用介面。如果乙個型別必須實現多個協定,或者協定適用於多種型別,使用介面。雖然抽象類和介面都支援將協定與實現分離開來,但介面不能指定以後版本中的新成員,而抽象類可以根據需要新增成員以支...