我已經(jīng)嘗試了我能想到的一切,但我正在碰壁。我想知道是否有人能夠指出我正確的方向或可能發(fā)現(xiàn)問題?由于幾個原因,我正在嘗試編寫自己的 DNS 服務(wù)器,主要是學(xué)習(xí)經(jīng)驗(yàn)。有幾件事要提一下:我正在使用圍棋使用“gopacket”進(jìn)行 DNS 數(shù)據(jù)包反序列化服務(wù)器在使用 UDP 協(xié)議時按預(yù)期工作因此,在通過 UDP 工作獲得響應(yīng)后,我決定是時候?qū)嵤?TCP 了。下面是偵聽 TCP 傳入連接的代碼片段。// Listen TCP c, err := t.Accept() if err != nil { log.Println(err) } go func(c net.Conn) { tbuff := make([]byte, 4096) _, err = c.Read(tbuff) if err != nil { fmt.Println(err) } clientAddr := addrt packet := gopacket.NewPacket(tbuff, layers.LayerTypeDNS, gopacket.Default) dnsPacket := packet.Layer(layers.LayerTypeDNS) tcp, _ := dnsPacket.(*layers.DNS) if !limiter(clientAddr.String()) { c.Close() } tbuff = DNSHandle(tcp) c.Write(tbuff) c.Close() }(c)當(dāng)我通過 TCP 發(fā)出 dig 命令時,服務(wù)器接受連接并將接收到的字節(jié)數(shù)據(jù)傳遞給 DNSHandle 函數(shù)(與 UDP 處理程序相同)。數(shù)據(jù)似乎與使用 UDP 時的數(shù)據(jù)有很大不同。
1 回答

qq_笑_17
TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個贊
但是,如果我將 tbuff 更改為 [2:]:
來自RFC 1035第 4.2.2 節(jié):
4.2.2. TCP 用法
通過 TCP 連接發(fā)送的消息使用服務(wù)器端口 53(十進(jìn)制)。消息以一個兩字節(jié)長度字段為前綴,它 給出了消息長度,不包括兩字節(jié)長度字段。該長度字段允許低級處理在開始解析之前組裝完整的消息。
因此,通過將 DNS over TCP 視為與 DNS over UDP 相同,你做錯了 - 在 TCP 中,DNS 消息以包含消息長度的 2 個字節(jié)為前綴。
這是必需的,因?yàn)?TCP 是一個字節(jié)流,而不是像 UDP 這樣的數(shù)據(jù)報協(xié)議。這意味著不能簡單地假設(shè)c.Read(...)
. 可能尚未收到完整的消息,但也可能收到了不止一條 DNS 消息。為此檢查長度前綴。
- 1 回答
- 0 關(guān)注
- 152 瀏覽
添加回答
舉報
0/150
提交
取消