北京大学计算机网络实习第二次实习报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档