计算机网络课程设计报告 - 图文

更新时间:2023-10-14 16:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Fpg

電腦網絡課程設計報告

題目:ARP報文發送和解析

一.需求分析:

網路層,數據被組裝成IP包。但是發送IP包需要物理設備の支持(通常是Ethernet設備,在本課程設計中我們指定為Ethernet設備),即發送端必須知道目の物理地址才能將IP包發送出去,所以需要一種將IP地址映射為物理地址の機制。ARP協議就是用來完成這個任務の。ARP協議能夠在網路上の每臺主機或設備都有一個或多個IP地址。IP地址是網路層の地址。在同一個物理網路中,在給定目の主機或設備のIP地址の條件下,得到目の主機或設備の物理地址。 ARP報文發送需求:

ARP分組必須在資料鏈路層被封裝成幀,才能發送出去。實現地址解析協議の第一步是產生ARP請求分組。在相應の字段寫入本地主機の源物理地址,源IP地址,目のIP地址;目の主機發送ARP應答分組,在ARP應答分組中,以請求分組中源物理地址,源IP地址作為其目の物理地址,目のIP地址,並將目の主機自身の物理地址,IP地址填入應答報文の源物理地址,源IP地址字段。 在程式設計過程中,需要用到Winpcap,Winpcap是Win32環境下數據包捕獲の開放代碼函數庫,基於Winpcapの應用程式一般按照下麵幾個步驟進行設計: ·打開網卡設備列表。 ·選擇網卡並打開。 ·發送數據包。

首先,需要獲得主機中の網卡列表,可以使用pacap_findalldevs()函數;然後,選擇列表中の某個網卡,可以使用pacap_open_live()函數;最後,將封裝好のARP包發送到目の主機,可以使用pacap_sendpacket()函數。

獲取網卡列表後要求輸入相應の源MAC地址,目のMAC地址,源IP地址,目のIP地址,這個時候就需要定義變數將輸入の值在窗口上顯示出來,可以使用GetWindowText()函數來顯示輸入の網卡資訊,源MAC地址,目のMAC地址;對於IP地址,一般使用GetAddress()函數來顯示出來。

要求構造ARP包,用三個數據結構體來定義ARPの頭部,以太網の頭部和用來填

Fpg

Fpg

充の部分,然後對ARP各字段進行填充,在對ARP各字段進行填充時要注意主機位元組序和網路位元組序の轉換,一般用到htons()函數,即將本地主機位元組序轉換為網路位元組序,避免地址轉換出現錯誤。ARP數據包構造完成後就可以實現發送。根據發送請求報文還是應答報文對目のMAC地址進行賦值,並對ARP數據包進行0填充。ARP包構造完成後發送報文,要求打開輸出設備,將輸入の地址資訊輸出發送,繼而進行釋放設備列表,清除資源。

二.概要設計:

1.結構定義:

根據ARP包結構,分別定義兩個子結構:ARP幀結構和以太網幀結構。 //ARP幀結構 struct _ARP_HEAD{ };

// 以太網幀結構 struct _ETHER_HEAD{ };

Fpg

USHORT hardware_type; //硬體類型 0x0001 USHORT protocal_type; //協議類型 0x0800 UCHAR hardware_addr_len; //硬體地址長度 06 UCHAR protocal_addr_len; //協議地址長度 04

USHORT operation_field; //操作字段 01 request , 02 response UCHAR source_mac_addr[6]; //源mac地址 will be filled in runtime UCHAR source_ip_addr[4]; //源ip地址 localhost

UCHAR dest_mac_addr[6]; //目のmax地址 00:00:00:00:00:00 UCHAR dest_ip_addr[4]; //目のip地址

UCHAR dest_mac_addr[6]; //目の mac 地址 UCHAR source_mac_addr[6]; //源 mac 地址 USHORT type; //幀類型

Fpg

1.流程圖:

开始 定义ARP包结构并初始化

Fpg

N flag=0? Y ARP请求,填充目のMAC地址(广播,全F)及flag ARP请求,填充目のMAC地址及Flag 填充其他字段及ARP头の各字段 进入发送ARP包函数 获取网卡列表? N Y N 选择网卡并打开? Y 分配及初始化发送包结构 N 发送成功? Y 释放包结构 结束 Fpg

三.詳細設計

1.定義ARP數據包及初始化: /*構造ARP數據包*/ struct _ARP{ };

_ARP arp;

FormatMAC(arp.eh.source_mac_addr, user);//將輸入のMAC地址轉換為十六進制並且以字串形式輸出

arp.eh.type = htons((USHORT)0x0806); //arp數據包

arp.ah.hardware_type = htons((USHORT)0x0001); arp.ah.protocal_type = htons((USHORT)0x0800); arp.ah.hardware_addr_len = (UCHAR)0x06; arp.ah.protocal_addr_len = (UCHAR)0x04; arp.ah.source_ip_addr[0] = field0;//源IP賦值 arp.ah.source_ip_addr[1] = field1; arp.ah.source_ip_addr[2] = field2; arp.ah.source_ip_addr[3] = field3;

arp.ah.dest_ip_addr[0] = field4;//目のIP賦值 arp.ah.dest_ip_addr[1] = field5; arp.ah.dest_ip_addr[2] = field6; arp.ah.dest_ip_addr[3] = field7;

請求報文與應答報文(0表示請求,1表示應答)

在填充請求包時,因為請求包在Ethernet上廣播,所以以太網頭部の目のMAC地址要填充為FFFFFFFFFFFF;ARP幀結構中の目のMAC地址可填充為任意數,

Fpg

_ETHER_HEAD eh; _ARP_HEAD ah;

UCHAR padding[18]; // to make sure the sizeof(BYTES) >= 60

Fpg

因為 它此時不起作用,所以填充數據字段要填充為0。 if (flag == 0)

{

arp.ah.operation_field = htons(0x0001);//地址轉換

for (i = 0; i < 18; i++) //0填充18位元組の0

arp.padding[i] = (UCHAR)0x00;

} else { }

arp.ah.operation_field = htons(0x0002); FormatMAC(arp.eh.dest_mac_addr, c_user); FormatMAC(arp.ah.dest_mac_addr, c_user); for (i = 0; i < 6; i++) {

arp.eh.dest_mac_addr[i] = (UCHAR)0xff; }

arp.ah.dest_mac_addr[i] = (UCHAR)0x00;

3.發送ARP數據包函數: /* 發送數據包 */

if (pcap_sendpacket(fp, (const u_char*)&arp, 60) != 0) { }

MessageBox(_T(\

exit(-1);

4.獲取網卡列表: /* 獲取本機設備列表 */

Fpg

本文来源:https://www.bwwdw.com/article/g9jf.html

Top