计算机网络实验代码与文件可见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. xargs、管道、exec区别

    作者:ilexwg链接:https://www.zhihu.com/question/27452459/answer/170834758来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  2. 云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜?

    云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜? Kubernetes 可以为做些什么? 在学习一种新技能之前,囧囧建议不要上去先看各种牛叉的实现,我们需要先搞清楚这个技能是什么?学习了之后能为我 ...

  3. Android系统编程入门系列之硬件交互——通信硬件Bluetooth

    通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持.因此针对这个弊端,可以考虑 ...

  4. uni微信小程序优化,打包后的import vue路径是可删除的

    这次的优化我公司项目主包只减小了32kb,但是减小的不仅仅是主包,所有分包均在没有改动任何业务代码的情况下完成了压缩空间的优化. 主包分包压缩空间的优化都要视项目而定,32kb只是我公司的小程序项目. ...

  5. 理解https中的安全及其实现原理

    Google的一份网络上的 HTTPS 加密透明报告(数据截至2022年1月)中指出HTTPS 连接的普及率在过去几年激增,互联网上排名前 100 位的非 Google 网站HTTPS 使用情况为:9 ...

  6. keystore文件

    [-] keystore操作 运行时签名文件路径debug 生成签名文件打包时使用 获取MD5和SH1 修改keystore文件密码 修改keystore文件别名 修改keystore文件别名的密码 ...

  7. 对JSP中的Session 简单理解

    我的理解: 简单来说,要使用服务器端的session对象,就是要有其对应的key,即sessionid,它只认识sessionid. 下面我说的cookie,url重写或者隐藏表单,都是为了将其对应的 ...

  8. lua语言:时间

    转载请注明来源:https://www.cnblogs.com/hookjc/ 时间库函数 1.用数值表示时间值 用数字值来表示时间值,实际上时间值的本质就是一个数字值.例如:d = 11312864 ...

  9. linux sftp

    转载请注明来源:https://www.cnblogs.com/hookjc/ sftp用法 1. 用sftp如何登录服务器 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输, ...

  10. Linux下Wordpress忘记密码后的解决方法

    进入Wordpress的数据库,找到wp_users表,使用MD5('你的密码')函数添加密码 示例: 修改admin的密码为123456 UPDATE wp_users SET user_pass= ...