第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 UDP 使用 TCP 傳輸可以解決 DNS 問題

使用 UDP 使用 TCP 傳輸可以解決 DNS 問題

Go
吃雞游戲 2022-12-05 11:20:54
我已經(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 消息。為此檢查長度前綴。


查看完整回答
反對 回復(fù) 2022-12-05
  • 1 回答
  • 0 關(guān)注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號