IP数据报的校验:

IP数据报只需要对数据头进行校验,步骤如下:

  1. 将接收到的数据的checksum字段设置为0
  2. 把需要校验的字段的所有位划分为16位(2字节)的字
  3. 把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C
  4. 将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。

上述第2步中也可以不用每次把进位加到低位,可以等所有数据计算结束再将高位16个字依次加到低位,直到最后结果是两个字节为止,例如所有数据相加后为0xb6e51c2a3,首先将其低位2个字节和剩余的高位字节相加0xB6E51+0xC2A3=0xC30F4,对得到的再次将低2个字节和剩余的高位相加:0x30F4+0XC=0X3100

TCP/UDP数据报的校验

一、下面的图是一个UDP的检验和所需要用到的所有信息,包括三个部分:

  • UDP伪首部
  • UDP首部
  • UDP的数据部分

首先解释下伪首部的概念,伪首部的数据都是从IP数据报头获取的。其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。
还有一个概念十分重要,那就是16位UDP总长度,该长度是UDP头和数据的总长度。剩下的校验算法和IP数据报的校验方法一致了。

例子

import struct

def check(data):
sum=0
for i in range(0,len(data),4):
val = int(data[i:i+4],16)
sum = sum + val
sum = sum & 0xffffffff sum = (sum >> 16) + (sum & 0xffff)
if sum > 65535:
sum = (sum >> 16) + (sum & 0xffff) return 65535-sum a = '4500003c00004000400652c00a1a1a163afb88d1'
ip_check = check(a)
print('ip_check:',hex(ip_check)) a='9bd327105919fa3e17da3cbf8018014dd59000000101080a0024a9d043dcc85d5459504520490d0a' #will length = struct.pack('>H',len(a)//2).hex()
print(length) if len(a)%4 !=0:
a=a+'00' b='c0a8c8010a1a1a16'+'0006'+length+a tcp_check= check(b)
print('tcp_check:',hex(tcp_check))

  

使用Python计算IP、TCP、UDP校验和的更多相关文章

  1. Socket(套接字) IP TCP UDP HTTP

    Socket(套接字) 阮老师的微博 (转)什么是套接字(Socket)? 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进 ...

  2. 《TCP/IP - TCP/UDP》

    一:概述 - 由于 IP 的传输是无状态的,IP 提供尽力服务,但并不保证数据可以到达主机. - 所以,数据的完整性需要更上层的 传输层来保证.TCP和UDP 均属于 传输层. 二:UDP - 特点 ...

  3. IP/TCP/UDP checsum

    今天调试bug时, 忘了将原始的check_sum值reset,导致发包-抓包后发现.check-sum 错误. 来看一看check-sum:简单讲就是对要计算的数据,以16bit为单元进行累加,然后 ...

  4. 以太 ip tcp udp 三次握手的理解

    以太帧: 1.前导码(7字节):使接收器建立比特同步. 2.起始定界符SFD(1字节):指示一帧的开始. 3.目的地址DA(6字节):指出要接收该帧的工作站. 4.源地址SA(6字节):指示发送该帧的 ...

  5. IP,TCP,UDP Checksum校验

    IP数据报的校验: IP数据报只需要对数据头进行校验,步骤如下: 将接收到的数据的checksum字段设置为0 把需要校验的字段的所有位划分为16位(2字节)的字 把所有16位的字相加,如果遇到进位, ...

  6. 以太网,IP,TCP,UDP数据包分析【转】

    原文地址:http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 ...

  7. 以太网,IP,TCP,UDP数据包分析(此文言简意赅,一遍看不懂的话,耐心的看个10遍就懂了,感谢作者无私奉献)

    1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 2.TCP/IP 网络协议栈分为应用层(Application).传输层(Tra ...

  8. python学习之TCP/UDP

    TCP/UDP都是网络编程(socket)的两种基于C/S结构的程序. UDP的9999端口与TCP的9999端口可以各自绑定. UDP:非可靠连接速度快,服务器:创建socket 绑定ip和端口后直 ...

  9. IP/IGMP/UDP校验和算法

    校验和算法:IP.IGMP.UDP和TCP报文头部都有检验和字段,其算法都是一样的. IP.IGMP.UDP和TCP校验和的范围:仅报文头部长度. 在发送数据时,为了计算数据包的检验和.应该按如下步骤 ...

随机推荐

  1. PHP解决网站大流量与高并发

    1:硬件方面 普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬 ...

  2. 解决Run As -> Java Application不能运行问题

    转自:https://breakshell.iteye.com/blog/467130 点 Run As -> Java Application 不能运行,报的错误如下: Plug-in org ...

  3. react-native ios打包 、设置图标 启动图片

    在这里只记录xcode 打包操作,申请证书操作,之前已经记录过了. https://www.cnblogs.com/hellovoidworld/p/4127576.html  参考了这篇文章,只是可 ...

  4. 抛出异常 exception

    throw raise raise Exception.CreateFmt(sFileWithNoExt, [FileName]);

  5. 机器学习入门-数值特征-进行多项式变化(将特征投影到高维度上) 1.PolynomialFeatures(将数据变化为多项式特征)

    函数说明: 1. PolynomialFeatures(degree=2, interaction_only=False, include_bias=False) 参数说明:degree=2,表示多项 ...

  6. 我要带徒弟学写JAVA架构,引路架构师之路(Jeecg开源社区)

    带徒弟学JAVA架构(Jeecg社区)      Java程序员如何打破工作2,3年的瓶颈问题,如何更上一层楼?      太多的巧合,让我接触到了开源,通过JEECG与很多朋友交流后,让我有了帮助别 ...

  7. 现学现卖——Keil uVision 使用教程

    Keil uVision 使用教程 1.如果有旧的工程在,先关闭旧工程.Project -> Close Project2.新建工程.Project -> New uVision Proj ...

  8. 遍历DOM树,过滤节点

    jQuery还提供以下方法来过滤节点.  方法  说明  first()  获取第一个,示例 $('li').last()  last()  获取最后一个,示例$('li').last()  eq() ...

  9. Python学习第二步骤

    第一步的基本的语法,在Linux或者mac(别喷)上直接输入Python,查看版本,如果显示就是已经内置了 第二步当然是进行数据库的操作了 我选择的是mysql 那几个踩到的雷 分别是: 1:MySQ ...

  10. windows下一分钟配置ngnix实现HLS m3u8点播

    1. 下载 nginx-1.5.10 for windows 2. 修改配置文件nginx-1.5.10\conf\nginx.conf,增加以下行到最后一个"}"的前一行: lo ...