1、网络协议分析实验指导书贾伟陕西理工学院数学与计算机科学学院2015-06网络协议分析实验说明适用网络工程专业2012级。实验总学时:10学时;实验项目:6个,其中3个验证,3个综合,必须完成1、2、4这三个实验.通过使用wireshark捕获数据包进行分析和使用C语言编程实现对数据包的构造和分析进行实验,每个实验完成后需要将实验捕获的数据、程序代码等实验数据保存下来并上交.实验完成后,除上交纸质的实验报告外,还要上交实验有关的电子文件,要求文件命名为:“实验X_学号_姓名_其它说明”,X取值为中文汉字“一”、“二”、 ,连接符为英文输入的下划线“_,学号为完整长度,各项中间均不得添加空格。实验
2、项目表序号实验项目名称内容课时性质0网络协议分析基础(预备实验)数据包捕获软件的使用;C语言编程。2验证/可选1网络层协议分析捕获ARP、IP、ICMP网络数据包并分析;编程构造IP数据包.4综合/必做2传输层协议分析捕获TCP、UDP网络数据包并分析;编程构造UDP数据包.4综合/必做3HTTP协议分析捕获HTTP网络数据包并分析。2验证/可选4协议分析器程序设计编程捕获数据包并统计数据包信息。4综合/可选5Winpcap编程基础通过Winpcap 捕获发送数据包2验证/可选0. 网络协议分析基础(预备实验)0。A 数据包捕获软件的使用数据包捕获分析软件建议选择Wireshark,因为它目前
3、是全世界最广泛的网络数据包分析软件之一。参考文献:(ISBN:978-7-115-302366)Chris Sanders;诸葛建伟等(译).Wireshark数据包分析实战(第2版)。人民邮电出版社.2013,3。0.A。1尝试软件的下载和安装0.A.2设置软件捕获过滤器0。A.3选取网卡,开启捕获0。A.4停止捕获,保存捕获数据,打开捕获的数据文件0.A.5打开捕获的数据文件,查看数据包内容0.A。6设置显示过滤器0.A。8 Wireshark高级数据包分析查看网络端点和网络会话;跟踪TCP流,图形展示IO流和数据流.0.B C语言编程与网络数据包操作分析熟悉内存数据块的数据保存形式和对其
4、使用不同指针的读取形式所获得的不同数据内容。0.B.1 C的有关知识回顾1) 了解ANSI C and ISO C的KeywordsC89 has 32 keywords (reserved words with special meaning):autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile2) 掌握C的有关基
5、本数据类型及其长度类型长度(bit)说明char:8typical 8bitsshort:16typical 16-bitsint:16/32typical 16bits or 32-bits,bits-number of int must be more than short。long:32typical 32bits,also larger than int3)字符数组和结构体定义(1)定义字符数组的语法(2)定义结构体的语法(3)数据类型的强制类型转换语法4)指针操作(1)定义指针变量的语法(2)指向字符数组的指针(3)指向结构体的指针5)比特位操作(与、或和移位)0。B.2 C语言编程
6、练习1) 输出内存地址的16进制形式2) 讨论IPv4地址的定义和操作定义形式i)定义为32bit长度的无符号整数unsigned int ip;ii)定义为4个8bit长度的无符号字符串unsigned char ip4;实现1)点分十进制形式的输入输出;2)判断是否是合法的IP地址;3)判断属于的IP地址类别(A、B、C、D类);4)给IP地址和掩码,给出网络前缀;5)给2个IP地址和掩码,判断两个IP是否属于同一个网络。3)字节序(BYTE ORDER)讨论了解字节序(大端序和小端序)的含义.参考网上资料:http:/zh.wikipedia。org/wiki/字节序。1)如何判断本机的
7、字节序。int main(int argc, char argv)/怎样判断机器的*字节顺序*是高字节在前还是低字节在前?/1.A.有个使用指针的方法:2.另外一个可能是用联合。int x = 0x87654321;unsigned char * p;p = (unsigned char *)x;printf(%Xn”, x);/87654321for (int i = 0; i 8) ) | ( (0xff (x)) 24) 0x000000ff) (x) 8) & 0x0000ff00) | (((x) 8) 0x00ff0000) (x)8) ) ( (0xff & (x)) 24) &
8、 0x000000ff) ((x) 8) & 0x0000ff00) ((x) 8) & 0x00ff0000) ((x)h_source, saddr, 6);ethh_proto = htons(type);*eth_frame = frame;*ethframeLen=14+len;return ethframeLen;1. 网络层协议分析1。A 数据包捕获分析部分1.A。1、实验目的1)、了解 ICMP 协议报文类型及作用.2)、理解IP协议报文类型和格式.3)、分析 ARP 协议的报文格式,理解 ARP 协议的解析过程。1.A。2、实验内容介绍1)、ICMP协议分析实验执行 ping
9、 和 tracert 命令,分别截获报文,分析截获的 ICMP 报文类型和 ICMP 报文格式,理解 ICMP 协议的作用。2)、IP协议分析实验使用 Ping 命令在两台计算机之间发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IP V4 地址的编址方法,加深对 IP 协议的理解。3)、IP 数据报分片实验我们已经从前边的实验中看到,IP 报文要交给数据链路层封装后才能发送.理想情况下,每个 IP 报文正好能放在同一个物理帧中发送.但在实际应用中,每种网络技术所支持的最大帧长各不相同。例如:以太网的帧中最多可容纳 1500 字节的数据,这个上限被称为物理网络的
10、最大传输单元(MTU,MaxiumTransfer Unit)。TCP/IP 协议在发送 IP 数据报文时,一般选择一个合适的初始长度。当这个报文要从一个 MTU 大的子网发送到一个 MTU 小的网络时,IP 协议就把这个报文的数据部分分割成能被目的子网所容纳的较小数据分片,组成较小的报文发送。每个较小的报文被称为一个分片(Fragment)。每个分片都有一个 IP 报文头,分片后的数据报的 IP 报头和原始 IP 报头除分片偏移、MF 标志位和校验字段不同外,其他都一样。重组是分片的逆过程,分片只有到达目的主机时才进行重组。当目的主机收到 IP 报文时,根据其片偏移和标志 MF 位判断其是否
11、一个分片。若 MF 为 0,片偏移为 0,则表明它是一个完整的报文;否则,则表明它是一个分片.当一个报文的全部分片都到达目的主机时,IP 就根据报头中的标识符和片偏移将它们重新组成一个完整的报文交给上层协议处理.4)、ARP协议分析实验本次实验使用的Windows自带的Arp命令,提供了显示和修改地址解析协议所使用的地址映射表的功能。Arp 命令的格式要求如下:ARP -s inet_addr eth_addr if_addrARP -d inet_addr if_addrARP a inet_addr N if_addr其中: -s:在 ARP 缓存中添加表项:将 IP 地址 inet_ad
12、dr 和物理地址 ether_addr 关联,物理地址由以连字符分隔的 6 个十六进制数给定,使用点分十进制标记指定 IP 地址,添加项是永久性的; -d:删除由 inet_addr 指定的表项; a:显示当前 ARP 表,如果指定了 inet_addr 则只显示指定计算机的 IP 和物理地址; inet_addr:以点分十进制标记指定 IP 地址; N:显示由 if_addr 指定的 ARP 表项; if_addr:指定需要选择或修改其地址映射表接口的 IP 地址; ether_addr:指定物理地址;1。A。3、实验步骤1)、ICMP协议分析步骤1:分别在 PC1 和 PC2 上运行 Wi
13、reshark,开始截获报文,为了只截获和实验内容有关的报文,将 Wireshark 的 Captrue Filter 设置为“No Broadcast and no Multicast”;步骤2:在 PC1 以 PC2 为目标主机,在命令行窗口执行 Ping 命令;请写出执行的命令:【 】步骤3:停止截获报文,将截获的结果保存为“ICMP-1学号”,分析截获的结果,回答下列问题:1)您截获几个 ICMP 报文?分别属于那种类型?答: 2)分析截获的 ICMP 报文,查看表 1。A。1 中要求的字段值,填入表中。表 1。A.1 ICMP报文分析报文号源IP目的IP报文格式类型代码标识序列号16
14、17XX+16162【x为学号后两位】实验捕获的报文数据截图:报文16报文17报文x报文x+1分析在上表中哪个字段保证了回送请求报文和回送应答报文的一一对应,仔细体会Ping 命令的作用。如何保证请求报文和应答报文时一一对应的?答: 步骤4:在 PC1 上运行 Wireshark 开始截获报文;步骤5:在PC1上执行Tracert命令,向一个本网络中不存在的主机发送数据报,如:Tracert ;步骤6:停止截获报文,将截获的结果保存为“ICMP-2-学号”,分析截获的报文,回答下列问题:截获了报文中哪几种 ICMP 报文?其类型码和代码各为多少?答: 在截获的报文中,超时报告报文的源地址是多少
15、?这个源地址指定设备和 PC1 有何关系?答: 通过对两次截获的 ICMP 报文进行综合分析,仔细体会 ICMP 协议在网络中的作用。答:2)、IP协议分析步骤1:截获 PC1 上 ping PC2 的报文,结果保存为“IP学号”;步骤4:取序号为学号的数据报,分析 IP 协议的报文格式,完成下列各题:-1)分析 IP 数据报头的格式,完成表 5。2;表 5.2 IP协议字段报文信息说明版本头长服务类型总长度标识标志片偏移生存周期协议校验和源地址目的地址实验捕获的报文数据截图(突出显示分析的报文):1) 查看该数据报的源 IP 地址和目的 IP 地址,他们分别是哪类地址?体会 IP 地址的编址
16、方法。答: 3)、IP数据报分片实验步骤1:在 PC1、PC2 两台计算机上运行 Wireshark,为了只截获和实验有关的数据报,设置 Wireshark 的截获条件为对方主机的 IP 地址,开始截获报文;步骤2:在 PC1 上执行如下 Ping 命令,向主机 PC2 发送 4500B 的数据报文:Ping l 4500 n 6 PC2的IP地址步骤3:停止截获报文,分析截获的报文,回答下列问题:1)以太网的 MTU 是多少?答: 2)对截获的报文分析,将属于同一ICMP 请求报文的分片找出来,主机 PC1 向主机 PC2发送的 ICMP 请求报文分成了几个分片?答: 3)若要让主机PC1向
17、主机PC2发送的数据分为 3 个分片,则 Ping 命令中的报文长度应为多大?为什么?答: 4)将第二个 ICMP 请求报文的分片信息填入表 5。3:表 5。3 ICMP请求报文分片信息分片序号标识(Identification)标志(Flag)片偏移(Fragment数据长度4)、ARP协议分析实验步骤1:在 PC1、PC2 两台计算机上执行如下命令,清除 ARP 缓存:答: 步骤2:在 PC1、PC2 两台计算机上执行如下命令,查看高速缓存中的 ARP 地址映射表的内容:答: 步骤3:在 PC1 和 PC2 上运行 Wireshark 截获报文,为了截获和实验内容有关的报文,Wiresha
18、rk 的 Captrue Filter 设置为默认方式;步骤4:在主机 PC1 上执行 Ping 命令向 PC2 发送数据报;步骤5:执行完毕,保存截获的报文并命名为 “ARP-1-学号”;步骤6:在 PC1、PC2 两台计算机上再次执行 ARP a 命令,查看高速缓存中的 ARP 地址映射表的内容:1)这次看到的内容和步骤 2的内容相同吗?结合两次看到的结果,理解 ARP 高速缓存的作用。答: 把这次看到到的高速缓存中的 ARP 地址映射表写出来或给出截图。接口IP地址IP地址Internet Address物理地址Physical Address类型Type备注步骤7:重复步骤 45,将此
19、结果保存为 “ARP-2-学号”;步骤8:打开 arp-1-学号,完成以下各题:1)在截获的报文中由几个 ARP 报文?在以太帧中,ARP 协议类型的代码值是什么?答: a) 分析 arp1 中 ARP 报文的结构,完成表 5.4。表 5。4 ARP报文分析ARP请求报文ARP应答报文字段报文信息及参数字段报文信息及参数硬件类型硬件类型协议类型协议类型硬件地址长度硬件地址长度协议地址长度协议地址长度操作操作源站物理地址源站物理地址源站IP地址源站IP地址目的站物理地址目的站物理地址目的站IP地址目的站IP地址1。B 编程构造IP数据包部分使用C语言构造IP数据包程序。1) IPv4基本定长首部
20、结构体定义struct iphdr ;2)构造IP报文unsigned char Build_IP_Packet(unsigned int d_ip, unsigned int s_ip,unsigned char proto_type, const unsigned char *buf, int len,unsigned char * ippacket, int iplen)return ippacket;3)IP校验和计算/TCPIP协议中的校验和计算unsigned short checksum(unsigned short *ptr, int nbytes)2。 传输层协议分析2。A
21、数据包捕获分析部分2.1 实验目的理解TCP报文首部格式和字段的作用,TCP连接的建立和释放过程,TCP数据传输中编号与确认的作用.2。2 实验内容应用TCP应用程序传输文件,截取TCP报文,分析TCP报文首部信息,TCP连接的建立过程,TCP数据的编号和确认机制。2。3 实验原理TCP协议是传输控制协议的简称,工作在网络层协议之上,是面向连接的,可靠的,端到端的传输层协议。1) TCP的报文格式TCP报文段分为头部和数据两部分,如图1:图1 TCP报文段的总体结构TCP首部TCP数据部分TCP报文段首部又分为固定部分和选项部分,固定部分为20B,如图2所示,这些字段的组合实现了TCP的所有功
22、能.图2 TCP报文段的首部 0 15 31源端口目的端口序号确认号头部长度(4bit)保留URGACKPSHRSTSYNFIN窗口校验和紧急指针选项(长度可变)填充TCP采用传输输连接的方式传送TCP报文,传输连接包括连接建立、数据传输和连接释放三个阶段。2) TCP连接的建立TCP连接建立采用“3次握手”方式。首先,主机A的TCP向主机B的TCP发出连接请求报文段,其首部中的同步位SYN应置1,同时选择一个序号X,表明在后面传送数据时的第一个数据字节的序号是X+1,如图3所示:被动打开主动打开确认连接请求图3 TCP连接建立的3次握手过程然后,主机B的TCP收到连接请求报文段后,若同意,则
23、发回确认。在确认报文段中应将SYN和ACK都置1,确认号应为X+1,同时也为自己选择一个序号Y。最后,主机A的TCP收到B的确认后,要向B发回确认,其ACK置1,确认号为Y+1,而自己的序号为X+1。TCP的标准规定,SYN置1的报文段都要消耗掉一个序号。同时,运行客户进程的主机A的TCP通知上层应用进程,连接已经建立。当主机A向B发送第一个数据报文段时,其序号仍为X+1,因为前一个确认报文段并不消耗序号。当运行服务器进程的主机B的TCP收到主机A的确认后,也通知其上层应用进程,连接已经建立。另外,在TCP连接建立的过程中,还利用TCP报文段首部的选项字段进行双方最大报文段长度MSS协商,确定
24、报文段的数据字段的最大长度。双方都将自己能够支持的MSS写入选项字段,比较之后,取较小的值赋给MSS,并应用于数据传送阶段。3) TCP数据的传送为了保证TCP传输的可靠性,TCP采用面向字节的方式,将报文段的数据部分进行编号,每个字节对应一个序号。并在连接建立时,双方商定初始序号.在报文段首部中,序号字段和数据部分长度可以确定发送方传送数据的每一个字节的序号,确认号字段则表示接收方希望下次收到的数据的第一个字节的序号,即表示这个序号之前的数据字节均已收到。这样既做到了可靠传输,又做到了全双工通信。当然,数据传送阶段有许多复杂的问题和情况,如流量控制、拥塞控制、重传机制等,本次实验不探究.4)
25、TCP连接的释放在数据传输结束后,通信的双方都可以发出释放连接的请求。TCP连接的释放采用“4次握手。如图图4 TCP连接释放的4次握手过程首先,设图4中主机A的应用进程先向其TCP发出释放连接的请求,并且不再发送数据.TCP通知对方要释放从A到B这个方向的连接,将发往主机B的TCP报文段首部的中止位置1,其序号X等于前面已传送过的数据的最后一个字节的序号加1。主机B的TCP收到释放连接通知后即发出确认,其序号为Y,确认号为X+1,同时通知高层应用进程,如图中的箭头。这样从A到B的连接就被释放了,连接处于半关闭状态,相当于主机A对主机B说“我已经没有数据发送了.但是如果你还有数据要发送,我仍然
26、接收。”此后,主机B不再接收A发来的数据。但若主机B还有一些数据要发给A,则可以继续发送(这种情况很少)。主机A只要正确收到数据,仍然向B发送确认。若主机B不再向主机A发送数据,其应用进程就通知TCP释放连接,如图中的箭头.主机B发出的连接释放报文段必须将中止位FIN和确认位ACK置1,并使其序号仍为Y(因为签名发送的确认报文段不消耗序号),但是还必须重复上次已经发送过的ACKX+1。主机A必须对此发出确认,将ACK置1,ACK=Y+1,而自己的序号仍然是X+1,因为根据TCP标准,前面发送过的FIN报文段要消耗掉一个序号.这样就把B到A的反方向的连接释放掉。主机A的TCP再向其应用进程报告,
27、整个连接已经全部释放。2。4 实验步骤步骤1 在Wireshark中设置过滤条件,协议为TCP HTTP,地址为本机any,并开始截获报文;步骤2 打开www.sina。com.,完成后,保存截获的报文并命名为“TCP学号,分析捕获的报文.这里,TCP的连接和建立采用的是: 方式,本机是 ,远端主机是 .步骤3 分析TCP连接建立过程的前3个报文,填写下表1:表1 TCP建立过程的三个报文信息字段名称第一条报文第二条报文第三条报文报文序号Sequence NunberACK NumberACKSYN步骤4 分析截获报文中数据发送部分的第一条TCP报文及其确认报文,将报文中的字段值填写在表格2中
28、。表2 TCP报文首部信息字段名长度字段值字段意义发送报文确认报文步骤5 TCP连接建立时,其报文首部与其它TCP报文不同,有一个option字段,它的作用是什么?结合IEEE802。3协议规定的以太网最大帧长分析此数据是怎么得出来的?步骤6 分析TCP数据传送阶段的前8个报文,将报文信息填入表3:表3 TCP数据传送部分的前8个报文报文序号报文种类序号字段确认号字段数据长度被确认报文序号窗口2。5 实验总结在实验中,通过分析截获的TCP报文首部信息,可以看到首部中的序号、确认号等字段是TCP可靠连接的基础。分析TCP头部信息,分析“3次握手”过程.通过对数据传送阶段报文的初步分析,了解数据的
29、编码和确认机制。总之,TCP协议中的各项设置都是为了在数据传输时提供可靠的面向连接的服务。2.B 编程构造UDP数据包部分使用C语言构造UDP数据包程序。1) UDP首部和伪首部结构体定义/ UDP 首部*/struct udphdr;/UDP中校验使用的伪首部struct pseudo_header;2)构建UDP报文数据int build_udp_Package(struct socket_pair sp,const unsigned char *buf,int len,unsigned char *udpPacket,int udpPacketLen)3. HTTP协议分析实验目的在PC
30、机上访问Web 页面,截获报文,分析HTTP 协议的报文格式和HTTP 协议的工作过程。实验设备和连接请通过访问可以连接的WWW 站点来进行实验。实验步骤步骤1:在PC 机上运行Wireshark,开始截获报文,为了只截获和我们要访问的网站相关的数据报,将截获条件设置为 “not broadcast and not multicast”;步骤2:从浏览器上访问Web 界面,如http:/202。202.43。125。打开网页,待浏览器的状态栏出现 “完毕”信息后关闭网页。步骤3:停止截获报文,将截获的报文命名为“HTTP-学号”保存。分析截获的报文,回答以下几个问题:1)综合分析截获的报文,查
31、看有几种HTTP 报文?答: 2)在截获的HTTP 报文中,任选一个HTTP 请求报文和对应的 HTTP 应答报文,仔细分析它们的格式,填写表20 和表21。 表20 HTTP 请求报文格式方 法版 本URL首部字段名字段值字段所表达的信息AcceptAccept-LanguageUserAgentHostConnection 表21 HTTP 应答报文格式 版 本状态码短 语首部字段名字段值字段所表达的信息DateServerEtageAccept-RangesLastModified3)分析在截获的报文中,客户机与服务器建立了几个连接?服务器和客户机分别使用 了哪几个端口号?答: _4 )
32、综合分析截获的报文,理解HTTP 协议的工作过程,将结果填入表22 中。 表22 HTTP 协议工作过程HTTP 客户机端口号HTTP 服务器端口号所包括的报文号步骤说明实验小结本次实验的主要目的是 在PC 机上访问RCMS 的Web 页面,截获报文,分析HTTP 协议的报文格式和HTTP 协议的工作过程。 HTTP 是一个面向事务的客户服务器协议。尽管HTTP 使用TCP 作为底层传输协议,但 每个事务都是独立地进行处理。当一个事务开始时,就在万维网客户和服务器之间建立一个TCP 连接,而当事务结束时就释放这个连接。4. 协议分析器程序设计4。1定义报文头部数据结构4。1。1 UDP首部和伪
33、首部结构体定义/ UDP 首部*/struct udphdr;/UDP中校验使用的伪首部struct pseudo_header;4。1。2 IPv4基本定长首部结构体定义struct iphdr ;4。1。3 以太网帧首部结构体定义struct ethhdr unsigned char h_dest6;/* destination eth addr*/unsigned char h_source6;/ source ether addr/unsigned short h_proto;/* packet type ID field*/;4.1.4 网络通信5元组封装为结构体数据struct s
34、ocket_pair unsigned char proto_type; /取值同IP头部字段的协议取值/ unsigned shortd_port;/目的端口*/ unsigned shorts_port;/源端口*/ unsigned char d_ip4; /*目的IP地址*/ unsigned char s_ip4; /源IP地址/ ;4。2分析显示报文头部信息函数设计4。2.1 以太网帧首部信息显示int print_eth_frame(const unsigned char *frame_data, int len)struct ethhdr frame;frame =(struc
35、t ethhdr *) frame _data;printf(n该帧报类型ID为%H,”, ntohs(frame-h_proto));if(ntohs(frameh_proto)=0x0800)printf(”上层协议为IP.n); return 0;4.2。2 IPv4基本定长首部信息显示int print_ip_pkt(const unsigned char *pkt_data,int len)4.2.3 UDP首部信息显示int print_ udp_pkt(const unsigned char *pkt_data,int len)4。3 Winpcap中打开网络接口捕获数据(参考资料(中文):http:/www。ferrisxu。com/WinPcap/html/index。html)1)获取设备列表2)打开适配器并捕获数据包3)不用回调方法捕获数据包4)发送数据包5)例程:分析数据包(http:/www。ferrisxu。com/WinPcap/html/group_wpcap_tut6.html)5. Winpcap编程基础当应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包时,socket无法