计算机网络实验代码与文件可见github:计算机网络实验整理

实验名称 IPv4 分组收发实验&IPv4 分组转发实验

实验目的:

(注:实验报告模板中的各项内容仅供参考,可依照实际实验情况进行修改。)

本次实验的主要目的。

  1. IPv4 分组收发实验 IPv4 协议是互联网的核心协议,它保证了网络节点(包括网络设备和主机)在网络层能够按照标准协议互相通信。IPv4 地址唯一标识了网络节点和网络的连接关系。在我们日常使用的计算机的主机协议栈中,IPv4 协议必不可少,它能够接收网络中传送给本机的分组,同时也能根据上层协议的要求将报文封装为 IPv4 分组发送出去。本实验通过设计实现主机协议栈中的 IPv4 协议,让学生深入了解网络层协议的基本原理,学习IPv4协议基本的分组接收和发送流程。另外,通过本实验,可以初步接触互联网协议栈的结构和计算机网络实验系统,为后面 进行更为深入复杂的实验奠定良好的基础。
  2. IPv4 分组转发实验 通过前面的实验,我们已经深入了解了IPv4 协议的分组接收和发送处理流程。本实验需要将实验模块的角色定位从通信两端的主机转移到作为中间节点的路由器上,在IPv4分组收发处理的基础上,实现分组的路由转发功能。网络层协议最为关注的是如何将 IPv4 分组从源主机通过网络送达目的主机,这个任务就是由路由器中的 IPv4 协议模块所承担。路由器根据自身所获得的路由信息,将收到的 IPv4 分组转发给正确的下一跳路由器。如此逐跳地对分组进行转发,直至该分组抵达目的主机。IPv4 分组转发是路由器最为重要的功能。本实验设计模拟实现路由器中的 IPv4 协议,可以在原有 IPv4 分组收发实验的基础上,增加 IPv4 分组的转发功能。对网络的观察视角由主机转移到路由器中,了解路由器是如何为分组选择路由,并逐跳地将分组发送到目的主机。本实验中也会初步接触路由表这一重要的数据结构,认识路由器是如何根据路由表对分组进行转发的。

    实验内容:

    概述本次实验的主要内容,包含的实验项等。
  3. IPv4分组收发实验
  1. 实现 IPv4 分组的基本接收处理功能对于接收到的 IPv4 分组,检查目的地址是否为本地地址,并检查 IPv4 分组头部中其它字段的合法性。提交正确的分组给上层协议继续处理,丢弃错误的分组并说明错误类型。
  2. 实现 IPv4 分组的封装发送 根据上层协议所提供的参数,封装 IPv4 分组,调用系统提供的发送接口函数将分组发 送出去。
  1. IPv4分组转发实验
  1. 设计路由表数据结构。设计路由表所采用的数据结构要求能够根据目的 IPv4 地址来确定分组处理行为(转发情况下需获得下一跳的 IPv4 地址)。路由表的数据结构和查找算法会极大的影响路由器的转发性能,有兴趣的同学可以深入思考和探索。
  2. IPv4 分组的接收和发送。对前面实验(IP 实验)中所完成的代码进行修改,在路由器协议栈的 IPv4 模块中能够 正确完成分组的接收和发送处理。具体要求不做改变,参见“IP 实验”。
  3. IPv4 分组的转发。对于需要转发的分组进行处理,获得下一跳的 IP 地址,然后调用发送接口函数做进一步处理。

    实验过程:

    以文字描述、实验结果截图等形式阐述实验过程,必要时可附相应的代码截图或以附件形式提交。

    IPv4分组收发实验

    发送函数:在接口函数stud_is_Upsend()中,需要完成如下处理:

    ① 根据所传参数(如数据大小),来确定分配的存储空间的大小并申请分组的存储空间。

    ② 按照 IPv4 协议标准填写 IPv4 分组头部各字段 ,标识符(Identification)字段可以使用一个随机数来填写。(注意:部分字段内容需要转换成网络字节序)

    ③ 完成 IPv4 分组的封装后,调用 ip_SendtoLower( )接口函数完成后续的发送处理工作,最终将分组发送到网络中。

    发送函数流程图如下:

接收函数:在接收函数stud_ip_recv()中,需要完成如下处理

① 检查接收到的 IPv4 分组头部的字段,包括版本号(Version)、头部长度(IP Head length)、生存时间(Time to live)以及头校验和(Header checksum)字段。对于出错的分组调用 ip_DiscardPkt( )丢弃,并说明错误类型。

② 检查 IPv4 分组是否应该由本机接收。如果分组的目的地址是本机地址或广播地址,则说明此分组是发送给本机的;否则调用ip_DiscardPkt( )丢弃,并说明错误类型。

② 如果IPV4分组应该由本机接收,则提取得到上层协议类型,调用 ip_SendtoUp( )接口函数,交给系统进行后续接收处理。

流程图如下:

接收函数错误检测原理:

① 版本号检测原理:由于本实验使用的是IPV4,因此需要检测版本号是否等于4。

② 头部长度检测原理:提取头部长度,如果小于5则可以判断头部长度错误。

③ TTL检测原理:TTL应该是一个正数,如果提取出的TTL<=0,可以判断TTL错误

④ 头部校验和检测原理:将IP报文头部信息使用十六进制表示,并两两组合相加,对于相加的结果如果大于0xffff,则将大于0xffff的部分和小于0xffff的部分相加作为最后结果,如果最后的结果等于0xffff,则正确,否则错误。

各种错误信息对应的实验中出现的真实数据可见实验结果部分。

IPv4分组转发实验

路由表初始化、路由增加、路由转发三个函数的实现流程图

路由表初始化函数:

路由增加函数

从stud_route_msg结构中取得dest, masklen, nexthop,转为网络字节序之后经过处理,构建结构体route,并添加到vector中。

路由转发函数:

所新建数据结构的说明

结构体中共有四项,第一项是掩码值,是根据掩码长度计算出的,这也是唯一一个在创建的时候需要计算的项;第二项是目的地址,创建的时候直接从stud_route_msg获取并转换即可;第三项是掩码长度,用于计算掩码;第四项是下一跳地址,在创建路由表项的时候直接获取转换即可。详细数据结构代码如下:

	struct Route//路由表表项
2. {
3. unsigned int mask;//掩码
4. unsigned int dest;//目的地址
5. unsigned int masklen;//掩码长度
6. unsigned int nexthop;//下一跳地址
7.
8. Route(unsigned int dest,unsigned int masklen,unsigned int nexthop)
9. {
10. this->dest=ntohl(dest);
11. this->masklen=ntohl(masklen);
12. this->nexthop=ntohl(nexthop);
13. this->mask=0;
14. if(this->masklen)
15. {
16. this->mask = (int)0x80000000 >> (this->masklen - 1);
17. }
18. }
19. };

请分析在存在大量分组的情况下如何提高转发效率,如果代码中有相关功能实现,请给出具体原理说明。

1.存储结构由线性结构转换为树形结构,检索过程中利用树形结构性质,提高匹配效率。

2.由于转发分组过程中对于每个分组的操作都类似,因此可以使用硬件来创建并行检查与转发过程。

实验结果:

采用演示截图、文字说明等方式,给出本次实验的实验结果。

IPv4分组收发实验

实验结果展示:

错误信息展示:

版本号错误:

版本号应该是4,但是发送的信息中版本号是3

头部长度错误:

最小的头部长度是20字节,但是发送的信息只有12字节,报错

TTL错误:

TTL==0,错误

头部校验和错误:

头部校验和应该是0x4AFC,但是发送的信息中是0x03E8

IPv4分组转发实验

实验结果展示:

问题讨论:

对实验过程中的思考问题进行讨论或回答。

在IP分组转发实验中,如果存在大量的分组的情况下,如何提高转发效率:

这一点在实验过程部分就简单讨论过,在此展开讨论。

1.首先最直接的一点就是改进存储的结构,在本实验中使用的是线性结构,因此查询的时间复杂度就是O(n)。如果想把查询时间优化到O(logn),可以根据IP目的地址进行有序存储,在查询的时候使用二分查找,这样查询时间就可以优化到O(logn),如果希望查询时间复杂度为O(1),可以将路由表设置为一个哈希表,使用空间换取时间。

2.如果不考虑从查询时间入手,那么由于存在大量分组,因此可以并行转发,所有的检测、匹配等过程都可以并行处理,这可以从硬件层面入手处理。

心得体会:

结合实验过程和结果给出实验的体会和收获。

经过本实验,对于IPV4的报文结构与检测、转发等功能有了更深入的认识,也对于路由表的建立、维护和工作过程有了较为深入的认识。

哈工大 计算机网络 实验三 IPv4 分组收发实验&IPv4 分组转发实验的更多相关文章

  1. 20162330 实验三 《敏捷开发与XP实践》 实验报告

    2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623班 ...

  2. 2017-2018-2 20165237 实验三《 敏捷开发与XP实践》实验报告

    2017-2018-2 20165237 实验三< 敏捷开发与XP实践>实验报告 实验报告表头: 知识点: 1.XP团队使用现场客户.特殊计划方法和持续测试来提供快速的反馈和全面的交流: ...

  3. 2017-2018-2 20165206 实验三 《敏捷开发与XP实践》实验报告

    2017-2018-2 20165206 实验三 <敏捷开发与XP实践>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教师: ...

  4. 2017-2018-2 20165312 实验三《敏捷开发与XP实践》实验报告

    2017-2018-2 20165312 实验三<敏捷开发与XP实践>实验报告 一.实验内容 1.XP基础 极限编程(Extreme Programming,XP)是一种全新而快捷的软件开 ...

  5. 2017-2018-2 20165316 实验三《敏捷开发与XP实践》实验报告

    2017-2018-2 20165316 实验三<敏捷开发与XP实践>实验报告 实验目的 安装 alibaba 插件,解决代码中的规范问题.再研究一下Code菜单,找出一项让自己感觉最好用 ...

  6. 2017-2018-2 20165306 实验三《敏捷开发与XP实践》实验报告

    实验三<敏捷开发与XP实践>实验报告 实验报告封面 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一) 敏捷开发与XP实践-1 实验要求: 参考 代码规范 安装alibaba 插 ...

  7. 2017-2018-2 20165327 实验三《敏捷开发与XP实践》实验报告

    2017-2018-2 20165327 实验三<敏捷开发与XP实践>实验报告 实验三 <敏捷开发与XP实践> 一.实验报告封面 课程:Java程序设计 班级:1653 姓名: ...

  8. 2017-2018-2 20165228 实验三《敏捷开发与XP实践》实验报告

    2017-2018-2 20165228 实验三<敏捷开发与XP实践>实验报告 相关知识点 (一)敏捷开发与XP 通过 XP准则来表达: 沟通 :XP认为项目成员之间的沟通是项目成功的关键 ...

  9. 2017-2018-2 20165315 实验三《敏捷开发与XP实践》实验报告

    2017-2018-2 20165315 实验三<敏捷开发与XP实践>实验报告 一.编码标准 编写代码一个重要的认识是"程序大多时候是给人看的",编程标准使代码更容易阅 ...

  10. 20155205 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20155205 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 (一)使用Code菜单 在IDEA中使用工具(Code->Reformate Code ...

随机推荐

  1. IoC容器-Bean管理XML方式(p名称空间注入)

    5,p名称空间注入(简化xml配置) (1)使用p名称空间注入,可以简化基于xml配置方式 (了解实际用不多) 第一步 添加 p 名称空间在配置文件中   第二步 进行属性注入,在bean标签里面进行 ...

  2. 003Linux查看文件内容的5个命令姿势

    01 开篇 Linux 中查看文件内容常用的有如下 5 个命令: cat: more: less: tail: head. 02依次看看这些命令的使用姿势 cat 一次性将所有内容输出到屏幕上,方便查 ...

  3. linux解析映射文件与自动加载脚本

    目录 一 :解析映射文件 1.解析文件的由来之主机名: 2.解析映射文件(DNS) 二:磁盘挂载文件 三:开机自动加载脚本 一 :解析映射文件 1.解析文件的由来之主机名: 无论是在局域网还是在INT ...

  4. Redis 源码简洁剖析 03 - Dict Hash 基础

    Redis Hash 源码 Redis Hash 数据结构 Redis rehash 原理 为什么要 rehash? Redis dict 数据结构 Redis rehash 过程 什么时候触发 re ...

  5. 微信小程序--给数组的每个对象添加动画(数据驱动)

    思路:用数据驱动事件,用数组的方式去对循环数组的每个对象进行操作 js代码: data:{ selectCategory: [{ name: '生产模式', content: [{ txt: '原厂' ...

  6. CF1278E Tests for problem D

    不难发现为了逐步确定每个点于其相邻点的相交情况,那么我们只可能有两种逐步构造的方式:从根开始往下构造,以及从子树往根上构造.经过很久的尝试,我发现从根往下构造是一件很困难的事情,于是我们可以反过来考虑 ...

  7. JAVA多线程学习十六 - 同步集合类的应用

    1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...

  8. java代码注意点总结(持续更新)

    1. if(username.equals("zxx")){} 这样写的话,如果username是null, 则会报NullPointerException,所以先要判断usern ...

  9. JAVA初学--Servlet详解

    一.什么是servlet? 处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西.理解这个的前提是了解一些http协议的东西,并且知道 ...

  10. 【发点感慨】我的cnblogs的文章被爬到了别的网站,阅读量比在cnblogs上还要高

    近期我写了挺多VictoriaMetrics的文章,在搜索相关文章的时候发现,我的文章被别的网站爬去了: 写写技术文章就是无偿分享给别人看的,越多人看到越多人受益,这一点没毛病. 但是: 爬了别人的文 ...