哈工大 计算机网络 实验三 IPv4 分组收发实验&IPv4 分组转发实验
计算机网络实验代码与文件可见github:计算机网络实验整理
实验名称 IPv4 分组收发实验&IPv4 分组转发实验
实验目的:
(注:实验报告模板中的各项内容仅供参考,可依照实际实验情况进行修改。)
本次实验的主要目的。
- IPv4 分组收发实验 IPv4 协议是互联网的核心协议,它保证了网络节点(包括网络设备和主机)在网络层能够按照标准协议互相通信。IPv4 地址唯一标识了网络节点和网络的连接关系。在我们日常使用的计算机的主机协议栈中,IPv4 协议必不可少,它能够接收网络中传送给本机的分组,同时也能根据上层协议的要求将报文封装为 IPv4 分组发送出去。本实验通过设计实现主机协议栈中的 IPv4 协议,让学生深入了解网络层协议的基本原理,学习IPv4协议基本的分组接收和发送流程。另外,通过本实验,可以初步接触互联网协议栈的结构和计算机网络实验系统,为后面 进行更为深入复杂的实验奠定良好的基础。
- IPv4 分组转发实验 通过前面的实验,我们已经深入了解了IPv4 协议的分组接收和发送处理流程。本实验需要将实验模块的角色定位从通信两端的主机转移到作为中间节点的路由器上,在IPv4分组收发处理的基础上,实现分组的路由转发功能。网络层协议最为关注的是如何将 IPv4 分组从源主机通过网络送达目的主机,这个任务就是由路由器中的 IPv4 协议模块所承担。路由器根据自身所获得的路由信息,将收到的 IPv4 分组转发给正确的下一跳路由器。如此逐跳地对分组进行转发,直至该分组抵达目的主机。IPv4 分组转发是路由器最为重要的功能。本实验设计模拟实现路由器中的 IPv4 协议,可以在原有 IPv4 分组收发实验的基础上,增加 IPv4 分组的转发功能。对网络的观察视角由主机转移到路由器中,了解路由器是如何为分组选择路由,并逐跳地将分组发送到目的主机。本实验中也会初步接触路由表这一重要的数据结构,认识路由器是如何根据路由表对分组进行转发的。
实验内容:
概述本次实验的主要内容,包含的实验项等。 - IPv4分组收发实验
- 实现 IPv4 分组的基本接收处理功能对于接收到的 IPv4 分组,检查目的地址是否为本地地址,并检查 IPv4 分组头部中其它字段的合法性。提交正确的分组给上层协议继续处理,丢弃错误的分组并说明错误类型。
- 实现 IPv4 分组的封装发送 根据上层协议所提供的参数,封装 IPv4 分组,调用系统提供的发送接口函数将分组发 送出去。
- IPv4分组转发实验
- 设计路由表数据结构。设计路由表所采用的数据结构要求能够根据目的 IPv4 地址来确定分组处理行为(转发情况下需获得下一跳的 IPv4 地址)。路由表的数据结构和查找算法会极大的影响路由器的转发性能,有兴趣的同学可以深入思考和探索。
- IPv4 分组的接收和发送。对前面实验(IP 实验)中所完成的代码进行修改,在路由器协议栈的 IPv4 模块中能够 正确完成分组的接收和发送处理。具体要求不做改变,参见“IP 实验”。
- 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 分组转发实验的更多相关文章
- 20162330 实验三 《敏捷开发与XP实践》 实验报告
2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623班 ...
- 2017-2018-2 20165237 实验三《 敏捷开发与XP实践》实验报告
2017-2018-2 20165237 实验三< 敏捷开发与XP实践>实验报告 实验报告表头: 知识点: 1.XP团队使用现场客户.特殊计划方法和持续测试来提供快速的反馈和全面的交流: ...
- 2017-2018-2 20165206 实验三 《敏捷开发与XP实践》实验报告
2017-2018-2 20165206 实验三 <敏捷开发与XP实践>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教师: ...
- 2017-2018-2 20165312 实验三《敏捷开发与XP实践》实验报告
2017-2018-2 20165312 实验三<敏捷开发与XP实践>实验报告 一.实验内容 1.XP基础 极限编程(Extreme Programming,XP)是一种全新而快捷的软件开 ...
- 2017-2018-2 20165316 实验三《敏捷开发与XP实践》实验报告
2017-2018-2 20165316 实验三<敏捷开发与XP实践>实验报告 实验目的 安装 alibaba 插件,解决代码中的规范问题.再研究一下Code菜单,找出一项让自己感觉最好用 ...
- 2017-2018-2 20165306 实验三《敏捷开发与XP实践》实验报告
实验三<敏捷开发与XP实践>实验报告 实验报告封面 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一) 敏捷开发与XP实践-1 实验要求: 参考 代码规范 安装alibaba 插 ...
- 2017-2018-2 20165327 实验三《敏捷开发与XP实践》实验报告
2017-2018-2 20165327 实验三<敏捷开发与XP实践>实验报告 实验三 <敏捷开发与XP实践> 一.实验报告封面 课程:Java程序设计 班级:1653 姓名: ...
- 2017-2018-2 20165228 实验三《敏捷开发与XP实践》实验报告
2017-2018-2 20165228 实验三<敏捷开发与XP实践>实验报告 相关知识点 (一)敏捷开发与XP 通过 XP准则来表达: 沟通 :XP认为项目成员之间的沟通是项目成功的关键 ...
- 2017-2018-2 20165315 实验三《敏捷开发与XP实践》实验报告
2017-2018-2 20165315 实验三<敏捷开发与XP实践>实验报告 一.编码标准 编写代码一个重要的认识是"程序大多时候是给人看的",编程标准使代码更容易阅 ...
- 20155205 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
20155205 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 (一)使用Code菜单 在IDEA中使用工具(Code->Reformate Code ...
随机推荐
- 如何使用c#编写单片机程序
因为个人喜爱想研究单片机,但是不太会c,然后再找资料研究有没有其他的方法发现国外的c# nanoframework 框架可以编写单片机程序,本文我将会用自己踩过的坑来总结一些c#编写单片机的一些经 ...
- 深入理解F1-score
本博客的截图均来自zeya的post:Essential Things You Need to Know About F1-Score | by Zeya | Towards Data Science ...
- Jvm和CPU保证特定情况下不乱序
简介 CPU为了提高指令执行效率,会在一条指令执行过程中(比去内存读数据(慢100倍)),去同时执行另一条指令,前提是,两条指令没有依赖关系. CPU保证不乱序 MESI--CPU缓存一致性协议(In ...
- ansible学习(二)- 清单配置详解
出处:http://www.zsythink.net/archives/2509 上一篇文章介绍了ansible的基本概念,以及相关的基础配置,我们已经知道,如果想要管理受管主机,则需要将受管主机添加 ...
- RPC原理及RPC实例分析(转)
出处:https://my.oschina.net/hosee/blog/711632 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服 ...
- Shell中的变量替换
${str-newStr} 仅当str为null的时候替换 ${str:-newStr} 当str为null或者str为空字符串的时候替换 综上,-号,当str没有内容,则替换, :号只是增加了空字符 ...
- redis lua脚本学习
语法格式(常见) a = 5 -- 全局变量 local b = 5 -- 局部变量 Eval的使用 EVAL script numkeys key [key ...] arg [arg ...] 首 ...
- Java线程--CountDownLatch使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867656.html Java线程--CountDownLatch使用, 代码里头有详细注释 ...
- Java-基于JDK的动态代理
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11686615.html 简单的记录一下Java中自带动态代理的用法. 准备材料: 1.一个接口 ...
- tabbar选中按钮的标题颜色和字体
@implementation XMGTabBarController /* 问题: 1.选中按钮的图片被渲染 -> iOS7之后默认tabBar上按钮图片都会被渲染 1.修改图片 2.通过代码 ...