北京大学计算机网络实习第二次实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机网络实习2IPv4协议收发实验
李舜阳00948318
April28,2012
Part I
实习概述
本次实习重点在于对于IPv4分组头部结构的处理,只需要实现发送、接收2个函数。
具体实习流程在实验讲义中写得比较详细,这里就不罗嗦了。
Part II
重难点
需要理解和掌握的概念有:
IPv4数据报头部结构、组成内容、意义等信息
IP分组校验和的计算
IP分组的拆分和封装
Part III
实习内容
虽然有7个测试,但是本质上分为2类:接收、发送。建议先完成发送功能,之后的接收功能就是顺水推舟的事情。
做完此次实习之后对于下面这张图即使没有背下来估计也差不多了,有必要再看一眼:
1
1IP分组发送
实现如下函数:
int stud ip Upsend(char*pBuffer,unsigned short len,unsigned int srcAddr,unsigned int dstAddr,byte
protocol,byte ttl)
1.1相关数据结构
pBuffer:指向分组头内容,由于实验约定分组头没有可选部分,因此所有的收发分组头的长度都是固定的20个字节。
1.2流程图
2
1.3主要逻辑介绍
流程非常简单,没啥好说的。如何布置代码结构使得构造pBuffer显得简洁而优雅是一个值得琢磨的问题。但是鉴于时间有限,没花多于的精力在代码优化上面。
代码中大量用到了位操作,这是不可避免的,这里需要注意的是,最好在每个填充语句处都用一个“与”操作将其他不相干的部分屏蔽掉,避免一些不必要的麻烦。因为我发现C++有时候会自动扩展符号位,比如一个char变量的值最高位为1,那么如果用一个int类型指针操作该变量时会自动把9~31位都填充为1,如果不幸此后还有后续操作就会出错。
对于校验和的计算绝对是本次实习的重中之重,对我来说超过一半的时间花在这上面。由于实验讲义和课本上都没有详细说明这部分的计算,因此只好求助于网络资源。(相关文档参见报告的附件部分)
这里只简单描述一下构造过程,照例给出一个流程图比较清晰:
首先将IP分组头部的全部20个字节以2个字节(16位)为单位累加在checksum变量中,这里的加法运算是补码加法运算,也就是通常的加法运算。
然后检查checksum的17~31位,因为可能产生了进位。如果高16为非0,则把高16位也累加到低16位上,如此迭代直到高16位为0,这里的加法也是补码加法。
最后将计算得到的checksum按位全部取反。计算结束,可以将checksum填充进IP分组了。
由于操作粒度是16bit(2个字节),因此需要特别注意字节序的问题,我就在这里纠结了很久,后来采用的一个偷懒的方法是一次处理8bit(1个字节),因为这样恰好可以放进一个char类型的变量中,就不存在字节序的的问题了。举例来说,可以用一个char变量先取0~7位内容,左移8位,再加上剩下的8位(8~15位),这样就等价于一次取了0~15位。具体实现参见下方的代码。
1.4代码
3
代码的11~40行是IP分组头填充,此时的校验和被初始化为0(31、32行)代码的41~54行是计算校验和
4
2IP分组接收
实现如下函数:
int stud ip recv(char*pBuffer,unsigned short length)完成发送后,接收函数就非常好写了,参照着发送代码的pBuffer部分写就行了。
2.1相关数据结构
pBuffer:同发送部分
2.2流程图
2.3主要逻辑说明
按照流程来即可。
2.4代码
5
注意地址字段需要字节许转换(代码的第6行)
校验和检验是生成校验码的逆过程(12~24行,那个warnning注释是我出错的地方,所以还是要小心那!)
Part IV
收获和感想
通过本次实习,对IP分组头有了充分的了解,尤其是那张图。
校验和计算比较容易出错,需要对照实验平台反复比对。
由于时间有限,没有太考虑代码优化,就这样了!
6