《TCP/IP 卷一》筆記、ping和traceroute 的實現思路
1. 相關ICMP協議概述
這裡只講解與ping有關的ICMP訊息型別,主機傳送回送訊息(Type =8),被請求主機回送響應訊息(Type=
0),基本格式如下:
回送訊息[ECHO]
回送響應訊息[ECHOREPLY]
其中•Code = 0,
•CheckSum為校驗和,重點注意從ICMP的頭部(即Type開始),到data結束(即到整個資料包結束),具體計算見程式碼。
•Identifier為識別符號,由主機設定,一般設定為程式號,回送響應訊息與回送訊息中identifier保持一致
•Sequence Number為序列號,由主機設定,一般設為由0遞增的序列,回送響應訊息與回送訊息中Sequence Number保持一致
•data為資料,由主機設定,回送響應訊息與回送訊息中data保持一致
2. Ping流程
Ping實際上利用的就是ICMP ECHO和ICMP ECHOREPLY包來探測主機是否存在,所以Ping程式的流程十分簡單:傳送ICMP ECHO包---->接收ICMP
ECHOREPLY包
傳送ICMP ECHO包時填充Identifier為程式ID,Sequence
Number為從0遞增計數,data填充為傳送時間
接收ICMP ECHOREPLY包時檢查Identifier,Sequence Number是否正確,通過IP報頭的源地址欄位獲得回送報文的主機地址是否正確
3. 模擬Ping實現pingy
Ping的基本流程已講解完
由於要自己構造ICMP包,因此建立需要建立原始套接字(即需要自己填充報頭):
sockfd= socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
SOCK_RAW用於直接訪問網路層,應用程式負責構造自己的協議首部;IPPROTO_ICMP表示ICMP報頭由程式構造
構造ICMP報頭,注意各個欄位的填充,特別是校驗和(可以參照icmp的結構定義)
icmp->icmp_type
icmp->icmp_code
icmp->icmp_cksum
icmp->icmp_id
icmp->icmp_seq
icmp->icmp_data;
而完成系統的Ping命令還需新增資訊統計,如傳送位元組數,收到位元組數,傳送包,接收包,傳送時間,TTL等;另外,新增訊號處理,在使用者使用Control^C等退出時列印即時資訊
程式實現主要參考 http://blog.csdn.net/qy532846454/article/details/5429700,修改了部分程式碼,現在可以ping 域名。1. 相關ICMP協議概述
這裡只講解與tracert有關的ICMP訊息型別,閘道器傳送超時報文(type = 11),主機傳送目標不可達報文(type
= 3),基本格式如下:
超時報文
其中code = 0,表示由閘道器傳送
這裡提一下,當code = 1時表示是IP層組裝分片超時。
The one we've been describing is generated when the TTL reaches 0, and is specified by a code of 0.
It's also possible for a host to send an ICMP "time exceeded during reassembly" when it timesout during the reassembly of a fragmented datagram. This error is specified by a code of 1.
目標主機不可達報文
其中code = 3,表示在目的主機,埠不可用
2. Traceroute流程
首先明確TTL是IP報頭中的欄位,TTL表示了資料包的time
to live,即還能經由多少跳,所以TTL = 1表示資料包將在下個路由或主機被丟棄,併傳送超時報文;
其次為了明確已到達主機,傳送時目的埠設為非法埠(如58127),這樣主機收到報文後會傳送目標不可達報文。
下面是tracert的流程:
1> 構造UDP資料包,設定TTL = 1
2> 傳送UDP資料包,記錄傳送時間t1
3> 接收ICMP差錯包,如果是超時報文,則是經過的中間路由,記錄路由資訊,記錄接收時間t2,計算時間(t2
- t1);如果是目標不可達報文,則抵達目的主機,記錄接收時間t2,列印資訊,退出
4> 構造UDP資料包,設定TTL += 1,返回第二步
其中,TTL的每個數值(如TTL = 1)傳送3次UDP包,即重複2~3步3次;
接收超時,列印"*"表示報文丟失
相關文章
- 在 iOS 平臺實現Ping 和 tracerouteiOS
- TCP/IP詳解卷一閱讀後記TCP
- TCP/IP 筆記TCP筆記
- ping和Traceroute命令祥解
- 【TCP/IP】TCP詳解筆記TCP筆記
- Tnsping 和TCP/IP 中的ping 的區別TCP
- 《圖解TCP/IP》讀書筆記(一)圖解TCP筆記
- TCP/IP卷二 mbufTCP
- 《圖解TCP/IP》筆記圖解TCP筆記
- TCP/IP詳解卷二閱讀後記TCP
- TCP/IP詳解卷三閱讀後記TCP
- 《TCP/IP詳解卷1:協議》第1章 概述-讀書筆記TCP協議筆記
- TCP-IP協議筆記TCP協議筆記
- 《TCP/IP詳解卷1:協議》第19章 TCP的互動資料流-讀書筆記TCP協議筆記
- Python實現ping指定IPPython
- TCP/IP學習筆記之協議和郵件TCP筆記協議
- 【計算機網路】讀書筆記之《TCP/IP詳解卷1》《圖解TCP/IP》《計算機網路》三合一計算機網路筆記TCP圖解
- 《圖解TCP/IP》讀書筆記圖解TCP筆記
- 《TCP/IP詳解卷1:協議》第3章 IP:網際協議(2)-讀書筆記TCP協議筆記
- 《TCP/IP詳解卷1:協議》第3章 IP:網際協議(1)-讀書筆記TCP協議筆記
- 《圖解TCP/IP》讀書筆記二:TCP/IP基礎知識圖解TCP筆記
- 《TCP/IP詳解卷1:協議》第2章 鏈路層-讀書筆記TCP協議筆記
- 《圖解TCP/IP》讀書筆記六:TCP與UDP圖解TCP筆記UDP
- 《TCP/IP詳解卷1:協議》第17、18章 TCP:傳輸控制協議(2)-讀書筆記TCP協議筆記
- 《TCP/IP詳解卷1:協議》第17、18章 TCP:傳輸控制協議(1)-讀書筆記TCP協議筆記
- [Bash] ping netstat & traceroute Command
- 《圖解TCP/IP》讀書筆記四:IP協議圖解TCP筆記協議
- 使用PING命令輕鬆判斷TCP/IP故障TCP
- 《圖解TCP/IP》--讀書筆記(目錄)圖解TCP筆記
- 《圖解TCP/IP》讀書筆記一:網路基礎知識圖解TCP筆記
- 《卷積神經網路的Python實現》筆記卷積神經網路Python筆記
- Android Traceroute 功能實現Android
- IP和TCP抓包分析實驗TCP
- 《TCP/IP詳解卷1:協議》第4章 ARP:地址解析協議-讀書筆記TCP協議筆記
- 【網路協議】ICMP協議、Ping、Traceroute協議
- TCP/IP 和SocketTCP
- OSI和TCP/IPTCP
- shell指令碼和python指令碼實現批量ping IP測試指令碼Python