实验四IP包的分片和重组.doc

上传人:创****公 文档编号:1856429 上传时间:2019-10-28 格式:DOC 页数:8 大小:595.50KB
返回 下载 相关 举报
实验四IP包的分片和重组.doc_第1页
第1页 / 共8页
实验四IP包的分片和重组.doc_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《实验四IP包的分片和重组.doc》由会员分享,可在线阅读,更多相关《实验四IP包的分片和重组.doc(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、实验四实验四 IP 包的分片和重组包的分片和重组实验目的实验目的 通过实验掌握 IP 数据包的分片和重组的方法。实验内容实验内容 对一个较长的 IP 分组进行分片,然后再将所有的分片重新组装成一个 IP 分组。实验要求实验要求 (1) 从数据包文件如“packet.pkt”中读取分组,并输入一个整数值作为 MTU。首先计算 分组头校验和,判断分组接收是否正确,然后检查分组长度是否超过 MTU。如果长度超过 MTU,则检查 DF 位:若 DF 位为 1,打印出错信息;否则对 IP 包进行分片,生成各分片 的文件,如 Fragment1.pkt、Fragment2.pkt 等。 (2) 读取上一步

2、得到的各分片文件,首先计算头校验,检查分片是否正确;然后将各 个分片组装成一个完整的分组,并保存在一个数据包文件如“MergedPkt.pkt”中;比较 MergePkt.pkt 与原始的 packet.pkt 的数据部分内容,以检验分组分片和重组是否成功。尝 试不按顺序读入各个片段,验证重组程序是否仍然能够正确重组分组。实验提示实验提示 (1) IP 数据包的格式为:4位版本4位首部长 度8位服务类型(TOS)16位总长度(字节为单位)16位标识3位标志13位片偏移8位生存时间(TTL)8位协议16位首部检验和32位源IP地址32位目的IP地址与数据报的分片与重组有关的字段是:总长度、标识、

3、标志、分片偏移、TTL、16 位 首部校验和。 总长度:总长度:总长度以字节为单位,指该 IP 数据报的总大小,包括首部的 20 字节以及实 际的来自应用层的数据。判断一个数据包是否要进行分片,就是将收到的数据报的总长度 与 MTU 进行比较。如果总长度大于 MTU,就需要进行分片。 标识:标识:这个 16 位的字段标识从源主机发出的数据报。当数据报离开源主机时,这个 标识与源 IP 地址唯一地定义了这个数据报。为了保证唯一性,IP 协议使用了一个计数器 来标识数据报。当 IP 协议发送数据报时,就把这个计数器的当前值复制到标识字段中,并 把这个计数器的值加 1。当数据报被分片时,标识字段的值

4、就被复制到所有的分片中,即 同一个数据报的所有分片具有相同的标识。这个标识主要是用于在分片组装的时候对每个 分片属于哪个数据报进行判断。本次实验只考虑对同一个数据报进行分片,并把这些分片 重新组装,因此不需要做这个判断,只要直接把标识拷贝到各分片中即可。 标志:标志:这是一个 3 位的字段,如下图所示:D M第一个比特保留为以后用;第二个比特是不分片(Do not fragment)位。若这个值是 1,机器就不能把该数据报进行分片。若无法把这个数据报通过任何可用的物理网络进行 转发,就丢弃这个数据报,并向源主机发送 ICMP 差错报文。若这个值为 0,则在需要的 时候可把这个数据报进行分片。第

5、三个比特是还有分片(More fragment),若这个值是 1, 则表示这个数据报不是最后的分片,这个分片后面还有更多的分片。若这个值是 0,则表 示这已是最后的或者是唯一的分片。 分片偏移:分片偏移:这个 13 位的字段表示这个分片在整个数据报中的相对位置。是在原始数 据报中的数据偏移量,以 8 字节为度量单位。这样做是因为分片偏移字段只有 13bit 长, 它不能表示超过 8191 的字节数。而 IP 数据报最大的长度为 65535 字节,因此按 8 字节为 单位可以用 13 位来表示更多的字节。把数据报进行分片的主机或路由器必须选择每个分 片的长度,使得这个长度可以被 8 整除。 如下

6、图所示,一个具有 4000 字节的数据报,当 MTU=1420 字节的时候,被划分为 3 个分片,每个分片长度为 1400 字节,1400 字节是可以被 8 整除的。0000字节偏移=0000/8=000001399偏移=0000/8=0,大小为1400字节, 该IP数据报分片长度为1420字节14002799偏移=1400/8=175,大小为1400字节, 该IP数据报分片长度为1420字节28003999偏移=2800/8=350,大小为1200字节, 该IP数据报分片长度为1220字节IP头20字节3999字节为减少分片的数量,每个分片的长度应尽可能大。为用片偏移表示片段的起始位置, 除

7、最后一个分片外,其它分片的长度(数据部分,不包括 IP 头)应能被 8 整除。如 MTU=505 的时候,除去 20 字节 IP 头,可以传输的最大数据段长度为 485 字节,但可被 8 整除及不不超过 485 的最大整数为 480,需要按 480 来进行分片。 TTL:在分片的时候需要对原数据报的 TTL 进行减 1 操作,组装的时候不需要此操作。首部检验和:首部检验和:对于每一个分片,设置好各自的总长度、标识、标志、片偏移、TTL 之 后,需要重新对该 IP 报头重新计算校验和。(2) IP 数据报头的 C 语言定义可以用类似如下的数据结构: typedef struct tagIPHDR

8、 unsigned char VIHL;/Version and IHL unsigned char TOS;/Type Of Service short TotalLen;/Total Lengthshort ID;/IDentification short FlagOff;/Flags and Fragment Offset unsigned char TTL;/Time To Live unsigned char Protocol;/Protocol unsigned short Checksum;/Checksum unsigned long SrcAddr;/Source Addre

9、ss unsigned long DstAddr;/Destination Address IPHDR,*PIPHDR; 对各个域进行操作时要注意网络字节序与主机字节序的不同。对于 8 位的域,如 TOS、TTL 等不存这个问题。但对于 16 位的域,如总长度 TotalLen,从二进制文件中读 出来的 TotalLen 域从左到右为 0000 0000 0010 0100(即 0x0024) ,即 38,但如果直接 unsigned short length=IPhead.TotalLen 时这个值不等于 38。这主要是由于多字节数字在 内存中存储方式不同造成的,即大尾端小尾端的问题。解决此

10、问题可以用 ntohs 函数来解 决,即 unsigned short length=ntohs(IPhead.TotalLen),时 length 就等于 38 了。在操作 16 位的总长度和 16 位的首部校验和的时候需要注意这一点,不然使用位运算的时候会出 错。 同样对于 32 位源地址/目的地址也有这样的问题,但本次实验不涉及 IP 地址的操作。(3) 给定的数据文件如 packet.pkt 是二进制文件,不能用普通的文本浏览器浏览,可 以使用如 UltraEdit 或 WinHex 等二进制浏览器打开,其中不带选项的分组头为 20 字节, 如图所示:即 IP 头为 45 00 65

11、1A 37 A4 00 00 7F 06 EC 30 D3 56 92 89 D2 2D 7A FB 各个域写成二进制形式对应到 IP 头的各个域即可。 在程序中打开 IP 数据报文件的时候需要以二进制的方式打开,可以使用 fstream 的文 件流来进行文件读取操作。 #include ifstream SrcFileName(argv2,ios:in|ios:binary); IPHDR IPHead; Int IPHeadSize=20; SrcPkt.read(char *) fragment.write(char *)buf,IPHeadSize+nLastFragmentSize)

12、; 则可以将 buf 指针指示的一块大小为 IPHeadSize+nLastFragmentSize 字节的数据写入到文件 filename 所指示的文件中,Filename 是一个字符串,表示文件名。(4) 在编程过程中需要使用 htons 和 ntohs 函数,这需要包含 Winsock 库,具体操作 为: 1)在头文件中添加#include 2)在 VC+ 6.0 中选择“工程”“设置”“工程设置”“Link” “对象/库模块”中加入 “ws2_32.lib”。(5)、将片段组织成 IP 分组时,先拷贝原始的 IP 报头,再对其中的相关域进行修改, 包括:总长度(新的数据包长度) ,MF

13、(最后一个片段的 MF=0) ,片偏移,TTL(减 1) , 头校验设为 0,然后进行校验,把最终校验结果填到 Checksum 域中。注意片偏移是以 8 字节为单位计算的。(6) 计算头校验时,首先将头校验字段置为 0,然后将报头中所有 16 位字进行二进制 反码求和,其结果即为头校验。收到报文进行校验时,将报头中所有 16 位字进行二进制 反码求和,如果结果正确,和为全 1(取反为 0) 。校验和的计算请参看附录 B。(7) 对片段进行重组时,根据 MF 判断是否收到最后一个片段,根据最后一个片段的 偏移值和片段长度计算出原始数据报的总长度,根据已经收到的各个片段的长度之和判断 是否所有的

14、片段都已经到达,如果全部到达就可以开始重组。可以将收到的所有片段按照 偏移值的大小维护在一个有序的链表中,最后一次合并。为简单起见,假定片段都是属于 同一个报文的,因此可不对源地址和分组标识进行检查,且只需维护一个片段链表。(8) 在 Intel 环境下,对多字节数据如 unsigned short 进行操作时注意网络主机字节序 的转换。 (9) 请用 C 或 C+语言编写。实验实验要求要求(1)、完成一个分片程序,输入为一个以二进制形式存储的数据包文件,如 packet1.pkt,以及 MTU 如 MTU=500,要求输出是否允许分片、是否需要分片,如果分片 则需要生成各个片段,分别存储在类

15、似 fragmetn0.pkt、fragment1.pkt、fragment2.pkt 的 二进制文件中。 输入参数为:数据包文件名、MTU 的值。 (2)、完成一个组装程序,输入为(1)步中生成的各片段文件名,要求生成组装完成后的 数据包二进制文件,如 MergedPkt.pkt,并提取出最终组装得到的 IP 包中的数据(即剥掉 20 字节的 IP 头),以二进制形式存储在 Original.dat 文件中。实验实验指指导导建议两个同学一组完成本次实验,一人编写分片程序,一人编写重组程序。 本实验的助教为赫卫卿,有问题请发信到 。本实验报告及源 代码的提交截止日期为 12 月 23 日,请使

16、用文件名:“学号 A+学号 B+实验 4.rar”,如 “PB05210001+PB05210004+实验 4.rar”发送到 。实验报告中请给出程序的使用方法。 附录 A 一个示例同学们可从课程主页上下载第四次实验示例.rar 文件,解压之后里面有 3 个可执行程 序。 1、GenPkt.exe 该程序主要用于生成本次实验所需的输入文件。 其使用过程如下:其中 IPHeader.conf 是对 IP 报头的一些配置信息,内容为 Version 4 HeadLength 5 TOS 0 Identification 14244 DoNotFragment 0 MoreFragment 0 Of

17、fset 0 TTL 127 Protocol 17 SrcAddr 211.86.146.137 DstAddr 210.45.122.251 可以根据需要修改相应的值来获得不同的数据报。 1.jpg 是用来填充 IP 数据部分的文件,可以是文本文件,二进制可执行文件,图片等 等,在最后进行组装正确性验证的时候,需要比较该文件与最后组装完成后获得的文件是 否一致。 packet.pkt 则是生成的二进制文件,包括一个 20 字节的 IP 头,然后接着的数据就是 来自 1.jpg 里的二进制拷贝。 2、Fragment.exe 用来根据 MTU 对数据报进行分片。 其使用方法为:packet.

18、pkt 为第一步中生成的数据报文件,5000 为 MTU(字节数),分片程序根据总长 度与 MTU 的比较来决定是否需要分片,同时需要检查 D 位是否允许分片。如果允许分片 且需要分片,则产生分片,本例中产生了 6 个分片。 3、MergeFragment.exe,该程序为合并分片。其使用方法为:其输入为上一步中生成的各个分片的数据文件,可以不按生成分片的顺序合并。组装 完成之后会生成两个文件,MergedPkt.pkt 和 Original.dat,MergedPkt.pkt 中存放合并之 后生成的数据报,Original.dat 中以二进制形式存放着在(1)中“1.jpg”中的内容,如果把

19、 Original.dat 改名为 Original.jpg,则两幅图片应该是一样的。 实验中同学们可以使用 GenPkt.exe 来生成本次实验所需的数据报原始数据,要求同 学们完成 Fragment.exe 和 MergeFragment.exe 的功能。各步骤所生成的各类文件命名规 则可以自定,但都需要以下几个文件: 各分片文件,如 fragment0.pkt。 最终组装而成的文件,如 MergedPkt.pkt 从组装而成的文件中提取出来的数据单独存成一个文件,如 Original.dat附录 B:校验和的计算这个附录给出在二进制记法中如何进行校验和的计算。 B.1 二进制记法B.1.

20、1 部分和首先,我们计算如图 B-1 所示的部分和。我们把每一列相加,如果有进位,就加到下 一列。注意以下几点:1100000000000000001110111010111010111110010011100110010001001000001000011010011010101100000010000011100000101000000000000100010000000000001111000001000011111100000000000011010000000000001111000000000000000001010100010001010101001101010100010010

21、010100111001000111000000001001011011101001部分和第1列的进位第2列的进位第3列的进位第16列的进位第15列的进位这一列必须与 部分和相加图 B-1 二进制记法的部分和 当我们加第 1 列(最右边一列)的时候,我们得到 7。在二进制中,数 7 是 111。 我们保留最右边的 1,把其余的位进到第 2 列和第 3 列。 当我们加第 2 列时,我们计入从第 1 列来的进位。结果是 8,它是二进制的 1000。我们保留第一个位(最右边的),把其余 100 进位给第 3 列、第 4 列和第 5列。 对每一列重复以上过程。 当我们加完最后一列时,我们有两个 1 没有列可以进行相加。这两个 1 在下一个 步骤中应与部分和(Partial sum)相加。B.1.2 和如果最后一列没有进位,那么部分和就是和。但是,如果还有额外的列(在本例中,有 一个具有两行的列),那么就要把它加到部分和中,以便得出和。下图给出了这样的计算, 现在我们得出了和。和部分和10010110111010011110010110111010110110100100010100校验和图 B-2 二进制记法的和与校验和B.1.2 校验和在计算出和以后,我们把每一个位求反码,得出检验和。图 B-2 也给出了检验和。二进制计算方法其实可以转换为十进制计算,原理相同,请同学们自己思考。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com