公司建立网站步骤,西安seo外包机构,系统做网站的地方,如何用域名做网站访问IP头校验和
IP头校验和是一种错误检测机制#xff0c;用于在互联网协议#xff08;IP#xff09;中保证IP头的数据完整性。
当一个IP数据包从源主机发送到目的主机时#xff0c;它经过许多路由器和交换机#xff0c;校验和可以帮助这些中间设备检查数据包在传输过程中是…IP头校验和
IP头校验和是一种错误检测机制用于在互联网协议IP中保证IP头的数据完整性。
当一个IP数据包从源主机发送到目的主机时它经过许多路由器和交换机校验和可以帮助这些中间设备检查数据包在传输过程中是否出现错误。
IP头校验和的计算方式如下
分割将IP头部分为16位2字节的段。求和将所有16位的段相加以二进制求和也就是每个段直接按位相加。进位处理如果求和的结果产生了溢出则将溢出的部分即进位加到求和的结果的最低位上。这可能需要重复进行直到不再有溢出发生。取反将求和结果取反按位取反1变00变1得到校验和。
这个校验和随后被填充在IP头中专门为校验和预留的字段内。在接收端同样的计算会被执行在收到的IP头上包括校验和字段本身。如果数据包在传输过程中没有错误所有段的总和加上接收到的校验和的结果应该是一个全1的二进制数因为原始计算中结果取反了。如果计算结果不是全1那么就说明数据在传输过程中可能出现了错误。
重要的是IP头校验和只检查头部的完整性并不保护整个IP数据包的内容。传输层如TCP或UDP有自己的校验和负责整个数据段包括数据的完整性检查。
在实际的网络设备中这个计算通常是由硬件来执行以提高数据包处理的效率。当数据包通过每个路由器传输时因为TTL字段会改变所以需要重新计算校验和。
module emcode_checksum_ip #(parameter Length_HeartBeat_all 8d114
)(input wire sys_clk ,input wire sys_rst_n ,input wire i_vaild ,input wire [7:0] i_data ,output wire o_vaild ,output wire [7:0] o_data
);reg [15:0] r_i_vaild ;reg [07:0] r1_i_data [15:0] ;reg [07:0] checksum_cnt ;reg [01:0] concat_cnt ;wire [15:0] concat_data ;reg [31:0] r1_sum ;wire [31:0] r1_checksum_value ;wire [15:0] r2_checksum_value ;reg [15:0] r3_checksum_value ;reg [07:0] vaild_cnt ;reg [07:0] r_o_data ;always (posedge sys_clk) beginr_i_vaild {r_i_vaild[14:0],i_vaild};endreg [7:0] reg_i1;reg [7:0] reg_i2;always (posedge sys_clk) beginif(sys_rst_n 1b0) beginfor (reg_i1 0; reg_i1 d15; reg_i1 reg_i1 1) beginr1_i_data[reg_i1] d0;endend else beginfor (reg_i2 0; reg_i2 d15; reg_i2 reg_i2 1) beginr1_i_data[reg_i21] r1_i_data[reg_i2];endr1_i_data[0] i_data;endendalways (posedge sys_clk) beginif(sys_rst_n 1b0) beginchecksum_cnt 8h0;end else if(i_vaild 1b0 r_i_vaild[0] 1b1) beginchecksum_cnt 8h0;end else if(i_vaild 1b1)beginchecksum_cnt checksum_cnt 1b1;endendalways (posedge sys_clk) beginif(sys_rst_n 1b0) beginvaild_cnt 8h0;end else if(r_i_vaild[10] 1b0 r_i_vaild[11] 1b1) beginvaild_cnt 8h0;end else if(r_i_vaild[10] 1b1)beginvaild_cnt vaild_cnt 1b1;endendalways (posedge sys_clk) beginif(sys_rst_n 1b0) beginconcat_cnt 2d0;end else if(i_vaild 1b0 r_i_vaild[0] 1b1) beginconcat_cnt 2d0;end else if(i_vaild 1b1 checksum_cnt d22 checksum_cnt 41) beginif(concat_cnt 1b1) beginconcat_cnt 2d0;end else beginconcat_cnt concat_cnt 1b1;endend else beginconcat_cnt concat_cnt;endendassign concat_data {r1_i_data[0],i_data};always (posedge sys_clk) beginif(sys_rst_n 1b0) beginr1_sum 32d0;end else if(i_vaild 1b0 r_i_vaild[0] 1b1) beginr1_sum 32d0;end else if(i_vaild 1b1 checksum_cnt d22 checksum_cnt d41 concat_cnt 1b1) beginr1_sum r1_sum concat_data;end else beginr1_sum r1_sum;endend assign r1_checksum_value r1_sum[15:0] r1_sum[31:16];assign r2_checksum_value ~(r1_checksum_value[15:0]);always (posedge sys_clk) beginif(sys_rst_n 1b0) beginr3_checksum_value d0;end else if(r_i_vaild[10] 1b0 r_i_vaild[11] 1b1) beginr3_checksum_value d0;end else if(i_vaild 1b1 checksum_cnt d42) beginr3_checksum_value r2_checksum_value;endendassign o_vaild r_i_vaild[11];assign o_data r_o_data ;always (posedge sys_clk) beginif(sys_rst_n 1b0) beginr_o_data 8d0;end else if(r_i_vaild[10] 1b1 vaild_cnt d32) beginr_o_data r3_checksum_value[15:08];end else if(r_i_vaild[10] 1b1 vaild_cnt d33) beginr_o_data r3_checksum_value[07:00];end else beginr_o_data r1_i_data[10];endend
endmodule
UDP校验和
UDP校验和是一种错误检测机制与IP校验和类似但它覆盖了更多的数据UDP校验和不仅检查UDP头部还检查数据部分。这为UDP数据包提供了一个简单的形式的数据完整性验证。
计算UDP校验和的步骤如下 伪头部首先创建一个所谓的“伪头部”它包括源IP地址、目的IP地址、一个8位全零字段、协议字段对于UDP这个值是178‘h11和UDP长度字段。这个伪头部不是UDP数据包的一部分而是仅用于校验和计算过程。 合并将伪头部、UDP头部和数据部分合并起来。如果数据的总字节长度不是偶数会在最后添加一个零字节来填充。 分割将合并后的数据分割成16位的段。 求和以二进制求和这些16位的段包括溢出。 进位处理与IP校验和相同如果求和的结果产生溢出将溢出的部分加回到求和结果的最低位。 取反将最终的求和结果取反。
得到的校验和随后放入UDP头部中的校验和字段。在接收端同样的计算会被执行在整个数据包上包括伪头部。如果数据包传输正确所有的16位段相加包括校验和字段应该结果为全1的二进制数0xFFFF。如果不是那么就说明数据包在传输过程中出现了错误。
值得注意的是UDP校验和是可选的在IPv4中可以设置为零表示不计算校验和但在IPv6中UDP校验和是必需的。这是因为IPv6不包括一个独立的校验和因此依赖于UDP校验和提供错误检测。