scapy基础-网络数据包结构

本文介绍网络层次模型及各层的功能,并详细解析EthernetII和IP数据包的结构,帮助理解Scapy等网络工具的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  网络层次模型,数据包的组成是学习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 byte6 byte2 byte46~1500 byte4 byte

目标地址:此数据包的目标MAC地址。
源地址:此数据包的源MAC地址。
协议类型:上层协议,表示网络层使用的协议。(0x0800表示网络层使用的是IP协议)
数据:高层协议、数据和填充符,范围在46~1500字节。(如果数据长小于46字节,则要求“填充”,以使这个数据的长度达到46字节)
FCS:数据帧校验序列,用于确定数据包在传输过程中是否损坏。
参考:https://en.wikipedia.org/wiki/Ethernet_frame#Ethernet_II

 3.IP数据包

Offsets0123
0Version(4bit)IHL(4bit)DSCP(6bit)ECN(2bit)Total Length(16bit)
4Identification(16bit)Flags(3bit)Fragment Offset(13bit)
8Time To Live(8bit)Protocol(8bit)Header Checksum(16bit)
12Source IP Address(32bit)
16Destination IP Address(32bit)
20Options(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值