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 ...
随机推荐
- Python:socket实现ftp程序
刚开始学习socket编程,还不是特熟练,码了好长时间,中间遇到许多问题,记录一下用socketserver写ftp server端: #!/usr/bin/env python import soc ...
- Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(arrayBuffer[, byteOffset[, length]]) arrayBuffer - 一个 TypedArray 或 new ArrayBuffer() 的 . ...
- html页面加载初始化方法
js: 方法一: window.onload=function(){内容} 方法二(自己定义方法): function onload(){内容} onload(); jQuery: 方法一: $(do ...
- PHP:Mysql判断KEY是否存在 如果存在走修改 如果不存在走添加
文章来源:http://www.cnblogs.com/hello-tl/p/7738113.html 0.PHP代码 <?php /** * POST 传参 * * 例子 添加修改 使用同一个 ...
- 杭电 1009 FatMouse' Trade (贪心)
Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...
- 集训第四周(高效算法设计)D题 (区间覆盖问题)
原题 UVA10020 :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19688 经典的贪心问题,区间上贪心当然是右区间越 ...
- 分数拆分(刘汝佳紫书P183)
枚举,由已知条件推得y大于k,小于等于2K AC代码: #include"iostream"#include"cstring"using namespace s ...
- postman工具的应用实战(二)
在接口测试工具中,最好的应该是soapui,jmeter,postman,但是soapui需要安装和破解,当然也是有破解版的,但是不够灵活,jmeter工具 做接口测试还是性能测试,功能测试,都是一个 ...
- 【转】Java的path,classpath,java_home环境变量的配置与具体含义
对于一个Java初学者来说,第一步要做的是安装jdk并配置环境变量,一般按照书上或者网上的步骤,一步步照着做就行了,但是对于初学者来说,很多问题没有解决,比如为什么很多配置方法各不相同,却都能够配置成 ...
- 南邮CTF密码学,mixed_base64
# -*- coding:utf-8 -*- from base64 import * flag = open("code.txt").readline() # 读取密文 for ...