HASH256开源代码计算错误问题

计算量超500KB报错

OTA升级中可能会涉及到CRC、hash校验等算法,小编从网上抄到了HASH256的源码,拿来使用的时候却发现了一个问题,当源文件约大于500KB的时候会发现其计算出的hash值出现错误。
经过实际测试得知,当源文件大于约500kb时,用开源代码计算的hash值存在概率不正确的情况,而且发现其源文件大小/8byte为整数时计算出的结果是正确的(如下图计算出来的就是错误的)。
本着快速解决项目问题的想法,想到了将源文件大小补齐/8byte为整数的操作。(实际是小编暂时没能力找到问题所在哈哈哈)
在这里插入图片描述

若大家有更好的解决办法请指出~

代码片(.C)

/** @Description: * @Author: shimianxiang* @Date: 2023-10-11 08:27:06* @LastEditTime: 2023-10-25 11:28:06* @LastEditors: shimianxiang*/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "mcuhash2.h"
#include<time.h>
#include <math.h>uint32_t    TW[16];
uint8_t     bitbuff[512/8];
uint32_t    bitbuff_num=0;uint32_t    fill_data[64]={ 0x80000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000 };uint32_t    data[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
/*-----------------------------------------------------------------------SHA-256-------------------------------------------------------*/
uint32_t Ch(uint32_t x, uint32_t y, uint32_t z)
{return (x & y) ^ (~x & z);
}
uint32_t cycle_rshift(uint32_t x,uint32_t n)
{return 	((x & (((uint32_t)1 << n) - 1)) << (32 - n))|(x >> n);
}
uint32_t Sum0(uint32_t x)
{return cycle_rshift(x, 2) ^ cycle_rshift(x, 13) ^ cycle_rshift(x, 22);
}
uint32_t Sum1(uint32_t x)
{return cycle_rshift(x, 6) ^ cycle_rshift(x, 11) ^ cycle_rshift(x, 25);
}
uint32_t Sigma0(uint32_t x)
{return cycle_rshift(x, 7) ^ cycle_rshift(x, 18) ^ (x>>3);
}
uint32_t Sigma1(uint32_t x)
{return cycle_rshift(x, 17) ^ cycle_rshift(x, 19) ^ (x >> 10);
}
uint32_t Ma(uint32_t x, uint32_t y, uint32_t z)
{return (x & y) ^ (x & z)^ (y & z);
}
void sha_init(struct sha256 *s)
{s->hash[0] = H0;s->hash[1] = H1;s->hash[2] = H2;s->hash[3] = H3;s->hash[4] = H4;s->hash[5] = H5;s->hash[6] = H6;s->hash[7] = H7;s->hash_length = 0;s->index  = 0;s->offset = 0;
}void sha_caculator(struct sha256* s)//先补齐 Wt,然后循环64次加密
{uint8_t i = 0;uint32_t m0, s0, s1,c1,t1;uint32_t temp[8];for(i=0;i<8;i++)temp[i]=s->hash[i];for (i = 0; i < 16; i++)Wt[i] = s->block[i];for (i = 16; i < 64; i++)Wt[i] = Sigma1(Wt[i-2])+ Wt[i-7]+Sigma0(Wt[i - 15])+ Wt[i - 16];for (i = 0; i < 64; i++){s0 = Sum0(temp[0]);s1 = Sum1(temp[4]);m0 = Ma(temp[0], temp[1], temp[2]);c1 = Ch(temp[4], temp[5], temp[6]);t1 = s1+c1+temp[7]+Wt[i] + Kt[i];temp[7] = temp[6];temp[6] = temp[5];temp[5] = temp[4];temp[4] = temp[3]+ t1;temp[3] = temp[2];temp[2] = temp[1];temp[1] = temp[0];temp[0] = t1+m0+s0;}for (i = 0; i < 8; i++)s->hash[i]+=temp[i];
}void sha_updata(struct sha256* s,unsigned char *str,uint64_t len)
{uint64_t i = 0;uint64_t count;s->hash_length += len;if (s->offset!=0)//说明没有4字节对齐{if (s->offset + len < 4){for (i = s->offset; i < s->offset+len; i++){s->block[s->index]  |= (((uint32_t)(*str)) << (8 * (3 - i)));str++;}s->offset += len;return;}else{len = len + s->offset - 4;for (i = s->offset; i < 4; i++){s->block[s->index]  |= (((uint32_t)(*str)) << (8 * (3 - i)));str++;}s->index++;if (s->index == 16){sha_caculator(s);//满足512bit 16Word加密一次s->index = 0;}}}count = (len >> 2);//计算这次加密有多少个Words->offset = len % 4;//对齐Word剩余的bytefor(i=0;i<count;i++){s->block[s->index] = (((uint32_t)(*str))		<< 24) |((*(str	+	1))		<< 16) |((*(str + 2))	<< 8) |(*(str + 3));s->index++;str += 4;if (s->index == 16){sha_caculator(s);//满足512bit 16Word加密一次s->index = 0;}}s->block[s->index] = 0;//对齐Word剩余的byte写在 s->index 位置上,供下一次update使用for (i = 0; i < s->offset; i++){s->block[s->index] |= (((uint32_t)(*str)) << (8 * (3 - i)));str++;}}void sha_final(struct sha256* s)
{uint8_t temp=s->hash_length % 64;//计算需要填充多少byteuint8_t fill[4] = { 0x80,0x0,0x0,0x0 };uint32_t i;if (temp == 56)//则需要填充一个512bit{//补齐前一次的512bitif (s->offset != 0){for (i = 0; i < 4-s->offset; i++)s->block[s->index]  |= (fill[i]<< (8 * (3 - i-s->offset)));s->index++;}else{s->block[s->index] = 0x80000000;s->index++;}for (i = s->index; i < 16; i++)s->block[i] = 0;sha_caculator(s);for(i=0;i<14;i++)s->block[i] = 0;s->block[14] = s->hash_length >> 29;s->block[15] = s->hash_length << 3 & 0xffffffff;sha_caculator(s);}else{if (s->offset != 0){for (i = 0; i < 4-s->offset; i++)s->block[s->index]  |= (fill[i] << (8 * ( 3 - i - s->offset)));s->index++;}else{s->block[s->index] = 0x80000000;s->index++;}for (i = s->index; i < 14; i++)s->block[i] = 0;s->block[14] = s->hash_length>> 29;s->block[15] = s->hash_length<<3 & 0xffffffff;sha_caculator(s);}
}
/*-----------------------------------------------------------------------sort-------------------------------------------------------*/
uint32_t FlashASH_256(uint8_t *outdata,uint8_t *data,uint32_t length)
{uint32_t bitnum         = (length+bitbuff_num) % 64;uint32_t hash_times     = (length+bitbuff_num)/64;uint32_t offset_num     = 0;uint32_t bitbuff_num_or = 0;while (hash_times){if(bitbuff_num == 0){memcpy(&outdata[0],&data[0]+64*offset_num+bitbuff_num_or,64);hash_times--;offset_num++;// for(int i=0;i<4;i++)// {//     printf("%x   %x   %x   %x   ",TW[i*4+0],TW[i*4+1],TW[i*4+2],TW[i*4+3]);// }// printf("\n-----------------\n");}else{bitbuff_num_or = 64-bitbuff_num;memcpy(&outdata[0],&bitbuff[0],bitbuff_num);memcpy(&outdata[0]+bitbuff_num,&data[0]+64*offset_num,bitbuff_num_or);// memcpy(&outdata[0]+1,&data[0]+64*offset_num,bitbuff_num_or);hash_times--;bitbuff_num = 0;// for(int i=0;i<4;i++)// {//     printf("%x   %x   %x   %x   ",TW[i*4+0],TW[i*4+1],TW[i*4+2],TW[i*4+3]);// }// printf("\n+----------------\n");}}if(bitnum != 0){memcpy(&bitbuff[0]+bitbuff_num,&data[0]+64*offset_num+bitbuff_num_or,bitnum);bitbuff_num = bitnum;// printf("\n get %d\n",bitnum);bitnum = 0;}else{bitbuff_num = 0;}return bitbuff_num;
}int main(int argc, char const *argv[])
{printf("start \n");#if 0for(int i=1;i<16;i++){TW[i]=0xffffffff+i;}uint8_t* inaddr_end=&fill_data[0];uint8_t* inaddr=&data[0];// memcpy(&TW[0],&Kt[0],65);FlashASH_256(&TW[0],&inaddr[0],120);FlashASH_256(&TW[0],&inaddr[120],1);FlashASH_256(&TW[0],&inaddr[121],4);FlashASH_256(&TW[0],&inaddr[125],35);uint32_t num=FlashASH_256(&TW[0],&inaddr[160],36);// FlashASH_256(&Kt[0]+129,63);FlashASH_256(&TW[0],&inaddr_end[0],(uint32_t)64-num);printf("last_num= %d\n",num);#elif 0FILE *fp = fopen("./tesths.c", "rb");if(fp == NULL){printf("can not open file\n");return -1;}fseek(fp, 0, SEEK_END);uint32_t size = ftell(fp);char encrypt[1024*1024];fseek(fp, 0, SEEK_SET);printf("\n size: %d \n",size);int len = fread(encrypt, sizeof(char), size, fp);fclose(fp);struct sha256 testsha;// uint8_t* inaddr=&data[0];sha_init(&testsha);sha_updata(&testsha, &encrypt[0], size);sha_final(&testsha);for (int i = 0; i < 8; i++)printf("%08x ", testsha.hash[i]);printf("\n");/* 验证通过 */#elif 1clock_t start,end;
FILE *fp2 = fopen("./dest_hash.bin", "w");
if(fp2 == NULL)
{printf("can not mkdir file\n");return -1;
}
fclose(fp2);
FILE *fp3 = fopen("./dest_hash.bin", "rb+");FILE *fp = fopen("./source.bin", "rb+");if(fp == NULL){printf("can not open file\n");return -1;}fseek(fp, 0, SEEK_END);uint32_t size = ftell(fp);char encrypt[1024*1024];uint8_t* size_u8 = &size;/*如果源文件大小除8byte除不尽*/uint8_t buding=size%8;if(buding != 0){buding = 8 - buding;}fseek(fp, 0, SEEK_SET);printf("size of bin: %d &add length=%d\n",size,size + 32);int len = fread(encrypt, sizeof(char), size, fp);size = buding + size;struct sha256 testsha;// uint8_t* inaddr=&data[0];sha_init(&testsha);start=clock();sha_updata(&testsha, &encrypt[0], size);// sha_updata(&testsha, &encrypt[size/2], size/2);// sleep(2);sha_final(&testsha);end=clock();float time=(float)(end-start);printf("time=%lf ms\n",time);fseek(fp3, 0, SEEK_END);fwrite(encrypt, sizeof(char), size, fp3);
/* 文件结尾hash值输出开关 */
#if 1
/* 大小端切换开关 */
#if 0// fseek(fp3, size + 4, SEEK_SET);printf("write hash num byte=%d\nHASH:\n",fwrite(testsha.hash, sizeof(char), 32, fp3));fclose(fp);fclose(fp3);
#elseuint8_t* hashfinal = &testsha.hash[0];// fseek(fp, size, SEEK_SET);int i,k;for(i=0;i<8;i++)for(k=0;k<4;k++)fwrite(&hashfinal[i*4+(3-k)], sizeof(char), 1, fp3);printf("write hash num byte=32\nHASH:\n");#endiffclose(fp3);
#else
fwrite(encrypt, sizeof(char), size, fp3);fclose(fp);fclose(fp3);
#endiffor (int i = 0; i < 8; i++)printf("%08x ", testsha.hash[i]);printf("\nhash_finish!\n");// system("pause");/* 验证通过 */#elif 1struct sha256 testsha;uint8_t* inaddr_end=&fill_data[0];uint8_t* inaddr=&data[0];// memcpy(&TW[0],&Kt[0],65);sha_init(&testsha);// FlashASH_256(&testsha.block[0],&inaddr[0],14);uint32_t num=FlashASH_256(&testsha.block[0],&inaddr[0],14);// FlashASH_256(&Kt[0]+129,63);sha_caculator(&testsha);for (int i = 0; i < 8; i++)printf("%08x ", testsha.hash[i]);printf("\n");// FlashASH_256(&TW[0],&inaddr_end[0],(uint32_t)64-num);// printf("last_num= %d\n",num);#endifreturn 0;
}

代码片(.H)

/** @Description: * @Author: shimianxiang* @Date: 2023-10-11 09:27:35* @LastEditTime: 2023-10-12 13:33:24* @LastEditors: shimianxiang*/#ifndef HASHASH256_H_
#define HASHASH256_H_#define H0  0x6a09e667
#define H1  0xbb67ae85
#define H2  0x3c6ef372
#define H3  0xa54ff53a
#define H4  0x510e527f
#define H5  0x9b05688c
#define H6  0x1f83d9ab
#define H7  0x5be0cd19
uint32_t Wt[64];
uint32_t Kt[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
struct sha256
{uint32_t block[16];	//加密的measageuint32_t hash[8];	//hash的结果uint64_t hash_length;//总共hash的byte数uint8_t  offset;		//一个update未对齐Word(4字节)的字节数uint8_t  index;		//当前已经写到block的位置
};
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】Python常用库-TensorFlow常用方法教程

TensorFlow 是一个广泛应用的开源深度学习框架&#xff0c;支持多种机器学习任务&#xff0c;如深度学习、神经网络、强化学习等。以下是 TensorFlow 的详细教程&#xff0c;涵盖基础使用方法和示例代码。 1. 安装与导入 安装 TensorFlow&#xff1a; pip install tensorflow…

Spring Boot教程之十一:获取Request 请求 和 Put请求

如何在 Spring Boot 中获取Request Body&#xff1f; Java 语言是所有编程语言中最流行的语言之一。使用 Java 编程语言有几个优点&#xff0c;无论是出于安全目的还是构建大型分发项目。使用 Java 的优点之一是 Java 试图借助类、继承、多态等概念将语言中的每个概念与现实世…

uniapp实现组件竖版菜单

社区图片页面 scroll-view scroll-view | uni-app官网 (dcloud.net.cn) 可滚动视图区域。用于区域滚动。 需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 <template><view class"pics"><scroll-view class"left"…

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;V…

前海湾地铁的腾通数码大厦背后的临时免费停车点探寻

临时免费停车点&#xff1a;前海湾地铁的腾通数码大厦背后的桂湾大街&#xff0c;目前看不仅整条桂湾大街停了​车&#xff0c;而且还有工地餐点。可能是这个区域还是半工地状态&#xff0c;故暂时还不会有​罚单的情况出现。 中建三局腾讯数码大厦项目部A栋 广东省深圳市南山…

遥感数据集:FTW全球农田边界和对应影像数据,约160万田块边界及7万多个样本

Fields of The World (FTW) 是一个面向农业田地边界实例分割的基准数据集&#xff0c;旨在推动机器学习模型的发展&#xff0c;满足全球农业监测对高精度、可扩展的田地边界数据的需求。该数据集由kerner-lab提供&#xff0c;于2024年8月28日发布&#xff0c;主要特征包括&…

USB Type-C一线通扩展屏:多场景应用,重塑高效办公与极致娱乐体验

在追求高效与便捷的时代&#xff0c;启明智显USB Type-C一线通扩展屏方案正以其独特的优势&#xff0c;成为众多职场人士、娱乐爱好者和游戏玩家的首选。这款扩展屏不仅具备卓越的性能和广泛的兼容性&#xff0c;更能在多个应用场景中发挥出其独特的价值。 USB2.0显卡&#xff…

项目二技巧一

目录 nginx实现根据域名来访问不同的ip端口 配置Maven私服 快照版和发布版的区别 快照版本&#xff08;Snapshot&#xff09; 发布版本&#xff08;Release&#xff09; 导入发布版的父工程 理清楚授权规则 一.首先浏览器发送/manager/**路径请求 第二步&#xff1a;构造…

详解SpringCloud集成Camunda7.19实现工作流审批(二)

本章将分享的是camunda流程设计器--Camunda Modeler的基本使用&#xff08;对应camunda版本是7.19&#xff09;&#xff0c;包括bpmn流程图画法&#xff0c;各种控件使用以及一些日常业务场景的流程图的实现 参考资料&#xff1a; Camunda BPMN 基础组件-CSDN博客 Camunda: Exe…

webpack(react)基本构建

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它的主要功能是将各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;视为模块&#xff0c;并将它们打包成一个或多个输出文件&#xff0c;以便…

html select下拉多选 修改yselect.js插件实现下拉多选,搜索,限制选中,默认回显等操作

需求&#xff1a;要在select标签实现下拉多选&#xff0c;搜索&#xff0c;限制选中&#xff0c;默认回显等操作&#xff0c;之前同事用的yselect.js&#xff0c;网上用的简直是寥寥无几&#xff0c;找了半天没找到限制选中的方法&#xff0c;看了源代码才发现根本没有&#xf…

c++哈希表(原理、实现、开放寻址法)适合新手

c系列哈希的原理及实现&#xff08;上&#xff09; 文章目录 c系列哈希的原理及实现&#xff08;上&#xff09;前言一、哈希的概念二、哈希冲突三、哈希冲突解决3.1、开放寻址法3.2、删除操作3.3、负载因子四、代码实现 总结 前言 红黑树平衡树和哈希有不同的用途。 红黑树、…

了解HTTPS以及CA在其中的作用

在这个信息爆炸的时代&#xff0c;每一次指尖轻触屏幕&#xff0c;都是一次数据的旅行。但您是否真正了解&#xff0c;这些数据在通往目的地的旅途中&#xff0c;是如何被保护的呢&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种安全的网…

Flink学习连载文章8--时间语义

Time的分类 (时间语义) EventTime:事件(数据)时间,是事件/数据真真正正发生时/产生时的时间 IngestionTime:摄入时间,是事件/数据到达流处理系统的时间 ProcessingTime:处理时间,是事件/数据被处理/计算时的系统的时间 EventTime的重要性 假设&#xff0c;你正在去往地下停…

sizeof和strlen区分,(好多例子)

sizeof算字节大小 带\0 strlen算字符串长度 \0之前

Simulink的SIL软件在环测试

以基于模型的设计&#xff08;MBD&#xff09;的软件开发时&#xff0c;需要进行SIL&#xff08;软件在环测试&#xff09;。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中&#xff0c;用在需要将控制器生成移植到硬件前&#xff0c;把控制器的模块生成代码&…

浅谈js中onmouseleave和onmouseout的区别

同步发布于我的网站 &#x1f680; 背景介绍基本概念区别详解 无子元素的情况有子元素的情况 实际应用场景 使用 onmouseleave使用 onmouseout 注意事项总结 背景介绍 在前端开发中&#xff0c;我们经常需要为元素绑定鼠标事件&#xff0c;以实现各种交互效果。onmouseleave…

【Git系列】利用 Bash 脚本获取 Git 最后一次非合并提交的提交人

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

36 基于单片机的电磁炉系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20温度传感器检测温度&#xff0c;通过八位数码管显示&#xff0c; 如果温度超过阈值&#xff0c;则蜂鸣器报警&#xff0c;红灯亮起&#xff1b;若不超过阈值&…

『 Linux 』数据链路层 - ARP协议及数据链路层周边问题

文章目录 ARP协议ARP欺骗RARP协议 DNS服务ICMP协议ping 命令正向代理服务器反向代理服务器 ARP协议 博客『 Linux 』数据链路层 - MAC帧/以太网帧中提到,当数据需要再数据链路层进行无网络传输时需要封装为MAC帧,而MAC帧的报文结构如下: 帧头部分存在两个字段分别为 “目的地址…