一、ARP:地址解析協議
先看:
C:\Documents and Settings\xiaoj>arp -a
Interface: 192.1.8.84 on Interface 0x1000003
Internet Address Physical Address Type
192.1.8.12 00-0b-cd-03-c4-27 dynamic
192.1.8.15 00-0d-9d-93-09-f5 dynamic
192.1.8.18 00-e0-18-c1-86-3d dynamic
192.1.8.26 00-80-2d-78-4f-81 dynamic
192.1.8.33 00-0b-cd-0f-a4-c5 dynamic
192.1.8.38 00-30-6e-36-5f-99 dynamic
192.1.8.86 00-0b-cd-b8-0c-ae dynamic
192.1.8.247 00-50-ba-e5-20-af dynamic
192.1.8.248 00-0d-56-19-ba-56 dynamic
第一列顯示的是主機的IP地址,第二列就是主機的網卡MAC地址。
ARP協議就是提供IP地址到對應的硬件地址提供動態映射。這個過程一般是系統自動完成的。ARP發送一份ARP請求給以太網上的主機,該請求中包含目的主機的IP地址,其意思是“如果你是這個IP的擁有者,請回答你的硬件地址”。當目的主機的ARP層收到這份廣播報文時,識別出這是發送端在詢問它的IP地址,於是就會發送一個ARP應答,這個ARP應答包括IP地址及對應的硬件地址。
二、ARP分組格式
以太網目的地址6 以太網源地址6 幀類型2 硬件類型2 協議類型2 硬件地址長度
1
協議地址長度1 請求應答1 發送者硬件地址6 發送者IP地址4
目的硬件地址6 目的IP地址4先看定義:
//ARP首部
struct arphdr(
u_short ar_hrd; //硬件類型
u_short ar_pro; //協議類型
u_char ar_hln; //硬件地址長度
u_char ar_pln; //協議地址長度
u_short ar_op; // 請求還是應答
u_char arp_sha[6]; //發送者硬件地址
u_char arp_spa[4]; //發送者IP地址
u_char arp_tha[6]; //目的硬件地址
u_char arp_tpa[4]; //目的IP地址
u_char arp_zero[18]; //填充字段
};
說明:◆以太網目的地址全為1的特殊地址為廣播地址。
◆以太網幀類型ARP對應的值為0x0806。
◆硬件類型表示硬件地址的類型,以太網為1。
◆協議類型字段表示要映射的協議地址類型,IP地址對應的值為0x0800。
◆硬件地址長度:以太網為6。
◆協議地址長度:以太網為4,即IP地址長度。
◆操作字段:ARP請求=1,ARP應答=2,RARP請求=3,RARP應答=4。
◆當系統收到一份目的端為本機的ARP請求報文時,它就把硬件地址填進去,然後用兩個目的端地址分別替換兩個發送端地址,並把操作字段置為2,最後把它發送出去。
三、ARP代理:
如果ARP請求是從一個網絡的主機發往另一個網絡的主機,那麼連接這兩個網絡的路由器可以回答該請求,這個過程稱為ARP代理,這樣可以欺騙發起ARP請求的發送端,使它誤以為路由器就是目的主機。
四、免費ARP
指主機啟動時發送ARP查找自己的IP地址,主要作用:
1、查找網絡上有沒有相同的IP地址。
2、更新ARP緩存。
五、RARP協議:逆地址解析協議,這裡就不詳細介紹了。
RARP協議一般用於無盤工作站,根據硬件地址查找IP地址。
RARP分組格式與ARP分組格式相同。
六、ICMP協議:Internet控制報文協議:
ICMP經常被認為是IP層的一個組成部分,它傳遞差錯報文以及其他需要注意的事項。ICMP報文通常被IP層或更高層協議(TCP或UDP)使用。ICMP報文是在IP數據報內部被傳輸的。ICMP報文包差錯報文和查詢報文。報文格式如下:
8位類型 8位代碼 16位檢驗和 不同類型和代碼有不同的內容
類型字段可以有15個不同的值(0、3-5、8-18)。某些報文還使用代碼字段來進一步描述不同的條件。檢驗和字段覆蓋整個ICMP報文,與IP首部檢驗和算法是一樣的。
以下情況不會產生ICMP差錯報文:
◆ICMP差錯報文
◆目的地址為廣播地址或者多播地址
◆作為鏈路層的數據報
◆不是IP分片的第一片
◆源地址不是單個主機的數據報,也即源地址不能為0地址、環回地址、廣播地址或多播地址
七、ICMP地址掩碼請求與應答:
ICMP地址掩碼請求用於無盤系統在引導過程中獲取自己的子網掩碼,系統廣播它的ICMP請求報文。ICMP地址掩碼請求和應答報文格式如下:
類型(17或18) 代碼(0) 檢驗和 標識符 序列號 32位子網掩碼
ICMP報文中的標識符和序列號由發送端任意選擇設定,這些值在應答中將被返回。
struct icmp_mask{
unsigned char icmp_type; //類型
unsigned char icmp_code; //代碼
unsigned short icmp_checksum; //檢驗和
unsigned short icmp_id; //標識符
unsigned short icmp_sequence; //序列號
unsigned long icmp_mask; //32位子網掩碼
};
說明:RFC規定,除非是地址掩碼的授權代理,否則不能發送地址掩碼應答。
向本機IP地址和環回地址發送地址掩碼請求結果是一樣的。
八、ICMP時間戳請求與應答:
ICMP時間戳請求允許系統向另一個系統查詢當前時間,返回的是自午夜開始記算的毫秒數。調用者必須通過其他方法獲取當前時間。
ICMP時間戳請求與應答報文格式如下:
類型(13或14) 代碼(0) 檢驗和 標識符 序列號 發起時間戳 接收時間戳 傳送時間戳
請求端填寫發起時間戳,然後發送報文。應答系統收到報文填寫接收時間戳,發送應答時填寫發送時間戳。實際上,大多數實現將後兩個字段一般設置為一樣的。
struct icmp_time{
unsigned char icmp_type; //類型
unsigned char icmp_code; //代碼
unsigned short icmp_checksum; //檢驗和
unsigned short icmp_id; //標識符
unsigned short icmp_sequence; //序列號
unsigned long icmp_request_time; //發起時間戳
unsigned long icmp_receive_time; //接收時間戳
unsigned long icmp_send_time; //傳送時間戳
};
九、ICMP端口不可達差錯
主機如果收到一份UDP數據報而目的端口與某個正在使用的進程,那麼UDP返回一個ICMP不可達報文。報文格式如下:
類型3 代碼(0-15) 檢驗和 保留(必須為0) IP首部+原始IP數據報中數據的前8個字節
當代碼為4時,路徑MTU發現機制允許路由器把外出接口的MTU填在這個32bit的低16bit中。
struct icmp_unreach{
unsigned char icmp_type; //類型
unsigned char icmp_code; //代碼
unsigned short icmp_checksum; //檢驗和
unsigned long icmp_zero; //保留
unsigned char icmp_ip[28]; //IP首部+原始IP數據報中前8個字節,也就是地址信息
}