网络层次模型,数据包的组成是学习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基础-网络数据包结构的更多相关文章

  1. C++版的网络数据包解析策略(升级版)

    初版:http://www.cnblogs.com/wjshan0808/p/6580638.html 说明:在实现了对应的接口后该策略可以适合绝大多数的网络数据包结构 首先,是三个接口 IProdu ...

  2. TCP/IP数据包结构具体解释

    [关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构, ...

  3. Linux 中的网络数据包捕获

    Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...

  4. Linux内核中网络数据包的接收-第一部分 概念和框架

    与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协 ...

  5. TCP/IP数据包结构详解

    一般来说,网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作,但是一些特殊的情况下,就需要深入的理解网络数据包的结构,以及协议分析.如:网络监控,故障排查等…… IP包是不安全的,但是 ...

  6. sk_buff封装和解封装网络数据包的过程详解(转载)

    http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  7. linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一

    在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备:第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包, ...

  8. 用C++实现网络编程---抓取网络数据包的实现方法

    一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...

  9. UNIX网络编程——网络数据包检测

    网络数据包检测 数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成. 三种访问方式: BSD Packet Filter(BPF) SVR4 Datalink Provi ...

随机推荐

  1. docker push

    一.确保docker hub上有账号 二.确认要提交的镜像的命名空间为自己账号名称 三.在本地登录docker: docker login 四.提交镜像: docker push zhengchuzh ...

  2. 83-MACD 移动平均汇总/分离指标.(2015.7.3)

    MACD 移动平均汇总/分离指标 ~计算: · EMA(12,t)=EMA(12,t-1) * 11/13 + Close * 2/13 · EMA(26,t)=EMA(26,t-1) * 25/27 ...

  3. LeetCode(49)Group Anagrams

    题目 Given an array of strings, group anagrams together. For example, given: ["eat", "t ...

  4. The Bells are Ringing(枚举)

    Description Perhaps you all have heard the mythical story about Tower of Hanoi (The details of this ...

  5. 笔记——python风格规范

    分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Python会将 圆括号, 中括号和花括号 ...

  6. javascript倒计时代码及倒计时弹窗

    在前端开发中,难免会用到倒计时.如做的双十一活动,在距活动开始的半个月前需要做些宣传工作,需要告知用户优惠活动什么时候开始.这个时候就要用到倒计时,如在整站的某个页面提醒用户活动什么时候开始等.而在活 ...

  7. noip模拟赛 分组

    分析:暴力分挺多,也挺好想的,个人感觉两个特殊性质没什么卵用. 对于K=1,n ≤ 1024的情况,从后往前贪心地分,如果能和上一组分在一起就分在一起,否则就再开一组,这样可以保证字典序最小.ai ≤ ...

  8. 关于java对于大数处理的相关程序和用法

    <span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; l ...

  9. Minimum Depth of Binary Tree(二叉树DFS)

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  10. SHARP 加粉

    http://v.ku6.com/show/7ufwm7pqfF8D_f13IdCaag...html