程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> TCP/IP學習筆記(2)

TCP/IP學習筆記(2)

編輯:關於VC++

一、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個字節,也就是地址信息
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved