计算机网络实验报告
实验一使用winpcap网络层收发包实验
一.
实验目的.
1、 了解数据链路层通信的基本方法; 2、 了解pcap编程方法。 二. 实验步骤及结果
1.查询本机mac地址,IP地址,路由器物理地址
(1)
进入windows命令输入框: 点击开始菜单 运行输入cmd,然后
回车:
(2) 在岀现的 windows命令输入中输入 ipconfig/all命令查看主机的网络参数 (3) 输入arp -a命令查看路由器的参数。
2. 运行test.dsw程序,选择合适的网卡填入
project setting debug中
3. 打开ethereal进行侦听,同时运行fs.dsw观察到如下结果,实验成功
C *C:^DocuMent2 s and Se+tines\\0mer\\^面12011年刚络实验E用八量后魚本'实9& f… ■ J5 48 54,839915 len 74 74 斗54.839980 linn 15 4& 55,843391 len 74 X5 48 55,043374 len 74 H5 48 55.246878 Inn 74 15 48 55,246135 Ion 74 15 4? 55,449527 len 74 15 48 55,449595 len 74 15 18 55,654902 len 74 15 4U 654956 len 74 p 48 55,855456 len 74 1S 48 55.B55524 Inn 74 15 1K 56,060058 Lun 74 15 48 56,860141 len 74 15 48 56.262561 Inn 74 15 46 56,262615 len 74 15 49 01,949238 len 7B 15 49 11,949709 len 78 15 49 21,95^101 len 70 15 49 24,523577 len 365 *5 49 24,551384 len 170 15 49 2-1.7S3SS8 len 111 fs 49 31,950667 lan 70 len 78 549 41,951133 I
禅(Dm it J if - Ethfir?al File £dh型砂血龙申沙厝&iatyzB埶州弭“ yelp
牛E羽血引cm . l^tleai Q 郎叭
版- Tima Source DesfinahM 1“ ■萌 m
172.1^4.^ 172.1fi.l5>.4 172.1&.4.Z 172.16^15.4. 172-16.4-2
^CMCCOl Info Gdhg Cp^ng) request Eciho (]p!ngi5 reply Ectio (jpIngD request Echo (plngj reply Edhci (.ping) regiesT £ 503 51.18B3Q9 172.16.^1.2 506 51.1353 73 172.16.15.4 507 51.391766 172.16.4.2 172.16-15.4l SOB 51. 390.613 ■ ——■ ■?■■■ 172,1^15^ SU 51< 7?nw 172rl4.-4.2 51。51, 5*71W 512 51,7*7762 513 52. M2Z58 514 52.0Q2378 515 52.2O4BQQ 516 52飞吹3呂対I 巧 172. 172. 16.^. 2 172. 16.13.4 16u4.2 172. 16-15.4 172 16.15,1 16.15,1 -iszm 172.720.191.124.133 220.LSI. 1^.133 uz—ia UZBU-IS^ Kt mu 172-1&B 15,4 172.1fi.4.2 1Z2-1&.15-4 172.16,4-2 zjircnhj ICMP ICMP ICMP ICMP ICMF ICMP IWP ICMP ICMP ICMP ICMP ICMP ICMP Q5PF [JS?F MPF 520 80.445&l^ 5Z1 6D,4936?^ r Q . 00 * 72O.1S1?1邮?1站 W172. l&r 15,4? 1&.LS.? Wlig p?ck?t 0*45 Staniiatrd query ynknown 谑209) cUnkriown ?xtertdsd lat C*45 ENM5 Standard qMery[Nalforrnecli Packet] 0*15 rigrnEi: 51 neTla Picker QSPF He]no Pad^f OEPF Hello packer I 1 ____________________ Frame 5Z2 (111 byres on wire. Ill byres capcured) .?■ J J H ■ ODDO 01 01 01 01 01 01 02 02 02 02 02 D2 Oc 0d De Ot ——…… 0010 10 11 12 13 U IS 16 17 18 19 la lb 1c Id 1? If DOZO 2Q 21 22 23 24 25 2-6 27 28 29 2A Zb 2ufc匚 2d 2& 2f ! f(? &OJO 30 31 32汨理站曲17 3B理弧珈北3d M 丼 OLH巧昭 DQAQ *0 41 碗 43 44 45 托 47 斗呂?9 4a Ah 4d Je 4f 0*■:DEF右 HlJKLMNO 0常D 50 51 対 5E 54 讣硏 57 阳 59 弘仙 5c 5d M 51F P^RSTHJVW □D6Q 60 61 62 61 6Ji 65 66 67 69 69 6a 6b 6C 6d 6e ' abcdef g 三■实验相关算法及函数 (1)定义了一个链表的结点 pcap_if() pcap_if { struct pcap_if *next;//指针 char *name; 指针 //给pcap_open_live ()函数传递的一个描述设备名称的字符串 char *description; 〃如果不为NULL,则指向描述设备的一个可读字符串 struct pcap_addr *addresses;/一个指向接口地址链表的第一个元素的指针 bpf_u」nt32 flags; //接口标志 }; (2)获取本地设备列表函数 pcap_findalldevs_eXchar *source, struct pcap_rmtauth *auth,pcap_if_t **alldevs, char *errbuf); 该函数创建一个能用 pcap_open函数打开的网络适配器设备列表。 “source'是一个告诉函数在哪儿查找设备的参数 WinPcap语法保存着“源的位置\。 ,是一个字符型的缓冲区,根据新的 参数auth是一个指向pcap_rmtauth结构体的指针。该指针保持着认证 RPCAP连接到 远程主机所需的信息。该参数对本地主机请求没什么意义,此时可以设为 NULL。 参数alldevs是一个“ pcap_if_t\结构体类型的指针,在该函数中被正确的分配。该函 数成功返回时,该指针被设置为指向网络设备链表的第一个元素,该链表的每个元素都是 “ pcap_if_t \类型。 参数errbuf是一个指向用户分配的缓冲区(大小为 如果函数操作出现错误,该缓冲区将存储该错误信息。 函数成功则返回 0,如果有错误则返回-1。“alldevs”变量返回设备列表,当函数正确 返回时,“alldevs”不能为 NULL。也就是说,当系统没有任何接口时,该函数也返回 1。 -PCAP_ERRBUF_SIZE )的指针, “ errbuf ”变量返回错误信息 (3) pcap_freealldevs 函数 必须 由函数pcap_findalldevs_ex或pcap_findalldevs函数返回的网络适配器设备链表, 调用pcap_freealldevs函数释放。 (4) 函数 pcap_open(const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf); 参数source是以’\\0'结尾的字符串,包含所需打开源的名称。该源名称必需包含格 式化的前缀,并要求符合新“源规范语法”的规定,也可以为 NULL。 参数snaplen是必须保留的数据包长度。对于过滤器所接收的每个数据包,只有开始 snaplen字节的内容被存储到缓冲区中,并被传递给用户层的应用程序。 参数read_timeout是以毫秒为单位的读取超时时间。读取超时用来处理,捕获一个数 据包后,读操作并不必需要立即返回的情况。但这可能等待一些时间以允许捕获更多的数 据包,这样用户层的一次读操作就可从操作系统的内核中读取更多的数据包。 参数auth是一个指向一个pcap_rmtauth结构体的指针,该结构体保存远 程机器上用户所需的认证信息。万一这不是一个远程捕获,该指针可以被设置 为 NULL 参数errbuf指向用户所分配的一个缓冲区,将用来存储该函数的错误信息。 函数返回一个指向” pcap_t ”的指针,将作为后续调用的参数(如 pcap_sendpacket()等等),其描述了一个已打开的 WinPcap会话。如果出现问 题,函 数返回NULL并通过” errbuf ”变量保存错误信息。 (5) 函数 pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **) 从一个网络接口或离线捕获方式(例如读文件)读取一个数据包。该函数被用来重新 获得下一个可用的数据包,没有使用 libpcap 提供的传统的回调方法。 pcap_n ext_ex 用指向头和下一个被捕获的数据包的指针为 pkt_header 和 pkt_data 参数赋值。 (6) 函数 int pcap_sendpacket(pcap_t *p, const u_char *buf, int size) 其中参数p是用来发送数据包的一个 pcap_t类型描述符,即发送数据包的接口,参数 buf包含所要发送数据包的数据 (包含数据包的协议头),参数size是buf所指缓冲区的大小, 也就是所要发送数据包的大小。无需包含 MAC的CRC,因为它被网络接口的驱动程序计 算并添加。该函数如果成功就返回 0,否则返回-1。 (7) 函数 char *pcap_geterr(pcap_t *p) 返回最后一个 pcap 库错误消息。 实验二 跨网络数据传输实验 一. 实验目的. 1、 了解IP地址与硬件地址的区别,掌握 IP包结构; 2、 理解ICMP包的回送和回送响应消息功能; 二. 实验步骤及结果. (1) 修改程序中的IP地址,目的IP,主机MAC,路由器MAC (2) 运行程序,打开程序进行侦听.