美文网首页
增量式修改检验和(IP, TCP, UDP)算法的研究和实现

增量式修改检验和(IP, TCP, UDP)算法的研究和实现

作者: _宋江_ | 来源:发表于2023-11-27 17:47 被阅读0次

转载自

https://blog.csdn.net/force_eagle/article/details/38546009

/*

*/

对于数据包中检验和的计算,很多讲TCP/IP协议的书中都讲过,RFC1071是讨论计算检验和的文档。传统的计算方法都是需要将整个数据报文的数据(IP报文是计算IP头部的数据)进行反码求和。

但在实际的应用中,存在对收到的数据包进行修改若干个地方,并回送至发送方或者转发的情况。这个时候,就涉及的重新计算数据包的检验和。最常见的可能就是,将收到的数据包的TTL字段减1,并转发的情况。如果仍旧按照传统的计算检验和的方式进行计算,特别是当数据包长度很大时,为了重新计算校验和而将整个数据包的数据遍历一边,反码求和,效率肯定比较低。

一、增量修改检验和的实现

解决的方法就是采用增量式修改检验和的方法。该方法是由RFC1141提出的。这里进行以下简单的变通,将增量式修改检验和的公式列出来:

HC -- 数据包中旧的检验和

HC'-- 数据包中新的检验和

m --数据包中某个域(16-bit字)修改前的值

m' -- 数据包中某个域(16-bit字)修改后的值

那么,修改某个域之后的校验和HC'与HC,m 和m'的关系如下:

HC' = HC + m + ~m' (公式1)

具体实现的C代码如下:

/*implemented according with RFC 1071 and1141*/
 
static unsigned short csum_incremental_update(unsigned short old_csum,
 
                unsigned short old_field,
 
                unsigned short new_field)
 
{
 
   unsigned long csum = old_csum + old_field + (~new_field & 0xFFFF);
 
   csum = (csum >> 16) + (csum & 0xFFFF);
 
   csum +=  (csum >> 16);
 
   return csum;
 
}

这个时候,如果修改了IP头部的TTL值,将取修改前的TTL域所在的16-bit字的值为old_field, 修改后的为new_field, 并取出就得检验和old_csum,通过调用该函数即可计算出新的检验和。

当然该函数每次只能计算一个16-bit字,如果对数据包中修改了过多的16-bit字,那么它的性能将会如何呢。

用TCP数据包做测试。而且该TCP数据包为三次握手时的数据包,仅有头部,没有数据部分。对该数据包修改了8个不同的16-bit字,调用该函数8次所需的时间仍旧不到传统计算方法的一半。可见,效果适合明显的。

二、增量修改检验和的完善

  1. RFC1071和1141所提出的增量式修改检验有一个BUG,就是按照公式1计算新的检验和时,有可能出现计算结果为0xFFFF的情形,可以参看RFC1624给出的例子。如果检验和为0xFFFF,则意味着数据包中所有部分相加的结果为0x0000。这是不可能的。因此,RFC1624提出了对这个BUG的改进方法,见公式2:

    HC' = (HC + ~m + m') (公式2)

公式2先对旧的检验和和某个域的值取反,加上新的域值之后,将整体的和再次取反得出新的检验和。

具体实现的C代码如下:

/*implemented according with RFC 1624,modified the algorithm from RFC 1071 and 1141*/
 
static unsigned short csum_incremental_update_modified(unsigned short old_csum,
 
                unsigned short old_field,
 
                unsigned short new_field)
 
{
 
   unsigned long csum = (~old_csum & 0xFFFF) + (~old_field &0xFFFF) + new_field ;
 
   csum = (csum >> 16) + (csum & 0xFFFF);
 
   csum +=  (csum >> 16);
 
   return ~csum;
 
}

该方法和公式1给出的方法很明显多出了两次取反操作,在效率上并没有公式1的高,这个也经过了实际的测试。

  1. 对此,RFC1624又给出了另外一个方法既可以保证修正RFC1071和RFC1141的BUG,又可以保证执行的效率,见公式3:

    HC' = HC - ~m - m' (公式3)

公式3采用减法操作代替公示2中的加法操作。

具体实现的AT&T汇编代码如下:

/*incremental update IP ,TCP, UDP checksum,
implemented in Assembly according with RFC1624, used subtraction to update checksum*/
static inline unsigned short csum_incremental_update(unsigned short old_csum,
                                unsigned shortold_field,
                                unsigned short new_field)
{
   __asm__ __volatile__(
       "notw %1; \n"
       "subw %1, %0; \n"   
       "sbbw %2, %0; \n"
       "sbbw $0, %0; \n"
       :"=r" (old_csum)
       :"r"(old_field), "r"(new_field),"0"(old_csum));
   return old_csum;
}

相关文章

  • TCP和UDP

    TCP协议为TCP/IP协议;UDP为UDP/IP协议。TCP和UDP都是对应网络七层协议上的传输层。IP属于网络...

  • 计算机网络以及网络编程面试题(不断补充)

    TCP/IP网络协议栈层次 TCP 和 UDP 应用场景 TCP 和 UDP 不同 为什么TCP是可靠的?超时重传...

  • iOS 网络编程socket

    一、概念 首先,理清一些概念 TCP/IP和UDP,HTTP协议,Socket 1.TCP/IP和UDP,是网络中...

  • TCP

    TCP和UDP端口可以重复 TCP/IP协议中端口,范围从0到65535 TCP和UDP的区别 TCP协议需要创建...

  • TCP与UDP首部格式详解

    1.序 在TCP/IP中能够实现传输层功能的、具有代表性的协议是TCP和UDP,来一起看看TCP UDP的构造吧。...

  • 网络编程学习----(2)UDP模式下,实现数据的传输与接受

    1 IP地址:Java类中的InetAddress对象2 TCP和UDP3 Socket4 UDP模式下,实现数据...

  • 九.Node.js Server

    HTTP协议的底层是由TCP和IP(TCP/IP)构建的 TCP 和 UDP 的区别是什么简答:TCP 可靠、面向...

  • TCP 和 UDP 有什么区别?

    大家好,我是前端西瓜哥,今天来聊聊 TCP 和 UDP 的区别。 TCP 和 UDP 都是 TCP/IP 协议簇中...

  • TCP/IP的分层

    在TCP/IP协议族中,有很多种协议: TCP和UDP TCP和UDP是两种最为著名的运输层协议,二者都是用IP作...

  • IM即时通讯简章

    即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和...

网友评论

      本文标题:增量式修改检验和(IP, TCP, UDP)算法的研究和实现

      本文链接:https://www.haomeiwen.com/subject/ohttgdtx.html