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

你可能感兴趣的:(python)