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

简介: 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

 

相关文章
|
26天前
|
搜索推荐 程序员 调度
精通Python异步编程:利用Asyncio与Aiohttp构建高效网络应用
【10月更文挑战第5天】随着互联网技术的快速发展,用户对于网络应用的响应速度和服务质量提出了越来越高的要求。为了构建能够处理高并发请求、提供快速响应时间的应用程序,开发者们需要掌握高效的编程技术和框架。在Python语言中,`asyncio` 和 `aiohttp` 是两个非常强大的库,它们可以帮助我们编写出既简洁又高效的异步网络应用。
107 1
|
4天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
28 6
|
13天前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
37 2
|
24天前
|
机器学习/深度学习 数据采集 存储
时间序列预测新突破:深入解析循环神经网络(RNN)在金融数据分析中的应用
【10月更文挑战第7天】时间序列预测是数据科学领域的一个重要课题,特别是在金融行业中。准确的时间序列预测能够帮助投资者做出更明智的决策,比如股票价格预测、汇率变动预测等。近年来,随着深度学习技术的发展,尤其是循环神经网络(Recurrent Neural Networks, RNNs)及其变体如长短期记忆网络(LSTM)和门控循环单元(GRU),在处理时间序列数据方面展现出了巨大的潜力。本文将探讨RNN的基本概念,并通过具体的代码示例展示如何使用这些模型来进行金融数据分析。
157 2
|
24天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第7天】本文将深入探讨卷积神经网络(CNN)的基本原理,以及它如何在图像识别领域中大放异彩。我们将从CNN的核心组件出发,逐步解析其工作原理,并通过一个实际的代码示例,展示如何利用Python和深度学习框架实现一个简单的图像分类模型。文章旨在为初学者提供一个清晰的入门路径,同时为有经验的开发者提供一些深入理解的视角。
|
3天前
|
数据采集 监控 数据可视化
Fortran 在单位网络监控软件数据处理中的应用
在数字化办公环境中,Fortran 语言凭借其高效性和强大的数值计算能力,在单位网络监控软件的数据处理中展现出独特优势。本文介绍了 Fortran 在数据采集、预处理和分析可视化三个阶段的应用,展示了其在保障网络安全稳定运行和有效管理方面的价值。
27 10
|
5天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
21 4
|
6天前
|
机器学习/深度学习 存储 运维
图神经网络在复杂系统中的应用
图神经网络(Graph Neural Networks, GNNs)是一类专门处理图结构数据的深度学习模型,近年来在复杂系统的研究和应用中展现了强大的潜力。复杂系统通常涉及多个相互关联的组件,其行为和特性难以通过传统方法进行建模和分析。
23 3
|
10天前
|
缓存 监控 前端开发
优化网络应用的性能
【10月更文挑战第21天】优化网络应用的性能
10 2
|
10天前
|
监控 安全 关系型数据库
如何设计高效网络应用?
【10月更文挑战第21天】如何设计高效网络应用?
12 2