首页 > 其他分享 >0224-网络层的分片

0224-网络层的分片

时间:2024-08-13 16:06:33浏览次数:5  
标签:Fragment 0224 Time 网络层 packet Flags 分片 Identification

环境

  • Time 2022-11-20
  • WSL-Ubuntu 22.04
  • Rust 1.65.0
  • pnet 0.31.0
  • tun-tap 0.1.3

前言

说明

参考:https://docs.rs/pnet/latest/pnet/index.html

目标

通过 ping 命令来认识网络层中的分片。

查看 MTU

可以看到最大的 MTU 为 1500。

root@jiangbo12490:~# ip addr show dev tun0
7: tun0: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 500
    link/none
    inet 172.24.49.244/20 scope global tun0
       valid_lft forever preferred_lft forever

不分片

其中的 t 参数指定的是生存期,I 参数指定的网卡。
s 指定的是发送数据包的大小,M do 表示禁止分片。
禁止分片的情况下,如果超出了最大的 MTU,会提示错误。

root@jiangbo12490:~# ping -t 44 -I tun0  172.24.49.106 -s 9999 -M do
PING 172.24.49.106 (172.24.49.106) from 172.24.49.244 tun0: 9999(10027) bytes of data.
ping: local error: message too long, mtu=1500
ping: local error: message too long, mtu=1500
ping: local error: message too long, mtu=1500

main.rs

use pnet::packet::ipv4::Ipv4Packet;
use tun_tap::{Iface, Mode};

fn main() -> std::io::Result<()> {
    let iface = Iface::without_packet_info("tun0", Mode::Tun)?;

    let mut buffer = vec![0; 1500];

    loop {
        let _size = iface.recv(&mut buffer)?;

        let packet = Ipv4Packet::new(&buffer).unwrap();

        if packet.get_version() == 6 {
            println!("IPv6 packet, continue");
            continue;
        }
        // 第五六个字节,分片标识
        println!("Identification: {}", packet.get_identification());
        // 第七八个字节,处理分片
        // 3 位的标志
        //  Bit 0: reserved, must be zero 第一位必须为 0
        //  可以分片还是不可以分片
        //  Bit 1: (DF) 0 = May Fragment, 1 = Don’t Fragment.
        //  是否还有其余分片还是最后一个分片
        //  Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
        // 13 位的偏移,单位是 8 字节
        println!(
            "Flags: {}, Fragment Offset: {}",
            packet.get_flags(),
            packet.get_fragment_offset()
        );

        // 第九个字节,存活周期,为 0 则不被转发
        println!("Time to Live: {}", packet.get_ttl());
    }
}

程序输出

命令中指定的 ttl 生效了。
所有的包的表示都是 54589,表示它们是同一个包,只是被分片了。
Flags 为 1 表示还有剩余的分片,不是最后一个。最后一个的 Flags 为 0。
第一个分片的偏移从 0 开始,MTU 1500,减去 20 字节的 IP 协议头。
剩下 1480 字节,所以第二个分片的偏移应该从 1480 开始算。
185 * 8 = 1480 刚刚是算出来的偏移量。

Identification: 54589
Flags: 1, Fragment Offset: 0
Time to Live: 44
Identification: 54589
Flags: 1, Fragment Offset: 185
Time to Live: 44
Identification: 54589
Flags: 1, Fragment Offset: 370
Time to Live: 44
Identification: 54589
Flags: 1, Fragment Offset: 555
Time to Live: 44
Identification: 54589
Flags: 1, Fragment Offset: 740
Time to Live: 44
Identification: 54589
Flags: 1, Fragment Offset: 925
Time to Live: 44
Identification: 54589
Flags: 0, Fragment Offset: 1110
Time to Live: 44

抓包

抓包并保存到文件:tcpdump -i tun0 -w ping.pcap,然后通过 Wireshark 打开。

ping 分片

可以看到分片和重组的信息,其中 Wireshark 的显示偏移是计算后的,不是报文中原始内容。

总结

了解了网络层的分片,分片从网络层开始算,不包含链路层的物理地址和类型。

附录

标签:Fragment,0224,Time,网络层,packet,Flags,分片,Identification
From: https://www.cnblogs.com/jiangbo4444/p/18357134

相关文章

  • 使用ansible安装mongodb分片集群
    【说明】使用ansible安装一个分片集群,三台服务器,三个mongos,三个config,三个分片节点,每三个分片有三个副本(每个节点运行三个端口的mongod)  [mongo_servers]10.x.x.21ansible_user=rootansible_ssh_pass=xxxxxxxxcluster_role=mongo1......
  • 【Linux】网络架构探秘:网络层功能、IP协议详解及路由过程指南
    文章目录前言:1.网络层是干什么的?2.IP协议2.1理论铺垫2.2IP协议的头格式2.3网段划分(重点)2.3.1分类划分法:2.3.2子网掩码:2.3.3为什么要经行子网划分?2.4特殊的IP地址2.5IP地址的数量限制2.6私有IP地址和公网IP地址3.路由过程总结:前言:在当今数字化时代......
  • Linux网络:网络层IP协议(一)
    目录一、网络层与IP协议基本概念1.1IP协议构成1.2网段划分1.3DHCP一、网络层与IP协议基本概念 在详细了解网络层之前我们需要先引入一些基本概念:主机:配置有IP地址,但不进行路由控制的设备,这里的主机就是我们的一台台电脑;路由器:即配置有IP地址,又能进行......
  • 计算机网络--网络层串讲
    笔记整理自学习开源文档:小林coding为什么要做这个串讲?因为我在学习408网络层的时候,看完机构的视频课感觉没有很好地将知识串联起来,便找到《图解网络》作为补充,且小林的讲解是我认为开源中较为通俗易懂的,因此我在学习过程中将精华部分记录下来加上自己的理解并录制这个串讲......
  • 网络层IP协议,网段划分,NAT转换
    网络层IP协议1.IP协议的基本认识2.IP协议如何进主机定位和报文转发3.IP分片和组装4.IP协议报头格式5.网段划分如何进行网段划分(子网,公网)分类划分法子网掩码特殊的IP地址6.私有IP地址和公网IP地址7.IP地址数量限制问题8.NAT网络地址转换机制NAT简介工作原理......
  • 计算机网络第四讲 网络层
    计算机网络第四讲网络层第一节:网络层概述1.网络层概述2.网际协议IP3.小结第二节:IP地址\(\bigstar\bigstar\bigstar\bigstar\bigstar\)1.IP地址2.基本分类IP地址特殊IP全零:本,作为源地址全1:全网广播,作为目的地址网络号:127作为本地换回测试3.......
  • mongodb数据库范围分片数据分布不均匀
    【说明】当前使用mongodb分片,三个分片mongos>sh.status()---ShardingStatus---shardingversion:{"_id":1,"minCompatibleVersion":5,"currentVersion":6,"clusterId":ObjectId(&quo......
  • vue-simple-uploader 支持分片上传,多文件上传,断点续传等多种功能的文件上传组件
    vue-simple-uploader特性:1、支持文件、多文件、文件夹上传2、支持拖拽文件、文件夹上传3、统一对待文件和文件夹,方便操作管理4、可暂停、继续上传5、错误处理6、支持“快传”,通过文件判断服务端是否已存在从而实现“快传”7、上传队列管理,支持最大并发上传8、分块上传9、......
  • 【最强八股文 -- 计算机网络 】网络层协议简单图解:ARP、RARP、DHCP、NAT、ICMP、IGMP
    网络层协议图解ARP(AddressResolutionProtocol):将已知`IP`地址转换为`MAC`地址RARP(ReverseAddressResolutionProtocol):将已知`MAC`地址转换为`IP`地址DHCP(DynamicHostConfigurationProtocol):动态获取`IP`地址NAT(NetworkAddressTranslat......
  • 网络层
                                          ......