tcp/ip協議學習 第四章 ICMP:Internet控制報文協議

派猴子來的救兵html

 

關於ICMP的RFC文檔在此!git

幹嗎的

在我看來, ICMP協議主要就是爲了互相傳遞/查詢一些基本信息, 大部分是傳遞一些錯誤信息.github

好比A發送UDP信息到B的10000端口, 但B的10000端口並無開放, 就會回一個ICMP包給A, 告訴A10000端口未開放.tcp

基本的查詢信息, 好比最經常使用的ping命令, 就是發送ICMP包到目的主機, 而後等待目的主機的響應(響應也是ICMP包).code

協議

協議定義的很是簡單. ICMP在IP層上面一層. 前面是20個字節的IP頭, 而後就是ICMP頭.htm

ICMP頭, 截圖來自TCP/IP協議詳解卷一 ICMP頭, 截圖來自TCP/IP協議詳解卷一blog

類型和代碼兩個字段的組合決定了這個ICMP包的用途, 好比咱們經常使用的ping就是0,0組合和8,0組合. 具體以下:ip

各類類型的ICMP報文, 截圖來自TCP/IP協議詳解卷一 各類類型的ICMP報文, 截圖來自TCP/IP協議詳解卷一文檔

代碼放上

好像沒有什麼好說的. 直接代碼放上吧. 實現了一下書中的例子, 一個是查詢子網掩碼, 一個是查詢時間. github地址, 點我點我get

端口不可達

這也是書中的一個例子. 好比A發送UDP信息到B的10000端口, 但B的10000端口並無開放, 就會回一個ICMP包給A, 告訴A10000端口未開放.
來看一下效果.

用瑞士軍刀發送個UDP消息到192.168.0.108的10000端口.

% nc -u 192.168.0.108 10000                                                   ✭
abcd

同時開一個Tcpdump監聽看看:

# tcpdump -vvv -x -nn icmp                                                    ✭
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
01:48:01.420363 IP (tos 0x0, ttl 64, id 45430, offset 0, flags [DF], proto ICMP (1), length 56)
    192.168.0.108 > 192.168.0.104: ICMP 192.168.0.108 udp port 10000 unreachable, length 36
    IP (tos 0x0, ttl 64, id 42558, offset 0, flags [DF], proto UDP (17), length 33)
    192.168.0.104.60181 > 192.168.0.108.10000: [no cksum] UDP, length 5
    0x0000:  4500 0038 b176 4000 4001 072a c0a8 006c
    0x0010:  c0a8 0068 0303 eac9 0000 0000 4500 0021
    0x0020:  a63e 4000 4011 1269 c0a8 0068 c0a8 006c
    0x0030:  eb15 2710 000d 0000

ping

代碼仍是放在github了.

相關文章
相關標籤/搜索