计算机网络实验目录
- eth协议实现
- ARP协议实现
- RIP路由配置和协议分析
- IP协议实现
- ICMP协议实现
- UDP协议实现
- NAT组网
- 邮件客户端的设计与实现
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
实验指导书网址
HITSZ 2022春计算机网络实验完成记录
ICMP
IP协议本身并没有为终端设备提供直接的方法来发现发往目的地址失败的IP数据包,也不能进行问题诊断。为解决这些不足,将Internet控制报文协议(Internet Control Message Protocol,ICMP)与IP结合使用,以便提供与IP协议层配置和IP数据包处理相关的诊断和控制信息。ICMP是为了主机或者路由器报告差错情况或者提供有关异常情况的报告。ICMP封装在IP数据报中,作为其中的数据部分。
ICMP的头部长度为8字节,后面是ICMP报文的数据部分。ICMP报文实际上还是通过IP层传输,ICMP头部和ICMP数据部分组成完整的报文,然后再添加IP协议头部报文,形成完整的IP报文,然后再通过数据链路层生成以太网帧进行传输
ICMP工作流程
- 向目标发送IP数据包的时候出错,返回差错报告报文
- 向目标发送询问报文,收到回答报文
ICMP报文结构
头部结构
ICMP头部结构的前4个字节是统一的格式,分为类型,代码,校验和
后面4个字节取决于ICMP报文的类型,最后是数据字段
- 类型(Type):用于说明ICMP报文的作用及格式;
- 代码(Code):于详细说明某种ICMP报文的类型;
- 16位校验和(Checksum):涵盖了整个报文,其校验和的计算方法和IP协议校验和算法是一样的;
- 标识符(Identifier):如果是ICMP请求报文,该字段在Linux/macOS中用的是进程ID。如果是ICMP应答报文,则只需拷贝来自ICMP请求报文的标识符字段;
- 序列号(Sequence number):如果是ICMP请求报文,该字段在Linux/macOS中是从0递增的,每个进程独立。如果是ICMP应答报文,则只需拷贝来自ICMP请求报文的序列号字段
- 数据(Optional data):如果是ICMP请求报文,该字段包括时间戳以及一串填充数据。如果是ICMP应答报文,则只需拷贝来自ICMP请求报文的数据字段。
实验部分
遇到的一些问题
- 遇到一个segFault,后面发现是
memcpy()
的问题,dst_ptr写成&txbuf了(本来应该是txbuf.data)
代码
#include "net.h"
#include "icmp.h"