网络协议及应用之二:校验和

简介: TCP/IP协议族校验和的计算方法相同, 差别在于进行校验的数据.   一 校验和计算方法    1. 将数据流按16bit求和, 存放在32Bit及更大的空间(eg.
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值对结果没有影响.
   算法如下:
  1. u_int16_t check_sum(u_int16_t *buffer, int size)
  2. {
  3.     //建议将变量放入寄存器, 提高处理效率.
  4.     register int len = size;       
  5.     register u_int16_t *p = buffer;
  6.     register u_int32_t cs = 0;
  7.     //16bit求和
  8.     while( len >= 2)
  9.     {
  10.         cs += *(p++);
  11.         len -= 2;
  12.     }
  13.     //最后的单字节直接求和
  14.     if( len == 1)
  15.         cs += *((u_int8_t *)buffer);
  16.     //高16bit与低16bit求和, 直到高16bit为0
  17.     while( (cs&0xffff0000) != 0)
  18.         cs = (cs>>16) + (cs&0xffff);
  19.     //取反
  20.     return (u_int16_t)(~cs);
  21. }

二 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填充img_bdd1c01e33b5d08ed7c50fa249cd532b.jpg
   2. 伪首部的数据img_a7e2cffe45f7a59a4a13b953dcf83e8f.jpg

    考虑到校验和算法的两个特点 顺序无关/全0无关, 我们可以认为: 缓冲区内, 8字节以后的数据与伪部首完全一至, 可以直接进行校验和计算.
注: 1 TCP数据校验方法和UDP完全相同.
    2 也可以另外建立一个缓冲区, 将数据拷贝过去进行计算, 但效率太低.

    以下是上一篇文章《网络协议及应用之一:socket构造数据包及DOS(SYNflood)攻击》中应用到的代码及详细解释.

  1.     {
  2.         //ip首部中的ttl. 在伪首部计算时, 要先设置为0
  3.         ip->ip_ttl = 0; 
  4.         
  5.         //ip首部的校验和字段, 作为伪首部时, 存放tcp长度
  6.         ip->ip_sum = htons(sizeof(struct tcphdr));
  7.         //因为是攻击包, 源地址随机产生
  8.         ip->ip_src.s_addr = random();        
  9.         //校验前, 将校验和字段设置为0
  10.         tcp->check = 0;
  11.         
  12.         //计算tcp校验和时, 避开ip首部的8个字节. 并设置需要校验的长度
  13.         tcp->check = check_sum((u_int16_t *)buffer + 4, sizeof(buffer) - 8);

  14.         //恢复ip的ttl 
  15.         ip->ip_ttl = MAXTTL;        

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

三 计算结果
   1 校验和错误时, 没有服务器的SYN+ACK包img_af6c6205543d738f84e643f879d46e9d.jpg


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


   3 正确的tcp校验和结果

img_744c19ad2e534f2f3f84cf1a7240e7d2.jpg

 

相关文章
|
22天前
|
人工智能 运维 物联网
AI在蜂窝网络中的应用前景
AI在蜂窝网络中的应用前景
43 3
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
87 6
|
29天前
|
监控 安全
公司上网监控:Mercury 在网络监控高级逻辑编程中的应用
在数字化办公环境中,公司对员工上网行为的监控至关重要。Mercury 作为一种强大的编程工具,展示了在公司上网监控领域的独特优势。本文介绍了使用 Mercury 实现网络连接监听、数据解析和日志记录的功能,帮助公司确保信息安全和工作效率。
92 51
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
25天前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
23天前
RS-485网络中的标准端接与交流电端接应用解析
RS-485,作为一种广泛应用的差分信号传输标准,因其传输距离远、抗干扰能力强、支持多点通讯等优点,在工业自动化、智能建筑、交通运输等领域得到了广泛应用。在构建RS-485网络时,端接技术扮演着至关重要的角色,它直接影响到网络的信号完整性、稳定性和通信质量。
|
26天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
26天前
|
网络协议 数据挖掘 5G
适用于金融和交易应用的低延迟网络:技术、架构与应用
适用于金融和交易应用的低延迟网络:技术、架构与应用
52 5
|
26天前
|
运维 物联网 网络虚拟化
网络功能虚拟化(NFV):定义、原理及应用前景
网络功能虚拟化(NFV):定义、原理及应用前景
42 3
|
26天前
|
数据可视化 算法 安全
员工上网行为管理软件:S - PLUS 在网络统计分析中的应用
在数字化办公环境中,S-PLUS 员工上网行为管理软件通过精准的数据收集、深入的流量分析和直观的可视化呈现,有效帮助企业管理员工上网行为,保障网络安全和提高运营效率。
27 1