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 ...
随机推荐
- 笔试算法题(01):字符串倒置 & 八皇后问题
出题:将字符串“ABCD1234efgh”进行前后对调: 分析: 常见的考查指针使用的案例,知道字符串长度之后,依次交换位置i以及位置(length-1-i)上的内容,直到重叠: 注意不能直接修改指针 ...
- 使用maven的mybatis-generator代码生成器插件生成实体类、mapper配置文件和mapper接口(使用idea)
接着之前创建的ssmMaven项目 一: 在pom文件中加入mybatis-generator插件 <plugins> <plugin> <groupId>org. ...
- 利用端口转发来访问virtualbox虚拟机centos6的jupyter notebook
1.除了在virtualbox中设置常规的端口转发外,还需要在windows上打开cmd,输入ssh -N -f -L localhost:8888:localhost:8889 -p 22 root ...
- buf.toString()
buf.toString([encoding[, start[, end]]]) encoding {String} 默认:'utf8' start {Number} 默认:0 end {Number ...
- HDU 4747 Mex【线段树上二分+扫描线】
[题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...
- c++中的三角函数
c++中想求cos或sin: 1.首先得包含头文件,include<math.h> 2.sin(),cos(),中是弧度数,即若是角度a,则应写成cou<<sin(a*pi/1 ...
- List<> 集合 删除指定行
不多说,直接上代码 public class Name { public string NameInfo { get; set; } } 删除值为Name2的行 static void Main(st ...
- 【01】什么是AJAX
什么是AJAX AJAX(异步 JavaScript 和 XML)是 synchronous(英[ˈsɪŋkrənəs]) JavaScript and XML 的简称. AJAX不是一门新的编程 ...
- 【20】AngularJS 参考手册
AngularJS 参考手册 AngularJS 指令 用到的 AngularJS 指令 : 指令 描述 解析 ng-app 定义应用程序的根元素. 指令 ng-bind 绑定 HTML 元素到应用程 ...
- Labeling Balls(poj 3687)
题意:N个球,从1-N编号,质量不同,范围1-N,无重复.给出小球间的质量关系(<), 要求给每个球贴标签,标签表示每个球的质量.按编号输出每个球的标签.如果解不唯一,按编号小的质量小排. /* ...