IP,TCP,UDP,ICMP校验和的区别和计算

一、IP,TCP,UDP,ICMP校验和的区别和计算

1、IP首部校验和

IP数据报的校验和只检验IP数据报的首部。

当发送IP包时,需要计算IP报头的校验和:

  1. 把校验和字段置为0;
  2. 对IP头部中的每16bit进行二进制求和;
  3. 如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值;
  4. 将该16bit的值取反,存入校验和字段。
//计算checksum
always @(posedge i_clk or posedge i_rst)begin
    if(i_rst)
        r_checksum <= 'd0;
    else if(r_recv_cnt == 1)
        r_checksum <= 16'h4500 + r_pkt_byte_len +
                        w_upper_ID + {w_upper_flags,w_upper_offset} + 
                        {8'd128,w_upper_type} + 16'd0 + 
                        r_dynamic_src_ip[31:16] + r_dynamic_src_ip[15:0] + 
                        r_dynamic_dst_ip[31:16] + r_dynamic_dst_ip[15:0];
    else if(r_recv_cnt == 2)
        r_checksum <= r_checksum[15:0] + r_checksum[31:16];    
    else
        r_checksum <= r_checksum;
end

2、TCP、UDP校验和

UDP数据报计算校验和的方法和IP数据报校验和的方法相似,但是UDP的校验和是将首部和数据部分一起都校验。

需要注意的是,由于UDP首部中不包含源地址与目标地址等信息,为了保证UDP校验的有效性,在进行UDP校验和的计算时,需要增加一个UDP伪首部的校验和。

伪首部共有12字节,包含如下信息:

  1. 源IP地址
  2. 目的IP地址
  3. 保留字节(置0,为了字节对齐)]
  4. 传输层协议号(TCP是6)
  5. UDP报文长度(报头+数据)。
    在这里插入图片描述

TCP 的校验和计算方法同UDP一样,同样要加上一个伪头部,区别是伪头部的协议码是0x06,长度是整个TCP报文的长度(包含TCP头部)。

伪首部是为了增加TCP校验和的检错能力:如检查TCP报文是否收错了(目的IP地址)、传输层协议是否选对了(传输层协议号)等。

3、ICMP校验和

ICMP校验和的计算方法一样,只不过只是对ICMP包整个进行校验和,没有伪头部,也不包括IP包头部。

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        r_hd_checksum <= 'd0;
    else if(i_trigger)
        r_hd_checksum <= 16'h0000 + 16'h0000 + i_Identifier + i_Sequence
                            + 16'h6162 + 16'h6364 + 16'h6566 + 16'h6768
                            + 16'h696a + 16'h6b6c + 16'h6d6e + 16'h6f70
                            + 16'h7172 + 16'h7374 + 16'h7576 + 16'h7761
                            + 16'h6263 + 16'h6465 + 16'h6667 + 16'h6869;
    else if(ri_trigger)
        r_hd_checksum <= r_hd_checksum[31:16] + r_hd_checksum[15:0];
    else 
        r_hd_checksum <= r_hd_checksum;
end


always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        rm_axis_ip_data <= 'd0;
    else case(r_cnt)
        0           :rm_axis_ip_data <= {16'h0000,(~r_hd_checksum[15:0]),ri_Identifier,ri_Sequence};
        1           :rm_axis_ip_data <= {64'h6162636465666768};
        2           :rm_axis_ip_data <= {64'h696a6b6c6d6e6f70};
        3           :rm_axis_ip_data <= {64'h7172737475767761};
        4           :rm_axis_ip_data <= {64'h6263646566676869};
        default     :rm_axis_ip_data <= 64'd0;
    endcase
end

总结

IP、TCP、UDP、ICMP校验和的区别:

  1. IP校验和 = IP头部的计算
  2. TCP,UP校验和 = 伪首部+TCP/UDP报头+数据
  3. ICMP校验和 = ICMP报头+数据
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺子学不会FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值