哈工大 计算机网络 实验三 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 ...
随机推荐
- django学习总结1
## 内容回顾 #### 1.所有的命令 ##### 下载安装 pip install django==1.11.20 - i 源 ##### 创建项目 django-admin startp ...
- 如何在 VS Code 中为 Java 类生成序列化版本号
前言 IDEA 提供自动生成序列化版本号的功能,其实 VS Code 也可以,只是默认关闭了这个功能,下面就来看看如何开启这个功能吧. 配置过程 首先需要保证 VS Code 上安装了提供 Java ...
- X-former:不止一面,你想要的Transformer这里都有
原创作者 | FLPPED 参考论文: A Survey of Transformers 论文地址: https://arxiv.org/abs/2106.04554 研究背景: Transforme ...
- Visual Studio 中快速创建方法 Generate a method in Visual Studio
2020-04-04 https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-method?view=vs-2019 ...
- SP5971 LCMSUM - LCM Sum
一个基于观察不依赖于反演的做法. 首先 \(\rm lcm\) 是不好算的,转化为计算 \(\rm gcd\) 的问题,求: \[\sum\limits_{i = 1} ^ n \frac{in}{\ ...
- Swift可选类型
可选类型 可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不 ...
- Java之static静态关键字详解|final关键字详解
前言 在Java语言中,static表示"静态"的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法 ...
- SpringBoot使用IDEA设置的外部Tomcat启动
前言 使用springboot内嵌的tomcat启动是没问题,但是工程是要放到服务器上的tomcat的,所以springboot内嵌的能够启动,但不代表服务器的tomcat能启动起来,我就遇到了这个问 ...
- python folium 库学习
一.简介 folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaflet的相关功能,基于内建的osm ...
- 从上下文中获取所有的原生controller
1 /** 2 * 获取项目所有被注解修饰的url 3 * @param run 4 */ 5 public void getAllUrl(ConfigurableApplicationContext ...