计算机网络计算udp校验值,网络协议及应用之二:TCP/UDP校验和

本文详细介绍了TCP/IP协议族中校验和的计算方法,包括将数据流按16bit求和、处理单字节数据、高16bit与低16bit的求和过程以及取反得到校验和的步骤。同时,解释了TCP/UDP校验和计算时涉及的12字节伪首部、协议首部和数据部分,并展示了如何在实际计算中应用这些方法。通过示例展示了正确和错误校验和的结果对TCP连接的影响。
摘要由CSDN通过智能技术生成

TCP/IP协议族校验和的计算方法相同, 差别在于进行校验的数据.

一 校验和计算方法

1. 将数据流按16bit求和, 存放在32Bit及更大的空间(eg. u_int32_t cs).

2. 如果数据流为单字节(留8bit数据), 将之前求和的值与最后8bit求和.

3. 如cs高16bit不为0, 则将高16bit与低16bit相加, 直到高16bit为0.

4. 将低16bit的值取反, 得到校验和.

这种校验和的计算方法有两个特点:

1 把数据流按16bit化分为若干u_int16_t的字段. 计算结果并不依赖u_int16_t的顺序.

2 在检验和计算中加上全0值对结果没有影响.

算法如下:

u_int16_t check_sum(u_int16_t *buffer, int size)

{

//建议将变量放入寄存器, 提高处理效率.

register int len = size;

register u_int16_t *p = buffer;

register u_int32_t cs = 0;

//16bit求和

while( len >= 2)

{

cs += *(p++);

len -= 2;

}

//最后的单字节直接求和

if( len == 1)

cs += *((u_int8_t *)buffer);

//高16bit与低16bit求和, 直到高16bit为0

while( (cs&0xffff0000) != 0)

cs = (cs>>16) + (cs&0xffff);

//取反

return (u_int16_t)(~cs);

}

二 TCP/UDP的校验和计算方法

TCP/UDP的校验和计算方法相同, 都包括了以下数据的计算: 1) 12字节的伪首部(包含了IP层信息). 2) TCP/UDP首部. 3) TCP/UDP数据.

我们用IP首部/UDP首部为例(1 示例不包含IP选项. 2 引用的图来自于《TCP/IP详解-卷二》)

   1. 首先看在缓冲区内的UDP/IP数据, 灰色部份IP填充, 白色UDP填充60b1133f488b6fb0fcae952fd073383c.png

   2. 伪首部的数据ab0f71617be8d2d47eba7b615173ca12.png

考虑到校验和算法的两个特点 顺序无关/全0无关, 我们可以认为: 缓冲区内, 8字节以后的数据与伪部首完全一至, 可以直接进行校验和计算.

注: 1 TCP数据校验方法和UDP完全相同.

2 也可以另外建立一个缓冲区, 将数据拷贝过去进行计算, 但效率太低.

{

//ip首部中的ttl. 在伪首部计算时, 要先设置为0

ip->ip_ttl = 0;

//ip首部的校验和字段, 作为伪首部时, 存放tcp长度

ip->ip_sum = htons(sizeof(struct tcphdr));

//因为是攻击包, 源地址随机产生

ip->ip_src.s_addr = random();

//校验前, 将校验和字段设置为0

tcp->check = 0;

//计算tcp校验和时, 避开ip首部的8个字节. 并设置需要校验的长度

tcp->check = check_sum((u_int16_t *)buffer + 4, sizeof(buffer) - 8);

//恢复ip的ttl

ip->ip_ttl = MAXTTL;

sendto( sockfd, buffer, len, 0, (struct sockaddr *)(&addr), sizeof(struct sockaddr_in));

}

三 计算结果

   1 校验和错误时, 没有服务器的SYN+ACK包79f34072afba99dd8c83f6856d2380dc.png

2 校验和正确, 双向SYN包. 服务器等待第3次握手990245fc496dd5aa5e05d323ccfac0d4.png

3 正确的tcp校验和结果

7503221bf92d62397935c7a9fe0e48a5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值