国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

教你動手寫UDP協議棧—DNS報文解析

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-24 16:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

教你動手寫UDP協議棧系列文章序號內容1《教你動手寫UDP協議棧-UDP協議棧格式》2《教你動手寫UDP協議棧-DHCP報文解析》3《教你動手寫UDP協議棧-OTA上位機》4《教你動手寫UDP協議棧-DNS報文解析》背景因特網上的節點通過IP地址唯一標識,并且能通過IP地址來識別參與分布式應用的主機。但對于大多數人來說,這些地址太繁瑣而且難以使用和記憶(特別是IPV6地址)。因此互聯網支持使用主機名稱來識別包括客戶機和服務器在內的主機。

為了使用如TCP和IP等協議,主機名稱可以通過稱為域名解析的過程轉換成IP地址。在互聯網中存在不同形式的名稱解析,但是最普遍、最重要的一種是采用分布式數據庫系統,即我們熟知的域名系統(DNS),也是這篇文章的主角。DNS - 是一個分布式的客戶機-服務器網絡數據庫,TCP/IP應用程序使用它來完成主機名稱和IP地址之間的映射,提供電子郵件路由信息、服務命名和其他服務。DNS使用TCP和UDP的端口--53。DNS - 為了可擴展性,DNS名稱是分層的。每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。下面來介紹DNS報文的格式解析,以及如何將域名轉為IP地址的流程。準備工具工具介紹WireShark網絡封包分析軟件,分析數據包CMDwindow 命令行DNS報文解析抓包分析打開CMD和WireShark工具。在WireShark中設置過濾信息,我們只抓取DNS報文。在CMD鍵入ping www.baidu.com,然后查看WireShark的抓包信息。

可以看到兩包DNS報文,一個是DNS發送報文,一個是DNS接收報文發送報文

接收報文

發送報文和接收報文格式是不一樣的,從上面截圖可以看到,接收報文多一個Answers字段。

DNS可以使用UDP與TCP兩種協議。這里我們主要以UDP進行分析。

DNS報文字段解析DNS報文格式:

DNS字段格式:發送報文

接收報文

DNS報文頭部

字段說明字段說明Transaction ID辨別DNS應答報文是哪個請求報文的響應QRFlags字段,1為響應,0位查詢OpCodeFlags字段,查詢或響應類型,0為標準,1為反向,2為服務器狀態請求AAFlags字段,授權回答TCFlags字段,截斷,1表示超過512字節并已被截斷,0表示沒有發送截斷RDFlags字段,是否希望得到遞歸回答RAFlags字段,響應報文中為1便是得到遞歸響應ZFlags字段,0ADFlags字段,真是數據CDFlags字段,禁止校驗RCODEFlags字段,返回碼:0-無差錯,1-格式錯誤,2-服務器失效,3-不存在域名,4-查詢類型不支持,5-被禁止,6-15保留QuestionsFlags字段,查詢數AnswerFlags字段,資源記錄數AuthorityFlags字段,授權資源記錄數AdditionalFlags字段,額外資源記錄數代碼實現/** DNS message header */PACK_STRUCT_BEGINstruct dns_header { PACK_STRUCT_FIELD(uint16_t id); PACK_STRUCT_FIELD(uint8_t flags1); PACK_STRUCT_FIELD(uint8_t flags2); PACK_STRUCT_FIELD(uint16_t numquestions); PACK_STRUCT_FIELD(uint16_t numanswers); PACK_STRUCT_FIELD(uint16_t numauthrr); PACK_STRUCT_FIELD(uint16_t numextrarr);}PACK_STRUCT_STRUCT;PACK_STRUCT_ENDDNS報文問題字段

字段說明查詢名稱格式:

字段說明name查詢名稱,不定長type查詢類型class查詢類代碼實現(由于名字是不定長,另作處理)PACK_STRUCT_BEGINstruct dns_query { PACK_STRUCT_FIELD(uint16_t type); PACK_STRUCT_FIELD(uint16_t class);}PACK_STRUCT_STRUCT;PACK_STRUCT_ENDDNS報文應答字段

字段說明(此字段只有應答包才有)字段說明name查詢名稱,不定長type查詢類型class查詢類TTL該資源記錄的生命周期data length資源數據長度address返回的IP地址,即域名轉換的IP地址代碼實現struct dns_answer { PACK_STRUCT_FIELD(uint16_t name); PACK_STRUCT_FIELD(uint16_t type); PACK_STRUCT_FIELD(uint16_t class); PACK_STRUCT_FIELD(uint32_t ttl); PACK_STRUCT_FIELD(uint16_t len); PACK_STRUCT_FIELD(struct ip_addr server_ip);}PACK_STRUCT_STRUCT;PACK_STRUCT_ENDDNS報文發送實現代碼實現static void dns_packet_output(uint8_t *host_name){ struct dns_header dns_hdr = {0}; struct dns_query dns_qry = {0}; struct dest_device_info dest_info = {0}; uint8_t *dns_packet = NULL; uint8_t *dns_name = NULL; uint16_t query_index = 0; uint16_t label_len = 0; uint16_t dns_name_len = strlen(host_name) + 2;
dns_packet = malloc(DNS_HDR_SIZE + dns_name_len + DNS_QUERY_SIZE); dns_name = malloc(strlen(host_name) + 2);
if(dns_packet != NULL && dns_name !=NULL) { //打包DNS header memset(&dns_hdr, 0, DNS_HDR_SIZE); dns_hdr.id = mu_htons(TRANSACTION_ID); dns_hdr.flags1 = DNS_FLAG1_RD; dns_hdr.numquestions = mu_htons(1); memcpy(dns_packet, &dns_hdr, DNS_HDR_SIZE);
//將域名轉換DNS數據包格式 change_to_dns_name(dns_name, host_name);
memcpy(dns_packet + DNS_HDR_SIZE, dns_name, dns_name_len);
dns_qry.type = mu_htons(DNS_RRTYPE_A); dns_qry.class = mu_htons(DNS_RRCLASS_IN); //打包DNS query memcpy(dns_packet + DNS_HDR_SIZE + dns_name_len, &dns_qry, DNS_QUERY_SIZE);
memcpy(&dest_info.dest_mac, get_gw_mac(), MAC_ADDR_SIZE); memcpy(&dest_info.dest_ip, get_dns_server(), IP_ADDR_SIZE); dest_info.src_port = DNS_CLIENT_PORT; dest_info.dest_port = DNS_SERVER_PORT; //通過UDP報文發送 mini_udp_output(&dest_info, dns_packet, (DNS_HDR_SIZE + dns_name_len + DNS_QUERY_SIZE)); }
if(dns_packet != NULL) { free(dns_packet); } if(dns_name != NULL) { free(dns_name); }}驗證代碼結果,我們通過查詢CSDN的IP地址,CSDN的域名:www.csdn.net

通過wireshark抓包,可以看到我們DNS報文已發送成功,并且有應答包

DNS報文接收實現代碼實現static void dns_packet_input(void *dns_packet_data){ struct dns_header *dns_hdr = {0}; struct dns_answer *dns_ans = {0}; uint16_t dns_name_len = strlen("www.csdn.net") + 2; uint8_t *server_dns_name = malloc(strlen("www.csdn.net") + 2);
if(server_dns_name == NULL) { LOG_E("malloc fail!!"); return; }
dns_hdr = dns_packet_data; if(dns_hdr->id == mu_ntohs(TRANSACTION_ID) && (dns_hdr->numanswers > 1)) { change_to_dns_name(server_dns_name, "www.csdn.net");
if(strncmp(dns_packet_data + DNS_HDR_SIZE, server_dns_name, dns_name_len) == 0) { dns_ans = dns_packet_data + DNS_HDR_SIZE + dns_name_len + DNS_QUERY_SIZE;
printf("CSDN IP: %d:%d:%d:%d ", dns_ans->server_ip.addr[0], dns_ans->server_ip.addr[1], dns_ans->server_ip.addr[2], dns_ans->server_ip.addr[3]); } } free(server_dns_name);}通過wireshark抓包的IP與代碼捕獲的IP一致:

審核編輯:符乾江


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • DNS
    DNS
    +關注

    關注

    0

    文章

    229

    瀏覽量

    21148
  • UDP協議棧
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1260
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    DNS 解析故障:安全風險、診斷排查與防護指南

    前言DNS作為互聯網的“地址導航系統”,其穩定運行直接關系到網絡訪問的安全性與可用性。一旦出現解析故障,不僅會導致網站無法訪問,更可能引發一系列嚴重的安全風險,給個人用戶和企業帶來數據泄露、業務中斷
    的頭像 發表于 01-28 10:28 ?1153次閱讀
    <b class='flag-5'>DNS</b> <b class='flag-5'>解析</b>故障:安全風險、診斷排查與防護指南

    RDMA設計12:融合以太網協議設計1

    本文主要交流設計思路,在本博客已給出相關博文90多篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。 融合以太網協議負責用戶請求與 RDMA 數據包的轉換、管理
    發表于 12-25 11:39

    工業智能網關支持IEC104協議

    。工業智能網關通過內置協議或模塊化設計,能夠直接解析IEC104協議報文,支持以下核心功能: 數據采集 :實時采集電力設備(如變電站、發電
    的頭像 發表于 12-18 14:42 ?444次閱讀
    工業智能網關支持IEC104<b class='flag-5'>協議</b>嗎

    以太網通訊在FPGA上的實現

    模塊用來將需要發送的數據添加報文頭封裝為UDP報文,然后發送給MAC層,也負責將接收到的UDP報文提取出數據供FPGA其他模塊使用,TCP
    發表于 10-30 07:45

    移植網絡PHY芯片驅動,如何融入 rt-thread 的網絡體系,并添加新的以太網類型的報文

    的 TCP 和 UDP 報文不沖突(對于同一個網絡接口,可能會同時收發 TCP、UDP 和 HPGP報文)。
    發表于 09-22 06:11

    mqtt dns解析失敗是為什么?

    解析域名的ip地址就能正常連上,而直接解析域名就不行,為什么呢
    發表于 09-16 06:38

    協議解析網關是什么?有什么功能?

    協議解析網關是一種位于不同網絡或設備之間的中間件設備或軟件系統,主要作用是解決不同通信協議之間的不兼容性問題。它能夠接收來自不同設備或系統的數據包,識別其攜帶的協議格式(如Modbus
    的頭像 發表于 08-13 14:04 ?874次閱讀
    <b class='flag-5'>協議</b><b class='flag-5'>解析</b>網關是什么?有什么功能?

    用于各種設備協議間做報文轉換的網關是什么

    功能是實現不同協議格式的報文(數據)在傳輸過程中的解析、轉換和轉發。 一、協議轉換網關的核心作用 1.協議
    的頭像 發表于 08-11 14:08 ?1026次閱讀
    用于各種設備<b class='flag-5'>協議</b>間做<b class='flag-5'>報文</b>轉換的網關是什么

    第五章 W55MH32 UDP示例

    本文介紹了在 W55MH32?芯片上實現 UDP?通信及數據回環測試的方法。闡述了 UDP?協議的概念、特點、應用場景、報文傳輸流程和報文
    的頭像 發表于 07-24 09:13 ?1049次閱讀
    第五章 W55MH32 <b class='flag-5'>UDP</b>示例

    協議分析儀能監測哪些異常行為?

    協議分析儀通過深度解析網絡通信中的協議字段、時序和狀態,能夠精準識別多種異常行為,涵蓋從配置錯誤到惡意攻擊的廣泛場景。以下是其可監測的核心異常行為類型及具體實例:一、協議實現違規:違反
    發表于 07-22 14:20

    RDMA簡介3之四種子協議對比

    ,通過ETH Type標識RoCE報文。而RoCE v2基于UDP/IP協議承載RDMA,可部署在三層網絡環境下,在原有IB協議報文基礎上增
    發表于 06-04 16:05

    如何在Linux中配置DNS服務器

    本文詳細介紹了如何在Linux中配置DNS服務器,包括DNS工作原理、本地緩存、DNS查詢過程,以及正向和反向查詢的配置。步驟包括服務器配置、編輯BIND配置文件、添加解析信息和客戶端
    的頭像 發表于 05-09 13:38 ?2601次閱讀
    如何在Linux中配置<b class='flag-5'>DNS</b>服務器

    深度解析Linux中的DNS服務

    dns,Domain Name Server,它的作用是將域名解析為 IP 地址,或者將IP地址解析為域名。
    的頭像 發表于 04-09 16:13 ?869次閱讀

    深入淺出解析低功耗藍牙協議

    Bluetooth LE協議為什么要分層?怎么理解Bluetooth LE“連接”?如果Bluetooth LE協議只有ATT層沒有GATT層會發生什么? 一、協議
    的頭像 發表于 04-09 14:49 ?1290次閱讀
    深入淺出<b class='flag-5'>解析</b>低功耗藍牙<b class='flag-5'>協議</b><b class='flag-5'>棧</b>

    CAN報文流程解析

    CAN報文流程解析,直流充電樁上的CAN通訊解析過程
    發表于 03-24 14:03 ?10次下載