scapy基础-网络数据包结构
网络层次模型,数据包的组成是学习scapy的基础,下文主要关注模型中各个层次的用途,ethernet II和ip包数据结构。
1.五层模型简介
| 名称 | 作用 | 包含协议 |
|---|---|---|
| 应用层 | 面向程序对程序的传输服务 (应用层更关注于ip协议中的数据包部分) |
HTTP,DNS,FTP,SMTP |
| 传输层 | 分割并重新组装上层提供的数据流,为数据流提供端口到端口的传输服务。 (传输层关注端口号) |
TCP,UDP |
| 网络层 | 1.通过包的分片适应最大传输单元长度 2.路由实现的方式和学习的方式 3.定义所有结点的逻辑地址(ip地址) (网络层关注ip地址) |
IP,ARP,ICMP,DHCP |
| 数据链路层 | 1.把比特流组合成帧,然后发出去 2.判断从那一帧开始到那一帧结束 3.通过一些方法(如效验码)来保证数据的正确性 (数据链路层关注MAC地址) |
Ethernet,IEEE 802.11 wireless LAN |
| 物理层 | 一套为上层数据链路层提供无差异化数据的规范 | 太底层了,不关注… |
2. Ethernet II数据包
数据链路层有很多协议,这里只关注一个我们最最常用的Ethernet II协议。
| 目的地址 | 源地址 | 类型 | 数据 | FCS |
|---|---|---|---|---|
| 6 byte | 6 byte | 2 byte | 46~1500 byte | 4 byte |
目标地址:此数据包的目标MAC地址。
源地址:此数据包的源MAC地址。
协议类型:上层协议,表示网络层使用的协议。(0x0800表示网络层使用的是IP协议)
数据:高层协议、数据和填充符,范围在46~1500字节。(如果数据长小于46字节,则要求“填充”,以使这个数据的长度达到46字节)
FCS:数据帧校验序列,用于确定数据包在传输过程中是否损坏。
参考:https://en.wikipedia.org/wiki/Ethernet_frame#Ethernet_II
3.IP数据包
| Offsets | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Version(4bit) | IHL(4bit) | DSCP(6bit) | ECN(2bit) | Total Length(16bit) | |||||||||||||||||||||||||||
| 4 | Identification(16bit) | Flags(3bit) | Fragment Offset(13bit) | |||||||||||||||||||||||||||||
| 8 | Time To Live(8bit) | Protocol(8bit) | Header Checksum(16bit) | |||||||||||||||||||||||||||||
| 12 | Source IP Address(32bit) | |||||||||||||||||||||||||||||||
| 16 | Destination IP Address(32bit) | |||||||||||||||||||||||||||||||
| 20 | Options(if IHL > 5) | padding | ||||||||||||||||||||||||||||||
| Data | ||||||||||||||||||||||||||||||||
几个需要重点关注的对象:
1. 源地址,目的地址,ttl值在网络层的ip数据包中。
2. Protocol字段定义了数据部分的上层协议类型(值参考https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers)
3. ip数据包包含头部和数据部分。IHL(Internet Header Length)代表 ip包头部长度占用4bit,值范围是5-15,用IHL值*4字节就得到ip头部长度(所以头部长度一定是4字节的倍数)。Total Length是包括头部和数据部分整个ip包的长度,占用16bit,其值以byte为单位。最小值 20 bytes (20字节头部+ 0 bytes数据),最大值 65,535 bytes。
4. Header Checksum只包含头部数据的错误校验码,当包经过路由器时可能会修改ip包头部数据,此时需要重新计算此值。如果包含数据部分就太费时间了。
参考:https://en.wikipedia.org/wiki/IPv4#Packet_structure
4.校验和(checksum)
checksum只要用于验证数据在传输和存储过程中的完整性而不是准确性,其中特别需要注意的是在计算校验和时checksum字段的值应该为0。其计算方法如下:
SHORT checksum(USHORT* buffer, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
//处理当cksum大于16bit的情况,处理成16bit
cksum = (cksum>>16) + (cksum&0xffff);
cksum += (cksum>>16); // 处理上一步相加时可能产生的进位
return (USHORT)(~cksum);
}
参考:http://www.thegeekstuff.com/2012/05/ip-header-checksum
转自:http://blog.csdn.net/cracker_zhou/article/details/54645276
scapy基础-网络数据包结构的更多相关文章
- C++版的网络数据包解析策略(升级版)
初版:http://www.cnblogs.com/wjshan0808/p/6580638.html 说明:在实现了对应的接口后该策略可以适合绝大多数的网络数据包结构 首先,是三个接口 IProdu ...
- TCP/IP数据包结构具体解释
[关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构, ...
- Linux 中的网络数据包捕获
Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...
- Linux内核中网络数据包的接收-第一部分 概念和框架
与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协 ...
- TCP/IP数据包结构详解
一般来说,网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作,但是一些特殊的情况下,就需要深入的理解网络数据包的结构,以及协议分析.如:网络监控,故障排查等…… IP包是不安全的,但是 ...
- sk_buff封装和解封装网络数据包的过程详解(转载)
http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...
- linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一
在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备:第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包, ...
- 用C++实现网络编程---抓取网络数据包的实现方法
一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...
- UNIX网络编程——网络数据包检测
网络数据包检测 数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成. 三种访问方式: BSD Packet Filter(BPF) SVR4 Datalink Provi ...
随机推荐
- PS和AI安装后报代码为16的错误解决方法
1.问题 2.解决方式 右击属性,改为兼容性运行 参考文章地址:https://www.jb51.net/softjc/308950.html
- nodejs学习(二) ---- express中使用模板引擎jade
系列教程,上一节教程 express+nodejs快速创建一个项目 在创建一个项目后,views目录下的文件后缀为 .jade . 打开 index.jade,具体内容如下图(忽略 header.j ...
- 201621123079《Java程序设计》第1周学习总结
第1周-Java基本概念 1.本周学习总结 第一次上课接触java,了解了java的由来和历史,还有JCP,JSP的概念,并学会如何建立一个java文件和运行过程.感觉java比之前学习的数据结构更高 ...
- eclipse 导入svn项目并添加server
1.打开svn资源库 window-->show view-->other-->svn-->svn资源库 2.控制台选中文件夹右键-->检出为--finish 3.添加服 ...
- MySQL-----备份(转储)
备份: **备份数据表结构+数据** mysqldump -u root 要备份的数据库表名 > 要备份的数据的备份名(这里也可以指定路径) -p **备份数据表结构** mysqldump - ...
- (十三)python 3 集合
定义: 1.不同元素组成 2.无序 3.集合中的元素必须是不可变类型 创建集合 s = {1,2,3,4,5,6,7,8} 1.定义可变集合 >>> set_test = set(' ...
- 04003_CSS
1.DIV相关的技术 (1)DIV是一个html标签,一个块级元素(单独显示一行).它单独使用没有任何意义,必须结合CSS来使用,主要用于页面的布局: (2)Span是一个html标签,一个内联元素( ...
- 九度oj 题目1180:对称矩阵
题目1180:对称矩阵 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3092 解决:1607 题目描述: 输入一个N维矩阵,判断是否对称. 输入: 输入第一行包括一个数:N(1<= ...
- [NOIP2007] 提高组 洛谷P1097 统计数字
题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...
- 「CodePlus 2017 12 月赛」火锅盛宴
n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物:查询熟食中编号最小的并删除之:查询是否有编号为id的食物,如果有查询是否有编号为id的熟食, ...