DNS和ICMP

域名介紹

在網絡通信中,需要用到ip加port,但是ip并不方便記憶,于是我們常用域名來對應一個ip

例如:www.baidu.com? ? 對應? ? 156.36.56.98(隨便寫的)

com: 一級域名. 表示這是一個企業域名. 同級的還有 "net"(網絡提供商), "org"(非盈利組織) .

baidu: 二級域名, 公司名.

www: 只是一種習慣用法.

域名解析

域名解析分為兩步

1.查本地?/etc/hosts

互連網信息中心(SRI-NIC)會管理一個?hosts 文件,本地主機只需要定期下載即可,里面就是域名和ip的對應

2.使用DNS技術

如果/etc/hosts找不到,那就去向本地DNS服務器發送請求進行查詢,本地DNS服務器通常以守護進程形式存在

ICMP協議

ICMP協議是一個網絡層協議,不保證可靠傳輸(沒有超時重傳機制),無連接,本地主機通過套接字和協議棧來處理響應,目標主機通過協議棧來處理請求,利用ICMP 響應報文來得到路由情況

ICMP 的報文格式?

標準 ICMP Echo Reply 報文格式?

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type(0)   |     Code(0)   |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Identifier          |        Sequence Number        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Data (可變長度,通常包含時間戳或填充字節)                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

ping 命令

ping www.baidu.com

ping命令過程分析:

在終端上寫下了這幾個字母,隨著按下回車,終端模擬器將這幾個字母write進主設備,然后驅動程序將主設備數據寫進從設備,喚醒從設備等待隊列上的進程也就是shell,然后shell讀出來,分割字符串,然后創建子進程,進程替換為ping進程,域名通過命令行參數傳給了ping進程,然后ping進程去/etc/hosts文件里面查找域名對應ip,如果找不到就向本地DNS守護進程發消息,然后DNS進程開始詢問服務器,最后得到對應ip。ping進程接下來的操作如下:

步驟 1:創建原始套接字??

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sock < 0) {perror("socket");  // 需 root 權限或 CAP_NET_RAW 能力exit(1);
}

??步驟 2:構造 ICMP 報文??

  • ??報文結構??:
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     Type(8)   |     Code(0)   |          Checksum             |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |           Identifier          |        Sequence Number        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                          Payload (可選)                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  • ??字段說明??:
    • ??Type=8, Code=0??:表示?Echo Request
    • ??Identifier??:通常為進程 PID(用于響應能夠查找到對應套接字)。
    • ??Sequence Number??:遞增序列號(區分多次請求)。
    • ??Checksum??:ICMP 校驗和(需手動計算)。

??步驟 3:發送報文??

struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr("93.184.216.34");  // 目標 IP// 發送 ICMP 報文
sendto(sock, icmp_packet, sizeof(icmp_packet), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));

??步驟 4:接收 Echo Reply??

char recv_buf[1024];
struct sockaddr_in src_addr;
socklen_t addr_len = sizeof(src_addr);// 阻塞等待響應(內核通過 Identifier 匹配報文)
recvfrom(sock, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&src_addr, &addr_len);

ping進程在應用層創建好原始套接字,并且創建好ICMP報文,然后用sendto發送,然后經過ip層和數據鏈路層封裝后發出去,當目標主機收到后,經數據鏈路層和ip層的解包,交給了ICMP協議的接口,檢查ICMP頭里的類型,發現是請求,那就構建對應的ICMP響應,然后經IP協議和以太網協議的封裝又發回去,源主機收到后開始解包,到ICMP協議層時,根據OS維護的hash表,通過響應里的identifier標識符,找到對應的套接字,然后將ICMP報文寫進套接字接收緩沖區,并喚醒等待隊列上的進程,ping進程recvfrom從接收緩沖區里讀出來完整的ICMP報文,然后根據ICMP報文的內容,write寫東西到從設備,終端驅動將從設備數據拷到主設備,然后喚醒終端模擬器,終端模擬器再將東西打到終端上,這就是一次發送數據測試,ping進程會不停發送echo request,并設置序列號來區分這些請求3

??完整流程:ping?命令的 ICMP 請求與響應全鏈路解析??


??1.?ping?進程發送 ICMP Echo Request??

??(1)應用層(用戶態)??

  1. ??創建原始套接字??

    int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

    • ??權限??:需有CAP_NET_RAW?(/bin/ping?已默認配置)。
    • ??作用??:繞過傳輸層,直接操作網絡層(IP)數據包。
  2. ??構造 ICMP Echo Request??

    • ??報文結構??:

      Type=8 (Echo Request), Code=0

    • Identifier=進程PID, Sequence=遞增序號

    • Payload=時間戳或填充數據

    • ??計算校驗和??:覆蓋整個 ICMP 報文。
  3. ??發送請求??

    sendto(sock, icmp_req, sizeof(icmp_req), 0, &dest_addr, addr_len);

??(2)內核協議棧處理??

  1. ??IP 層封裝??

    • 添加 IP 頭部:
      • 源/目標 IP、TTL(默認 64)、協議號?1(ICMP)。
    • 查詢路由表,確定下一跳 ip?地址和發送接口。
  2. ??數據鏈路層封裝??

    • 添加以太網幀頭:源/目標 MAC 地址、類型?0x0800(IPv4)。
    • 通過網卡驅動(如?eth0)發送到物理鏈路。

??2. 目標主機處理與響應??

??(1)網絡接口接收??

  1. ??網卡(數據鏈路層)??

    • 檢查目標 MAC 地址,若匹配則接收,剝離以太網幀頭。
    • 將 IP 數據包交給內核網絡協議棧。
  2. ??IP 層解包??

    • 校驗 IP 頭部(版本、校驗和、目標 IP)。
    • 若 TTL 減至 0,丟棄并返回?ICMP Time Exceeded(Type=11)。
    • 若目標 IP 匹配本機,剝離 IP 頭,根據協議類型是1,?交給 ICMP 模塊。

??(2)ICMP 協議處理??

  1. ??解析 ICMP 報文??

    • 檢查?Type=8(Echo Request),Code=0
    • 內核自動構造?Echo Reply(Type=0),保持相同的?Identifier?和?Sequence
  2. ??發送響應??

    • IP 層封裝:源/目標 IP 互換,TTL 重置(如 64)。
    • 數據鏈路層封裝:通過 ARP 獲取源主機的 MAC 地址。
    • 網卡發送響應包。

??3. 源主機接收響應??

??(1)網絡接口接收??

  1. ??網卡收包??

    • 過濾目標 MAC,剝離以太網幀頭,IP 層校驗后交給 ICMP 模塊。
  2. ??ICMP 協議匹配??

    • 內核根據?Identifier(如 PID?1234)查找原始套接字。
    • 將報文寫入套接字接收緩沖區。

??(2)喚醒?ping?進程??

  1. ??從阻塞中恢復??

    • ping?進程此前因?recvfrom()?阻塞,被內核移至就緒隊列。
    • 從接收緩沖區讀取?Echo Reply?數據。
  2. ??計算 RTT(往返時間)??

    • 對比當前時間與請求報文中的時間戳(Payload),得到延遲。

??(3)終端輸出??

  1. ??ping?進程格式化輸出??

    64 bytes from 93.184.216.34: icmp_seq=1 ttl=53 time=11.3 ms

    • ttl:從響應 IP 頭部提取。
    • time:RTT 計算結果。
  2. ??終端顯示流程??

    • ping?調用?write()?將結果寫入標準輸出(文件描述符?1)。
    • 終端驅動(如?tty)將數據從 ??從設備??(進程緩沖區)拷貝到 ??主設備??(終端顯示器)。
    • 終端模擬器(如?xterm)渲染最終字符。

補充說明

1.ping?超時??:內核未收到?Echo Replyrecvfrom()?超時后停止等待(等待默認?1 秒),靠sendto重發請求,也就是說ICMP協議是沒有超時重傳的功能的,真正能使其超時重傳的是ping進程邏輯

2.ping發送請求到目標主機,目標主機通過硬件中斷的協議棧就處理了該請求,根本就沒涉及到進程和應用層邏輯

3.ping進程本身處理響應卻是寄托協議棧加上進程和應用層邏輯,還使用了套接字

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88495.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2022 年 12 月青少年軟編等考 C 語言六級真題解析

目錄 T1. 電話號碼T2. 區間合并T3. 撲克牌排序T4. 現代藝術思路分析T1. 電話號碼 題目鏈接:SOJ D1137 此題為 2021 年 12 月六級第一題原題,見 2021 年 12 月青少年軟編等考 C 語言六級真題解析中的 T1。 T2. 區間合并 題目鏈接:SOJ D1112 此題為 2021 年 9 月六級第三…

無鎖隊列:從零構建生產者-消費者數據結構

高性能無鎖隊列&#xff1a;從零構建生產者-消費者數據結構 問題的本質 生產者-消費者問題的核心挑戰不在于數據傳輸&#xff0c;而在于協調。傳統的鎖機制雖然簡單&#xff0c;但帶來了三個致命問題&#xff1a; 性能瓶頸&#xff1a;線程阻塞和上下文切換優先級反轉&#xff…

JAVA面試寶典 -《Spring IOC核心:Bean生命周期全解析》

文章目錄&#x1f331; 《Spring IOC核心&#xff1a;Bean生命周期全解析》1?? 引言&#xff1a;Bean 生命周期為什么重要&#xff1f;2?? Bean 生命周期概覽&#xff08;圖示 簡要說明&#xff09;3?? 每一步詳細解析&#xff08;源碼理解 示例&#xff09;3.1 &#…

Python 類型注解實戰:`Optional` 與安全數據處理的藝術

Python 類型注解實戰&#xff1a;Optional 與安全數據處理的藝術 在 Python 開發中&#xff0c;類型注解&#xff08;Type Hints&#xff09;已經成為現代 Python 項目的標配。本文將通過一個真實的認證令牌獲取函數 get_auth_token()&#xff0c;深入解析 Optional 類型的應用…

深入MyBatis:CRUD操作與高級查詢實戰

引言 在上一篇文章中&#xff0c;我們介紹了Mybatis的基礎使用。 如有需要請移步查看&#xff1a; MyBatis入門&#xff1a;快速掌握用戶查詢實戰https://blog.csdn.net/qq_52331401/article/details/149270402?spm1001.2014.3001.5502 今天&#xff0c;我將通過一個完整的…

Flink DataStream API詳解(二)

一、引言 咱兩書接上回&#xff0c;上一篇文章主要介紹了DataStream API一些基本的使用&#xff0c;主要是針對單數據流的場景下&#xff0c;但是在實際的流處理場景中&#xff0c;常常需要對多個數據流進行合并、拆分等操作&#xff0c;以滿足復雜的業務需求。Flink 的 DataS…

Unity3D游戲線上崩潰排查指南

前言 排查Unity3D線上游戲崩潰是個系統工程&#xff0c;需要結合工具鏈、日志分析和版本管理。以下是詳細的排查指南和關鍵步驟&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀&#xff01; 一、崩潰信息收…

DPDK性能優化實踐:系統級性能調優的方法論與實戰(一套通用的方法論)

性能優化的挑戰與現實困境 在高性能網絡處理領域&#xff0c;性能優化往往被視為一門“玄學”而非科學。許多開發者在面對性能瓶頸時&#xff0c;要么盲目追求單一指標的極致優化&#xff0c;要么采用"試錯法"進行零散的局部調優&#xff0c;結果往往是投入大量精力卻…

Docker的/var/lib/docker/目錄占用100%的處理方法

文章目錄 一、問題描述 二、解決措施 三、可能遇到的問題 問題1、問題描述&#xff1a;執行 sudo systemctl stop docker 命令時&#xff0c;提示 Warning: Stopping docker.service, but it can still be activated by: docker.socket 問題2、問題描述&#xff1a;執行 s…

【UE教程/進階】Slate鏈式編輯原理

目錄鏈式編輯操作" . "操作" "操作" [ ] "鏈式編輯 SNew().&#xfeff;[] 操作" . " SLATE_ARGUMENT(ArgType, ArgName) 宏 調用宏 SLATE_PRIVATE_ARGUMENT_VARIABLE(ArgType, ArgName) &#xff0c;在FArgument結構體中添加了變量…

將手工建模模型(fbx、obj)轉換為3dtiles的免費工具!

文章目錄1、工具下載2、使用說明3、詳細說明命令行格式示例命令參數說明4、源碼地址1、工具下載 百度網盤下載鏈接 選擇最新版本下載即可&#xff0c;支持Linux和Windows系統 2、使用說明 1&#xff09;按住鍵盤winr鍵&#xff0c;在彈出的窗口中輸入cmd 2&#xff09;點擊…

FreeRTOS源碼學習之內核初始化

目錄 前言 一、主函數內容 二、osKernelInitialize ()內核初始化函數內容 三、IS_IRQ()宏定義中斷檢測函數內容 四、如果這篇文章能幫助到你&#xff0c;請點個贊鼓勵一下吧ξ( ?&#xff1e;??)~ 前言 使用STM32CubeMX添加FreeRTOS進入工程之后&#xff0c;會自動在ma…

Docker—— 鏡像構建原因

在現代軟件開發和運維中&#xff0c;Docker已成為一種非常流行的工具&#xff0c;它通過容器化應用程序來簡化部署過程。然而&#xff0c;默認的官方鏡像往往只能滿足基礎需求&#xff0c;無法涵蓋所有特定項目的具體要求。原因說明系統級改動無法通過 volume 實現修改用戶、刪…

鋰電池自動化生產線的現狀與發展

鋰電池自動化生產線的概述鋰電池自動化生產線是指采用自動化設備和控制系統&#xff0c;實現鋰電池從原材料到成品的全流程自動化生產過程。隨著新能源產業的快速發展&#xff0c;鋰電池作為重要的儲能元件&#xff0c;其生產制造技術也在不斷進步。自動化生產線通過減少人工干…

java底層的native和沙箱安全機制

沙箱安全機制沙箱&#xff08;Sandbox&#xff09;安全機制是一種將程序或代碼運行在隔離環境中的安全技術&#xff0c;旨在限制其對系統資源&#xff08;如文件系統、網絡、內存、其他進程等&#xff09;的訪問權限&#xff0c;從而降低潛在惡意代碼帶來的風險。其核心思想是“…

【分享】文件擺渡系統適配醫療場景:安全與效率兼得

根據國家信息安全相關法規要求&#xff0c;醫院為了網絡安全&#xff0c;大多會采用網閘等隔離手段&#xff0c;將網絡隔離為內網和外網&#xff0c;但網絡隔離后&#xff0c;醫院的內外網間仍存在較為頻繁的文件擺渡需求。文件擺渡系統則是可以解決跨網絡或跨安全域文件傳輸中…

vscode 中的 mermaid

一、安裝軟件 Mermaid preview Mermaid support 二、運行命令 創建.md 文件右鍵選擇 ?Open Preview?&#xff08;或按 CtrlShiftV&#xff09; 三、流程圖 注意&#xff1a; 要md 文件要保留 mermaid 1. #mermaid-svg-nchqbvlWePe5KCwJ {font-family:"trebuchet ms"…

微服務引擎 MSE 及云原生 API 網關 2025 年 6 月產品動態

點擊此處&#xff0c;了解微服務引擎 MSE 產品詳情。

【TCP/IP】7. IP 路由

7. IP 路由7. IP 路由概述7.1 直接傳遞與間接傳遞7.2 IP 路由核心機制7.3 路由表7.3.1 路由表的構成7.3.2 信宿地址采用網絡地址的好處7.3.3 下一跳地址的優勢7.3.4 特殊路由表項7.3.5 路由算法7.4 靜態路由7.4.1 特點7.4.2 自治系統&#xff08;AS&#xff09;7.4.3 配置命令7…

xFile:高性能虛擬分布式加密存儲系統——Go

xFile&#xff1a;高性能虛擬分布式加密存儲系統 目錄xFile&#xff1a;高性能虛擬分布式加密存儲系統1 背景介紹2 設計初衷與目標3 項目簡介4 系統架構5 核心優勢1. 真正的分布式塊存儲2. 塊級加密與壓縮&#xff0c;安全高效3. 靈活的索引與元數據管理4. 多用戶與權限體系5. …