计算机网络篇之IPV4数据报格式

2023-09-18 09:43:16

计算机网络篇之IPV4数据报格式

struct iphdr {
    uint8_t version : 4;		//4位版本字段表示Internet标头的格式,ipv4值是4
    uint8_t ihl : 4;			//4位因特网报头长度,ip报头中32位字的数量
    uint8_t tos;				//服务类型字段,该字段传达IP数据报的服务质量,源于第一个IP规范,在以后的规范中,它被划分为较小的字段,为了简单起见,我们按照原始规范中的定义该字段
    uint16_t len;				//总长度字段,len传达整个ip数据报的长度
    uint16_t id;				//数据报索引,用于重新组装分段的IP数据报,字段的值是一个计数器,由发送方递增,接收方对接受的片段进行排序
    uint16_t flags : 3;			//标志字段,定义数据报的各种控制标志,比如指定是否允许对数据报进行分段,是最后一个分段还是有更多的分段传入
    uint16_t frag_offset : 13;	//片段偏移字段,指示片段在数据报中的位置,比如第一个数据报将该索引设置为0
    uint8_t ttl;				//生存时间,通常由原始发送器设置为64,每个接收器将该计数器递减一,当它达到零时,数据报将被丢弃,并且可能会回复ICMP消息以指示错误
    uint8_t proto;				//上层协议类型,比如UDP是16,TCP是6
    uint16_t csum;				//标头校验用于验证ip标头的完整性
    uint32_t saddr;				//源地址,32位的ipv4地址
    uint32_t daddr;				//目的地址,32的ipv4地址
} __attribute__((packed));

csum校验和字段用于检查IP数据报的完整性,原始IP
规范的定义: 校验和字段是报头中所有16位字的补码和的16位1的补码,为了计算校验和,校验和字段的值为零

实际代码

uint16_t checksum(void *addr, int count)
{
    /* Compute Internet Checksum for "count" bytes
     *         beginning at location "addr".
     * Taken from https://tools.ietf.org/html/rfc1071
     */

    register uint32_t sum = 0;
    uint16_t * ptr = addr;

    while( count > 1 )  {
        // 每两位一组,计算和
        sum += * ptr++;
        count -= 2;
    }

    // 如果有剩余字段,累加
    if( count > 0 )
        sum += * (uint8_t *) ptr;

    /*  Fold 32-bit sum to 16 bits */
    // 将其转换为补码, 进位比特添加到前16比特
    while (sum>>16)
        sum = (sum & 0xffff) + (sum >> 16);


    return ~sum;
}

以IP标头45 00 00 54 41 e0 40 00 40 01 00 00 0a 00 04 0a 00 00 05为例:

将这些字段加在一起得到二者的补码和01 1b 3e

然后,为了将其转换为补码,将进位位添加到前16位:1b 3e+01=1b 3f

最后, 取和的1的补码, 得到校验和值e4c0

IP标头变为45 00 00 54 41 e0 40 00 40 01 (e4 c0) 0a 00 04 0a 00 00 05

校验和可以通过再次应用算法进行验证, 如果结果为0, 则数据可能无误

简单胜于复杂, 就聊这么多

更多推荐

SpringMVC

目录SpringMVC体系结构SpringMVC配置注解@Controller@RequestMapping@RequestParam@RequestBody@SessionAttributes@DateTimeFormat@ResponseBodySpringMVC体系结构(1)首先浏览器发送请求——>Dispatc

Linux的调试工具 - gdb(超详细)

Linux的调试工具-gdb1.背景2.开始使用指令的使用都用下面这个C语言简单小代码来进行演示:1.list或l行号:显示文件源代码,接着上次的位置往下列,每次列10行。2.list或l函数名:列出某个函数的源代码。3.r或run:运行程序。4.break或b行号:在某一行设置断点5.n或next:单条执行(类似vs

RK3568驱动指南|第五篇 中断-第42章 软中断实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和li

快速排序模拟实现

快速排序,时间复杂度为O(NlogN),属于排序中相对快的那一列,以下是快排的模拟实现:法一:左右指针交换法voidswap(int*x,int*y){inttmp=*x;*x=*y;*y=tmp;}//交换函数intgetmid(int*a,intleft,intright){intmid=(left+right)/

【错误记录】IntelliJ IDEA 导出可执行 jar 包执行报错 ( java.lang.ClassNotFoundException | 打包时没有选择依赖库 )

文章目录一、报错信息二、解决方案一三、解决方案二一、报错信息参考【IntelliJIDEA】导出可执行JAR包博客,从IntelliJIDEA中导出可执行JAR包;执行菜单栏/Build/BuildArtifacts选项,编译Module中配置的artifacts项目;编译完成artifacts后,进入到工程目录\ou

汽配制造问题以及MES管理系统解决方案

在汽车工业中,零部件制造与整车制造有着显著的不同。这些差异导致了零部件制造的复杂性和高要求,使其成为一个高度综合的最终产品。本文将详细介绍这些差异以及针对这些差异的解决方案。一、行业特点决定需求汽车配件制造与整车制造存在较大不同。在整车制造过程中,装配是最复杂的环节,而在零部件制造过程中,装配所占的比重较小,机加等前端

XSS跨站脚本攻击

XSS全称(CrossSiteScripting)跨站脚本攻击,XSS属于客户端攻击,受害者最终是用户,在网页中嵌入客户端恶意脚本代码,最常用javascript语言。(注意:叠成样式表CSS已经被占用所以叫XSS)原因:输入没过滤,输出没编码。危害:劫持用户cookie,钓鱼,挂马分类:1、反射性XSS(中危,一次性

肖sir__项目环境之全流程__005

一、测试流程(h模型)1、需求文档(产品)需求文档(软件需求规格说明书srs)(1)如何分析需求a、显示需求(主流程、功能,业务)b、隐性需求(比如:红包记录,扣款金额=发送金额)c、特殊需求(计算:保费计算,还款计算)d、关联需求(满减活动:活动订单,活动增加,)(2)需求特殊a、完整性:功能的实现和设计信息齐全b、

API接口:概述、设计、应用与未来趋势

一、API接口概述API,全称应用程序接口,是一种软件程序之间的通信方法。API接口在互联网开发中扮演着重要角色,允许不同的应用程序相互交流和共享数据。API定义了一套标准的通信协议,使得开发人员能够使用特定的函数、方法或协议来交换信息。二、API接口设计RESTfulAPIRESTfulAPI是当前最流行的一种API

【SpringMVC】自定义注解与AOP结合使用

目录一、SpringMVC之自定义注解1.1Java注解简介1.2为什么要用注解1.3注解的分类⭐1.3.1JDK基本注解1.3.2JDK元注解1.3.3自定义注解1.4自定义注解三种使用案例1.4.1案例一(获取类与方法上的注解值)1.4.2案例二(获取类属性上的注解属性值)1.4.3案例三(获取参数修饰注解对应的属

吉时利KEYSIGHT6517B静电计6517A高阻计

Keithley6517B静电计/高阻计是灵敏测量的全球研究实验室标准。吉时利静电计拥有60多年的低电平测量专业知识,可提供低至10aA(10×10-18A)的电流水平和低至1fC的电荷水平的可靠测量,以及高达1018Ω的最高电阻测量。6517B还能够测量最大电压范围(高达200V),输入阻抗超过200TO。特征测量高

热文推荐