精华内容
下载资源
问答
  • 在网络通信中如果发送的IP包超过MTU...判断数据包是不是分片包是在DecedeIPV4这个函数中做的,具体位置是在 数据包解析模块->DecodeEthernet->DecedeIPV4在DecedeIPV4这个函数中有如下一段代码: /* If a fragment, pa

    在网络通信中如果发送的IP包超过MTU值就会将IP包拆分成多个包发送。那么在suricata中对于这种拆分开得IP包又是如何处理的呢?下面我们一步一步来分析。

    判断数据包是不是分片包是在DecedeIPV4这个函数中做的,具体位置是在
    数据包解析模块->DecodeEthernet->DecedeIPV4

    在DecedeIPV4这个函数中有如下一段代码:

        /* If a fragment, pass off for re-assembly. */
        if (unlikely(IPV4_GET_IPOFFSET(p) > 0 || IPV4_GET_MF(p) == 1)) {
            Packet *rp = Defrag(tv, dtv, p, pq); 
            if (rp != NULL) {
                PacketEnqueue(pq, rp); 
            }    
            p->flags |= PKT_IS_FRAGMENT;
            return TM_ECODE_OK;
        } 

    这就是专门用来处理IP分片数据包的了。
    IPV4_GET_IPOFFSET(p) > 0 是判断p中的偏移是否大于0(除第一个分片包的offset为0外其余的offset都会大于0)。
    IPV4_GET_MF(p) == 1 是判断p中的mf标志是否为1 (除最后一个分片包mf为0外其余的mf都为1)。
    用逻辑或来判断,保证了只要是分片包就会进入分片处理的逻辑。

    主要的逻辑处里都在Defrag函数中:

        /* return a locked tracker or NULL */
        tracker = DefragGetTracker(tv, dtv, p);
        if (tracker == NULL)
            return NULL;
    
        Packet *rp = DefragInsertFrag(tv, dtv, tracker, p, pq); 

    tracker为申请的一块内存,我理解是用来存放分片包的,tracker里面会保存一个原始IP包的所有分片,直到这些分片被重组成功。
    DefragInsertFrag这个函数将新收到的p插入刚刚得到的tracker,如果p是最后一个分片,那么会返回一个重组后的packet结构的指针rp,否则返回NULL。

    DefragInsertFrag函数的最下方有针对最后一个分片的处理

        if (!more_frags) {
            tracker->seen_last = 1;
        }
    
        if (tracker->seen_last) {
            if (tracker->af == AF_INET) {
                r = Defrag4Reassemble(tv, tracker, p);
                if (r != NULL && tv != NULL && dtv != NULL) {
                    StatsIncr(tv, dtv->counter_defrag_ipv4_reassembled);
                    if (pq && DecodeIPV4(tv, dtv, r, (void *)r->ip4h,
                                   IPV4_GET_IPLEN(r), pq) != TM_ECODE_OK) {
    
                        UNSET_TUNNEL_PKT(r);
                        r->root = NULL;
                        TmqhOutputPacketpool(tv, r);
                        r = NULL;
                    } else {
                        PacketDefragPktSetupParent(p);
                    }
                }
            }
            else if (tracker->af == AF_INET6) {
                r = Defrag6Reassemble(tv, tracker, p);
                if (r != NULL && tv != NULL && dtv != NULL) {
                    StatsIncr(tv, dtv->counter_defrag_ipv6_reassembled);
                    if (pq && DecodeIPV6(tv, dtv, r, (uint8_t *)r->ip6h,
                                   IPV6_GET_PLEN(r) + IPV6_HEADER_LEN,
                                   pq) != TM_ECODE_OK) {
    
                        UNSET_TUNNEL_PKT(r);
                        r->root = NULL;
                        TmqhOutputPacketpool(tv, r);
                        r = NULL;
                    } else {
                        PacketDefragPktSetupParent(p);
                    }
                }
            }
        }

    more_frags获取的是p的mf的值。
    我们这里只看IPV4的处理,V6的逻辑一样。
    Defrag4Reassemble重组了tracker中与p的identify相同的所有分片,并返回一个重组后的包rp
    调用DecodeIPV4,传入rp,重走一遍没有分包的正常逻辑。

    总结:
    suricata会在分片数据包被重组完成后才会调用后续的处理流程解传输层的头信息。包重组实在receive线程完成的,这一过程对后续的worker线程是透明的。

    展开全文
  • 如何区分ip packet 是否分片

    千次阅读 2012-09-26 10:54:11
    编程实现判断ip数据包是否分片,以及各种fragment 的类型。 uint16_t offset= ntoh16(iphdr->offset); bool df= offset&IP_DF != 0; bool mf= offset&IP_MF != 0; offset &= IP_OFFMASK; bool is_fragment= ...

    编程实现判断ip数据包是否分片,以及各种fragment 的类型。

    	uint16_t offset= ntoh16(iphdr->offset);
    	bool df= offset&IP_DF != 0;
    	bool mf= offset&IP_MF != 0;
    	offset &= IP_OFFMASK;
    
    	bool is_fragment= true;
    	if(mf)
    	{
    		if(offset== 0) //first.
    		{
    		}
    		else //middle.
    		{
    		}
    	}
    	else
    	{
    		if(offset== 0) //complete.
    		{
    			is_fragment= false;
    		}
    		else //last
    		{
    		}
    	}
    


    展开全文
  •  就是在数据传送时,如果说数据的长度大于设定的MTU长度的话,路由器就要将其进行相应的分片操作,(关于具体的如何分片,以及如何重组可以自己查相关资料)以便让其通过路由进行传送。如下图所示,一个具有4000...

          这是IP数据包格式相关的东西。

          首先来看一下IP数据包的格式:

    IP包

     

    关于其中的一个名词大家可以去网上查,这里只是相应的介绍关于分片的部分。

          就是在数据传送时,如果说数据的长度大于设定的MTU长度的话,路由器就要将其进行相应的分片操作,(关于具体的如何分片,以及如何重组可以自己查相关资料)以便让其通过路由进行传送。

    如下图所示,一个具有4000字节的数据报,当MTU=1420字节的时候,被划分为3个分片,每个分片长度为1400字节,1400字节是可以被8整除的。

    分割

     

    为减少分片的数量,每个分片的长度应尽可能大。为用片偏移表示片段的起始位置,除最后一个分片外,其它分片的长度(数据部分,不包括IP)应能被8整除。如MTU=505的时候,除去20字节IP头,可以传输的最大数据段长度为485字节,但可被8整除及不不超过485的最大整数为480,需要按480来进行分片。

     

    你可以自己检查一下路由器中的MTU设置。也可以查一下如何在电脑上设置MTU百度MTU

          关于分片攻击的说法也是我在网上找到的,贴出来大家共同讨论。

    分片攻击

      这种攻击的原理是:在IP的分片包中,所有的分片包用一个分片偏移字段标志分片包的顺序,但是,只有第一个分片包含有TCP端口号的信息。当IP分片包通过分组过滤防火墙时,防火墙只根据第一个分片包的Tcp信息判断是否允许通过,而其他后续的分片不作防火墙检测,直接让它们通过。

    这样,攻击者就可以通过先发送第一个合法的IP分片,骗过防火墙的检测,接着封装了恶意数据的后续分片包就可以直接穿透防火墙,直接到达内部网络主机,从而威胁网络和主机的安全。

     

    关于这种说法的验证要了解相关的防火墙的过滤原理,还有IP包的头部信息。

    查看新博客

    展开全文
  • (1)ip头部信息:ip头部信息出现在每个ip报文数据报中,用于指定ip通信的远端ip地址,目的端ip地址,指导ip分片和重组,以及部分的通信行为。 (2)ip数据报的路由和转发:ip数据报文的路由和转发发生在除目标机器...

    IP协议是TCP/IP协议族中至关重要的协议,同时也是socker网络编程的基础之一。其中最重要的部分为

    (1)ip头部信息:ip头部信息出现在每个ip报文数据报中,用于指定ip通信的远端ip地址,目的端ip地址,指导ip分片和重组,以及部分的通信行为。

    (2)ip数据报的路由和转发:ip数据报文的路由和转发发生在除目标机器之外的所有主机和路由器上。他们决定数据包是否应该转发以及如何转发。

    1.IP服务特点

    ip协议是TCP/IP协议族的动力,为上层协议提供无状态,无连接,不可靠的服务。

    无状态:指的是IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送,传输和接收都是相互独立,没有上下文关系的。这种服务最大缺点就是无法处理重复,乱序的这些情况。乱序:是第n个数据报比第n+1个后到接收端;重复:是同一个数据报通过不同路径多次到达接收端。这些情况ip端无法进行检测,因为这些数据之间没有上下文关系。接收端的iP模块只要接受的完整的IP数据报就将它交给传输层,所以上层协议的角度看这些数据就可能是乱序的,重复的。对于面向连接的协议比如说TCP协议可以自己处理乱序和重复的问题,然后经过TCP协议处理的数据交给上层肯定是有序的,正确的。但无状态也是有优点的:简单,高效。我们不需要为保持通信的状态而分配一些内核资源,也不需要传输数据时携带状态信息。

    无连接:IP通信双方都不长久地维持对方仍和信息。所以每次发送数据的时候都必须指定对方的IP地址。

    不可靠:IP协议不能保证IP数据报准确的到达接收端,它只是尽可能的保证发送过去,,很多时候可能导致IP数据报发送失败,比如某个中转路由器发现IP数据报在网络存活时间太长就将其丢弃,并返回一个ICMP错误信息给发送端,接收端发现IP数据报不正确也会将其丢弃同时返回一个ICMP错误信息。无论是什么情况,发送端的iP模块检测到错误不会进行重传只会告诉传输层,传输层的协议比如TCP会自己实现数据确认,超时重传达到可靠的目的。

    2.IPV4头部结构(长度通常为20字节)

                 

    4位版本号:一般为4,代表着ipv4

    4位头部长度:标识头部有多少字节

    8位服务类型:包括3位优先字段(忽略),4位TOS字段:最小延时,最大吞吐量,最高可靠性,最小费用。这四个中最多只能把一个置为1。比如远程登录就要最小延时,文件传输就要最大吞吐量。

    16位总长度:代表整个IP数据报的长度,以字节位单位,16位的最大长度就是2^16-1字节,但是一般都达不到,因为被MTU(最大传输单元)限制。超过MTU的就要分片传输处理,所以接下来就要说如何分片了。

    16位标识:唯一标识主机发送的数据报,初始值由系统给定,随后每发一个数据报值就加1,当进行数据报分片时,属于同一个数据报的标识值就相同。

    3位标志:第一位字段保留,第二位代表禁止分片,如果设置了这个位那么IP模块就不会对数据报进行分片,如果这时候超过MTU的话IP模块就丢弃这个数据报并返回一个ICMP查重报文。第三位表示更多分片,就是在分片时除了最后一个分片外其余所有分片置为1。

    13位片位移:相对于原始IP数据报开始处偏移,原始的偏移值为0,接下来每一个偏移值是上一个数据报的长度。

    8位生成时间:数据到达目的地运行通过路由器的最大跳数,一般是64,每通过一次路由器该值减一,当值位0时将数据丢弃代表陷入了路由循环。

    8位协议:区分传输层协议,ICMP是1,TCP是6,UDP是17。

    16位头部校验和:发送端进行填充,接收方通过CRC算法检验头部是否被损坏。

    32位源端ip和目的ip就没什么说的了,大家都懂。

    后面还有可变长的可选信息,一般不用,最多占40字节。

    下图是抓包得到了头部信息,大家注意看黄线部分的解读。

               

    这是黄线部分的解读:

              

    3.关于IP分片

    前面说当数据报的长度超过MTU(最大传输单元)就会进行分片传输,分片可能发布在发送端,也可能发生在中间路由器,可能过程中多次被分片,但只有在到达目的后才进行重组,重组完成以后才会交给上层协议。

    上边也说了:数据报标识,标志,位偏移都是为了分片而设计的。一个数据报的每个分片都有自己的IP头部,同属于一个数据报的分片具有相同的标识,但是为偏移不同,同时除了最后一个分片外,其它分片都设置了MF标志。此外每个分片IP头部总长度设置为该分片的长度。

    以太网帧的MTU(最大传输单元)是1500字节(netstat和ifconfig可以查询),但是头部长20字节(不附加的情况),所以数据长度最长就是1480字节。所以如果现在有一个长度为1481字节的ICMP数据文,超过了1480所以就要进行分片。第一个分片就是1500字节(20字节IP报头,1480的数据部分,在这1480里的数据部分中包含:8字节的ICMP报头和1472字节的数据)同时在IP头部设置MF标识,代表后续还有分片;第二个IP长度为21字节(20字节的IP的报头,1字节的数据部分,不设置ICMP头部,因为重组的时候不需要重复的ICMP头部信息),同时不设置MF标识,因为是最后一个分片了。

    大家认真看上段话和下面这幅图进行对应:

                

    最后IP层传递给数据链路层的数据可能是一个完整的IP数据报,也可能是IP分片。统称为IP分组。

    4.IP路由

    IP协议的一个核心任务就是数据报的路由,就是发送数据报到目标机器的路径。大家可以先看下面的模块来理解IP模块的工作流程。

                                    

    过程是这样的:IP数据报先进入IP输入队列进行CRC校验看是否数据报是否受损。确认以后开始处理头部信息,如果IP数据报头部的目标IP是本机的某个IP地址,那么就代表该数据报是发往本机的,则IP模块就根据数据报的头部协议字段看是TCP还是UDP还是ICMP,然后交给上层处理。如果发现这个数据报不是发给本机的,则调用数据报转发模块进行数据转发。一般来说主机只进行发送和接收,路由才能进行转发服务。我们也可以通过修改主机中的参数让主机具备转发功能(/proc/sys/net/ipv4/ip_forward设置为1)。言归正传,到了数据报转发模块检测当前主机是否允许转发,不允许就直接丢弃,允许转发那就进行如下操作:

    1.检查数据报头部的TTL值,如果TTL值已经是0,那就丢弃数据报(说明陷入路由循环)。

    2.查看数据报的严格路由选项是否被设置(设置以后就必须到那个指定路由器),然后看当前主机是否是被指定的路由器,如果不是那就发送一个ICMP选路失败报文给发送端。

    3.将TTL值减1;

    4.处理IP头部选项。

    5.有必要的话执行分片。

    通过数据报转发模块以后就进入了路由模块,因为要转发到下一个路由器,总不能就必须有所依据不能想发哪就发哪吧。这个依据就是路由表,也是IP模块的核心数据结构。这个表按照数据报的IP地址进行分类,同一类型的IP数据报将被发往相同的下一跳路由器。这个路由模块不仅会转发,还要执行本机上的数据发送。

    要说路由机制那就先要理解路由表,我们通常使用route或者netstat命令查看路由表。

    在表2-2中,第一行的目标地址是default,就是默认路由项,后面flag中包含了G代表下一跳是网关。网关的存在支持用户使用因特网。

    第二行中目标地址是192.168.1.0,网关地址是 * ,代表是本地局域网内,说明数据报不需要路由中转,可以直接发送到目标机器。

    那么核心问题来了:现在根据IP数据报的头部知道了目标的IP地址,现在匹配路由表中的哪一项呢?这就是常说的IP路由机制

    (1)查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到那就使用该路由项。没找到就看下一项。

    (2)查找路由表中和数据报的目标IP地址具有相同网路的IP地址(就比如192.168.1.1和192.168.1.0就是相同网路)。如果找到

    就使用,没找到就看下一项。

    (3)选择默认路由项,意味着发送到了网关。

    关于路由还有一个核心就是路由表更新

    路由表必须能够更新,这样IP模块才能准确高效准发数据报。路由表更新分为静态更新和动态更新。静态更新就是人为手动更新,动态更新就是通过BGP,RIP,OSPF等协议发现路径并且更新自己的路由表。现在就稍微说一下静态更新路由表

                                  

    第一行就是增加了一个主机

    第二行就是删除网络号为192.168.1.0,子网掩码是255.255.255.0的主机

    第三行删除默认路由。//删除了就无法访问因特网,因为下一跳是网关

    第四行就是把192.168.1.109设置为默认路由项,但网关不是可以直接访问因特网的路由器。

    路由器这部分在面试的时候基本不怎么被问到,所以大致了解就好。

    以上就是IP模块的全部内容。欢迎大家指正。

    展开全文
  • 本文主要内容:在接收数据包时,IP协议的处理流程。 内核版本:2.6.37 ...在ip_local_deliver()中,如果发现数据报有被分片,则进行组装。 然后调用NF_INET_LOCAL_IN处的钩子函数,如果数据包被钩子函数放行
  • 前言:IP分片和重组是一种很影响效率的无奈之举,应该尽量避免形成分片包。在TCP中,已经自己限定了MSS,默认是536字节,不会形成IP分片。所以值得注意的就是UDP包和ICMP,他们并未对此作出限定,因此,在发送...
  • 相关的数据包经过ASA防火墙的时候,ASA可以对这些数据包进行监控,在监测到与ASA定义的合法流量规则有违时,它就会把这些数据过滤掉,那么如果一个IP数据报文存在分片它又是如何处理的呢?首先我们来简单说说分片的...
  • 当数据报经过N个不同类型的网络后会因其MTU不足够大 而无法将整个数据报传过去。所以将数据报分段 到达...ip数据包包头内部有一个16位的标识来区分每一个ip数据包,同时3位的标志位中有一位来表示“更多分片”, 也就
  • IPv4之分片重组(二)

    2020-01-05 13:34:37
    继上一篇IPv4之接收过程中的分片重组(一),这篇笔记从整体上看linux是如何进行IP片段重组的。 在接收路径上的ip_local_deliver()函数中,此时已经确认数据包是给本机的,会首先调用ip_defrag()判断是否是一个完整的...
  • TCP/IP网络层

    2015-10-25 16:19:23
    IP数据包的格式?IP数据包传输的过程?为什么需要ARP协议?ARP协议通信过程是怎么样的?(ARP协议如何控制网络?)数据包的最大值?(分片的地方?分片重组的地方?分片的原则?)数据包在局域网内怎么从一台主机...
  • TCP/IP网络层(转)

    千次阅读 2013-10-17 08:58:59
    IP数据包的格式?IP数据包传输的过程?为什么需要ARP协议?ARP协议通信过程是怎么样的?(ARP协议如何控制网络?)数据包的最大值?(分片的地方?分片重组的地方?分片的原则?)数据包在局域网内怎么从一台主机...
  • 初步学习IP协议

    2019-07-19 18:21:53
    IP协议(Internet protocol)是网络层最核心的协议,IP协议根据数据包的目的IP来决定如何...虽然IP报头有16位的标识可以唯一的标识数据报,但它被用来处理IP分片。当然无服务的优点是 高效 简单。无需为保持通信而分...
  • 文章目录IP协议--网络层07IP简介IP的包头结构分片TTL生存时间 IP Internet Protocol,因特网协议 简介 网络层位于数据链路层与传输层之间。网络层中包含了许多协议,其中最为重要的协议就是IP协议。网络层提供了IP...
  • 任务02 员工宿舍网络规划任务说明任务要求知识点操作平台任务探索计算机网络计算机网络分类通信协议IP地址什么是IP地址IPV4和IPV6是什么IPV4数据结构公有IP和私有IP路由控制IP数据包分片与重组子网为什么要划分...
  • VoIP:IP语音技术

    2011-04-06 14:15:12
    12.1.2 分片操作 153 12.2 业务复用 153 12.3 VoFR 154 12.3.1 数字拨号服务 155 12.3.2 传真传输 156 12.3.3 VoFR封装 157 12.4 ATM语音网络技术 158 12.5 VoFR和VoATM是VoIP的伙伴还是 竞争者 160 12.5.1 谁位于...
  • CCNA查漏补缺V1.0

    2018-11-18 16:45:33
    解析:TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,经过的每个路由器至少将TTL值减少1。TTL值的主要作用是避免IP包在网络中的无限循环和收发,节省了网络资源,并能使IP包的发送者能收到...
  • tcpip协议 之三

    千次阅读 2008-09-02 20:48:00
    分片原因:物理网络都存在最大的传输单元限制,也就是MTU限制,IP报文较大时,无法将一个IP数据包封装在一个物理帧中。因此需要将IP数据拆分成多个报文,多次发送出去。以太网的MTU一般为1500个字节(去掉物理网络的...
  • OSI七层模型

    千次阅读 2019-05-16 14:25:00
    文章目录OSI七层模型详解:OSI七层模型简介:OSI-物理层详解:OSI-数据链路层详解:OSI-网络层详解:IP地址的定义:路由表的工作原理:路由环路IP报文格式报文分片的原因:报文分片的过程:报文重组的过程:ARP协议+...
  • 2. Openflow只有两个属性需要控制器配置,第一个为flags,用来告诉交换机如何处理IP分片数据包,第二个属性为miss_send_len,是当交换机无法处理数据包时发送给控制器的最大长度。 3. Packet_in产生的两个原因:1...
  • 端口扫描绕过实践

    2019-09-25 20:49:26
    0x00 前言 在一次自己做的检测爆破和CC攻击的工具中,感觉纰漏有很多,再次想到了安全狗是如何做防御的,尝试地去绕过安全狗。也去使用学到的TCP/IP知识去实践...后来想到使用分片,看看安全狗是否会对分片数据包...
  • 数据帧和网络编址

    2016-04-30 12:39:19
    3、分片是指数据包超过一定长度时,需要被划分成不同 的片段使其能够在网络中传输。4、IP报文头部长度为20到60字节,报文头中的信息可以用来指导网络设备 如何将报文从源设备发送到目的设备。5、其中
  • 网络层主要完成路由选择的问题,这个层主要的协议是IP协议,这个协议主要作用是封装IP地址(数据转发的基础)和对数据包进行分片(不同的局域网有MTU的设置);路由选择分两种,域内与域间(这是就像是国内和国外...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

ip数据包如何分片