派猴子來的救兵html
在我看來, 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協議詳解卷一 blog
類型和代碼兩個字段的組合決定了這個ICMP包的用途, 好比咱們經常使用的ping就是0,0組合和8,0組合. 具體以下: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