精华内容
下载资源
问答
  • 有时希望网卡不做cpu减压处理,希望能够,禁用TCP offload engine ethtool --offload ethX rx off tx off

    有时希望网卡不做cpu减压处理,希望能够,禁用TCP offload engine

    ethtool --offload  ethX  rx off  tx off

     

    展开全文
  • 众所周知,网络数据包的传输是受到...现在linux的实现中,充分利用了硬件网卡的校验功能,对数据包延迟分片,提升性能。本章主要介绍linux内核中的这个技术,并重点介绍了offload软分片技术。分别对应TCP,UDP这两个...

    众所周知,网络数据包的传输是受到链路的MTU限制的。传统的TCP/IP协议中,IP层会根据PMTU(Path MTU)对数据包进行分片,并投递到链路上,最终发到目的地。目的地收到分片后,再组合成一个完整的数据包。现在linux的实现中,充分利用了硬件网卡的校验功能,对数据包延迟分片,提升性能。本章主要介绍linux内核中的这个技术,并重点介绍了offload软分片技术。分别对应TCP,UDP这两个传输层协议来介绍TSO(Tcp Segmentation Offload),UFO(Udp Fragmentation Offload)。最后给出实验数据,说明这个特性的优势。

    IP分片

    IP头部的定义见表1。分片的技术就是利用了IP头部中的认证,标志,和段偏移量这3个字段来完成的。属于同一个包的所有分片,认证字段必须是相同的。段偏移量则记录了该分片在原始包中的位置。这些字段在重组的时候也是必要要用到的。至于如何分片的不再讨论范围。

    图1给出了IP分片后的效果。

    网卡分片

    高速网卡设备(千兆网卡以上)不仅可以自动的计算数据包的校验和,而且可以根据不同的协议自动的对数据包进行分片。由于MTU的限制,原先只能通过IP协议对大的数据包进行分片,现在网卡设备硬件本身就可以分片,并自动计算出校验和。同时,在接收处理方面,也有一些智能的功能,比如可以硬件确认数据包的校验和是否正确,可以接收大的数据包。

    通过ethtool命令,可以看到网卡所支持的特性,例如:david@david-Lenovo:~$ ethtool -k eth0

    Offload parameters for eth0:

    rx-checksumming: on

    tx-checksumming: on

    scatter-gather: on

    tcp-segmentation-offload: on

    udp-fragmentation-offload: off

    generic-segmentation-offload: on

    generic-receive-offload: on

    large-receive-offload: off

    rx-vlan-offload: on

    tx-vlan-offload: on

    ntuple-filters: off

    receive-hashing: on

    在发送处理方面,提供了tcp-segmentation-offload(TSO),udp-fragmentation-offload(UFO,generic-segmentation-offload(GSO)这3个特性。

    UFO是专门针对UDP协议的,使用了这个特性,用户层就可以发送大的数据包(最大长度是64K),而不需要由IP协议来分片。 UFO与TSO,GSO没有任何的联系,但是却需要tx-checksumming,scatter-gather这两个特性的支持。遗憾的是,现在还没有看到有网卡支持UFO。所以,默认情况下,该功能的状态是off。当前UFO被应用在虚拟设备(比如虚拟的bridge设备,bond设备)上。

    TSO是专门针对TCP协议,DCCP[1]协议的,与UFO一样,使用了这个特性,用户层就可以发送大的数据包。TSO的启用不需要GSO的支持,但是却需要tx-checksumming,scatter-gather这两个特性的支持。

    当前的网卡更多的是针对TCP协议进行功能强化,当前的网卡只支持TSO,而不支持UFO。这3个特性中只有TSO是纯硬件的功能。

    这个分片和IP分片相比有如下的优势:硬件分片,速度更快;

    每个分片后的包是一个单独的TCP包,即每个分片包都包含TCP头部。

    且IP头部不包含任何的与分片相关的值。避免了分片包的丢失,而导致所有的分片

    包被重传。

    对于接收端而言,则省去了重组分片的工作。减轻了接收端的工作负荷。

    减少了sk_buff(内核使用这个来管理数据包)的使用,并降低了CPU的使用率。从tcpdump捕获的数据包中可以看出TSO启用后的效果。一个数据包可以包含11824个字节,远远超过MTU。

    Offload软分片

    GSO(generic-segmentation-offload)选项则提供了另一种类型的分片,我们把这种技术叫做offlaod软分片。其原理是:在数据包发往网卡驱动之前,对大数据包进行分片,分片完成后则将一个个分片包分发给网卡,最终发送到链路上。GSO能够支持更多的传输层协议,并且对IPv6也有支持。对于TCP报文而言,软分片后的TCP报文中的IP头部是不包含分片信息的;但软分片后的UDP报文中的IP头部是包含分片信息的。

    Offload软分片技术也应用在虚拟化技术中。虚拟技术中更多的是使用虚拟网桥设备来联系host主机和guest主机。网桥设备默认是开启UFO/TSO的。虚拟设备中不会依赖真实设备的offload特性,自己也是可以提供offload功能的,效果类似于网卡的分片。而真实网卡是不支持UFO的,这时就会用软分片技术对报文进行分片。

    对于TCP协议而言,Offload分片在使用虚拟设备传输数据时的处理流程如图3。 分片的时机见图3中的Soft Segment。

    图3中,用户层发送的数据大小是64K。虚拟设备桥设备中,启用了TSO功能。而最底层的网卡设备eth1没有启用TSO。则在发送到网卡驱动程序之前,会对大包进行分片,即图中的[Soft Segment]。如果最底层的网卡设备eth1启用TSO,则不需要[Soft Segment]这个操作,而是由网卡本身对数据包进行分片。对于UFO而言,与TSO处理相同,由于现在没有网卡支持UFO,所以肯定是要执行软分片的。

    Q&A

    1. 问:怎么查看我的网卡是百兆网卡还是千兆网卡?

    答:Ethtool命令可以查看。

    # ethtool eth0

    .....

    Speed: 1000Mb/s

    ......

    2. 问:我的网卡是否支持TSO?

    答:执行ethtool命令,如果tcp-segmentation-offload显示on则支持,否则不支持。

    # ethtool -k eth0

    Offload parameters for eth0:

    ......

    tcp-segmentation-offload: on

    3. 问:如何关闭TSO选项。

    答:执行ethtool命令。

    # ethtool -K eth0 tso off

    # ethtool -K eth0 gso off(这个是必须的。因为tlinux上只要tso,gso任何一个是on,则内核就认为)

    4. 问:如何启用TSO选项。

    答:执行ethtool命令。

    # ethtool -K eth0 tso on

    (完)

    展开全文
  • 上次分析了ip分片重组,这次分析一下ip分片。首先我们要先了解为什么需要分片。比如在以太网中,使用CSMA/CD协议(由网卡实现),他规定了一个链路层数据包(不包括mac头,但是这一版内核实现的时候是包括了mac头的...

    上次分析了ip分片重组,这次分析一下ip分片。首先我们要先了解为什么需要分片。比如在以太网中,使用CSMA/CD协议(由网卡实现),他规定了一个链路层数据包(不包括mac头,但是这一版内核实现的时候是包括了mac头的大小)的最大值(MTU)和最小值。所以如果上层的包大于这个阈值就需要被分片。而分片和组包的实现是在ip层。我们看一下具体的逻辑。ip分片的逻辑在ip_fragment函数里实现。

    void ip_fragment(
    	struct sock *sk, 
    	struct sk_buff *skb, 
    	struct device *dev, 
    	int is_frag
    )
    

    定义的一些变量。

    	struct iphdr *iph;
    	unsigned char *raw;
    	unsigned char *ptr;
    	struct sk_buff *skb2;
    	int left, mtu, hlen, len;
    	int offset;
    	unsigned long flags;
    	// mac首地址
    	raw = skb->data;
    	// ip头首地址,hard_header_len为mac头大小
    	iph = (struct iphdr *) (raw + dev->hard_header_len);
    	skb->ip_hdr = iph;
    	// ip头的大小,不包括数据部分
    	hlen = (iph->ihl * sizeof(unsigned long));
    	// ip包总大小减去ip层等于ip报文的数据长度,即需要分片的部分的大小
    	left = ntohs(iph->tot_len) - hlen;	
    	// ip头+mac头
    	hlen += dev->hard_header_len;	
    	// 每个分片的数据部分长度等于mac层的mtu减去mac头和ip头,即mac层的mtu包括了mac头、ip头、ip数据部分的总和。
    	mtu = (dev->mtu - hlen);		
    	// 数据部分首地址
    	ptr = (raw + hlen);		
    

    判断是否可以分片。

    	// 设置了不能分片则发送icmp报文,可以对照ip报文格式看
    	if (ntohs(iph->frag_off) & IP_DF)
    	{
    		icmp_send(skb,ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, dev->mtu, dev);
    		return;
    	}
    
    

    判断即将被分片的ip包是否本身也是一个分片。即经过了多次ip分片。

    /*
    	该ip报文本身就是一个分片,现在需要进行再次分片,
    	偏移的首地址是该报文的首地址乘以8,因为再次被分片的报文,他的偏移是
    	基于原来未被分片的数据的偏移。而不是针对当前这个分片的偏移
    */
    	if (is_frag & 2)
    		offset = (ntohs(iph->frag_off) & 0x1fff) << 3;
    	else
    		offset = 0
    

    开始处理分片。

    	// 还有则继续处理
    	while(left > 0)
    	{	
    		// ip包默认承载的字节数,但是如果大于mtu的话则取小的值,即mtu
    		len = left;
    		// 大于mtu则还要分片,即只能承载mtu大小的字节,否则就是最后一个分片
    		if (len > mtu)
    			len = mtu;
    		/*
    			剩下的字节比mtu大的时候下面的判断会成立,
    			即剩下的字节还不能在这次发送完,还要继续分片
    			除8乘8即取8的倍数大小,不一定等于mtu 
    		*/
    		if (len < left)
    		{
    			len/=8;
    			len*=8;
    		}
    		// len 为这一分片承载的数据大小
    		// 申请新的skb,大小为mac头+ip头+数据部分长度
    		if ((skb2 = alloc_skb(len + hlen,GFP_ATOMIC)) == NULL)
    		{
    			return;
    		}
    		
    		skb2->arp = skb->arp;
    		skb2->free = 1;
    		// 总大小是mac头+ip头+数据部分长度
    		skb2->len = len + hlen;
    		// 指向刚分配的内存首地址,开始复制数据
    		skb2->h.raw=(char *) skb2->data;
    		save_flags(flags);
    		restore_flags(flags);
    		// ip地址
    		skb2->raddr = skb->raddr;	
    		
    		// raw指向mac头首地址,这里把mac报头和ip报头+选项都复制到skb中,ip选项应该只复制到第一个分片,这里会复制到每一个分片中
    		memcpy(skb2->h.raw, raw, hlen);
    		// 复制数据部分,长度为len,ptr指向原ip报文中数据部分的首地址,
    		memcpy(skb2->h.raw + hlen, ptr, len);
    
    		// 剩下需要分片的字节数
    		left -= len;
    		// 指向ip头首地址
    		skb2->h.raw+=dev->hard_header_len;
    		iph = (struct iphdr *)(skb2->h.raw);
    		// 设置该分片的偏移,除以8,见ip协议的规定
    		iph->frag_off = htons((offset >> 3));
    		/*
    			1. 还有数据,则置MF,还要更多分片
    			2. is_frag =1;说明该分片后面还有更多分片。
    			表示被分片的数据本身就是一个ip分片,即再分片。
    			所以该报文下的所有分片MF都是1。
    		*/
    		if (left > 0 || (is_frag & 1))
    			iph->frag_off |= htons(IP_MF);
    		// 更新数据指针和偏移
    		ptr += len;
    		offset += len;
    		// 发送分片
    		ip_queue_xmit(sk, dev, skb2, 2);
    	}
    

    分片主要的逻辑是
    1 申请一个新的内存,把待分片报文中的mac头、ip头,复制到新内存,然后数据部分切一块继续复制到内存后面。如此,直到分片完毕
    2 修改ip报文中的一些字段的值 ,比如MF。
    3 调底层接口逐个发送分片
    分片的逻辑不算复杂,不讲解的太详细了。

    展开全文
  • 上次分析了ip分片重组,这次分析一下ip分片。首先我们要先了解为什么需要分片。比如在以太网中,使用CSMA/CD协议(由网卡实现),他规定了一个链路层数据包(不包括mac头,但是这一版内核实现的时候是包括了mac头的...

    上次分析了ip分片重组,这次分析一下ip分片。首先我们要先了解为什么需要分片。比如在以太网中,使用CSMA/CD协议(由网卡实现),他规定了一个链路层数据包(不包括mac头,但是这一版内核实现的时候是包括了mac头的大小)的最大值(MTU)和最小值。所以如果上层的包大于这个阈值就需要被分片。而分片和组包的实现是在ip层。我们看一下具体的逻辑。ip分片的逻辑在ip_fragment函数里实现。

    void ip_fragment(
        struct sock *sk, 
        struct sk_buff *skb, 
        struct device *dev, 
        int is_frag
    )
    

    定义的一些变量。

        struct iphdr *iph;
        unsigned char *raw;
        unsigned char *ptr;
        struct sk_buff *skb2;
        int left, mtu, hlen, len;
        int offset;
        unsigned long flags;
        // mac首地址
        raw = skb->data;
        // ip头首地址,hard_header_len为mac头大小
        iph = (struct iphdr *) (raw + dev->hard_header_len);
        skb->ip_hdr = iph;
        // ip头的大小,不包括数据部分
        hlen = (iph->ihl * sizeof(unsigned long));
        // ip包总大小减去ip层等于ip报文的数据长度,即需要分片的部分的大小
        left = ntohs(iph->tot_len) - hlen;  
        // ip头+mac头
        hlen += dev->hard_header_len;   
        // 每个分片的数据部分长度等于mac层的mtu减去mac头和ip头,即mac层的mtu包括了mac头、ip头、ip数据部分的总和。
        mtu = (dev->mtu - hlen);        
        // 数据部分首地址
        ptr = (raw + hlen);     
    

    判断是否可以分片。

        // 设置了不能分片则发送icmp报文,可以对照ip报文格式看
        if (ntohs(iph->frag_off) & IP_DF)
        {
            icmp_send(skb,ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, dev->mtu, dev);
            return;
        }
    

    判断即将被分片的ip包是否本身也是一个分片。即经过了多次ip分片。

    /*
        该ip报文本身就是一个分片,现在需要进行再次分片,
        偏移的首地址是该报文的首地址乘以8,因为再次被分片的报文,他的偏移是
        基于原来未被分片的数据的偏移。而不是针对当前这个分片的偏移
    */
        if (is_frag & 2)
            offset = (ntohs(iph->frag_off) & 0x1fff) << 3;
        else
            offset = 0
    

    开始处理分片。

        // 还有则继续处理
        while(left > 0)
        {   
            // ip包默认承载的字节数,但是如果大于mtu的话则取小的值,即mtu
            len = left;
            // 大于mtu则还要分片,即只能承载mtu大小的字节,否则就是最后一个分片
            if (len > mtu)
                len = mtu;
            /*
                剩下的字节比mtu大的时候下面的判断会成立,
                即剩下的字节还不能在这次发送完,还要继续分片
                除8乘8即取8的倍数大小,不一定等于mtu 
            */
            if (len < left)
            {
                len/=8;
                len*=8;
            }
            // len 为这一分片承载的数据大小
            // 申请新的skb,大小为mac头+ip头+数据部分长度
            if ((skb2 = alloc_skb(len + hlen,GFP_ATOMIC)) == NULL)
            {
                return;
            }
    
            skb2->arp = skb->arp;
            skb2->free = 1;
            // 总大小是mac头+ip头+数据部分长度
            skb2->len = len + hlen;
            // 指向刚分配的内存首地址,开始复制数据
            skb2->h.raw=(char *) skb2->data;
            save_flags(flags);
            restore_flags(flags);
            // ip地址
            skb2->raddr = skb->raddr;   
    
            // raw指向mac头首地址,这里把mac报头和ip报头+选项都复制到skb中,ip选项应该只复制到第一个分片,这里会复制到每一个分片中
            memcpy(skb2->h.raw, raw, hlen);
            // 复制数据部分,长度为len,ptr指向原ip报文中数据部分的首地址,
            memcpy(skb2->h.raw + hlen, ptr, len);
    
            // 剩下需要分片的字节数
            left -= len;
            // 指向ip头首地址
            skb2->h.raw+=dev->hard_header_len;
            iph = (struct iphdr *)(skb2->h.raw);
            // 设置该分片的偏移,除以8,见ip协议的规定
            iph->frag_off = htons((offset >> 3));
            /*
                1. 还有数据,则置MF,还要更多分片
                2. is_frag =1;说明该分片后面还有更多分片。
                表示被分片的数据本身就是一个ip分片,即再分片。
                所以该报文下的所有分片MF都是1。
            */
            if (left > 0 || (is_frag & 1))
                iph->frag_off |= htons(IP_MF);
            // 更新数据指针和偏移
            ptr += len;
            offset += len;
            // 发送分片
            ip_queue_xmit(sk, dev, skb2, 2);
        }
    

    分片主要的逻辑是
    1 申请一个新的内存,把待分片报文中的mac头、ip头,复制到新内存,然后数据部分切一块继续复制到内存后面。如此,直到分片完毕
    2 修改ip报文中的一些字段的值 ,比如MF。
    3 调底层接口逐个发送分片
    分片的逻辑不算复杂,不讲解的太详细了。

    展开全文
  • Linux 操作系统原理 — 网络硬件卸载

    千次阅读 2020-05-04 15:10:22
    网络 Offload,主要是指将原本在内核网络协议栈中进行的 IP 分片、TCP 分段、重组、checksum 校验等操作,转移到网卡硬件中进行,使得 CPU 的发包路径更短,消耗更低,从而提高处理性能。 一开始这些 Offload 功能都...
  • 3.linux默认网卡模式是DHCP[自动获取] 4.虚拟机使用的虚拟网卡, windows使用3种 仅主机模式 直连模式 5.修改linuxip 打开设置 network 设置 ipv4填入ip[要和window是在一个网段,在同一个网段可以不填网关 填入...
  • [Linux] 网络知识汇总

    2016-10-21 10:29:00
    MTU 最大传输单元IP层传输分片的依据 ICMP可以简单的认为就是IP的最基本控制报文 Ping利用应答请求和应答回显两个类型 Tracert利用了IP的TTL和TTLexceeded类型 linux有七种网卡绑定模式:0. round robin,1....
  • LINUX的中断处理

    2011-11-06 20:54:32
    一、概念  首先我们要知道为什么中断需要下半部 。我们可以想象一下,如果没有...我们知道TCP/IP协议栈是一个比较复杂的软件模块,里面对packet的处理会经过非常多的步骤,首先是链路层,然后是IP层(这里又包括分片
  • 服务器根据不同依据分类 外观:机架式 刀片 塔式 尺寸:1U 2U 4U 8U ——U=4.45cm 性能:普通机架式 小型机 大型机 企业应用:物理主机 云主机 服务器硬件组成: ...网卡:负责上网 电源:供电 光驱...
  • ) 服务器硬件分类说明 服务器按照硬件用途分类:家用硬件设备(台式机,笔记本),企业硬件设备(服务器设备) ...2存储(内存,磁盘) 3卡(网卡,阵列卡,远程管理卡) 服务器硬件详述说明 (1)CPU(...
  • 1、TCP/IP协议族 1.1 数据链路层 实现了网卡接口的网络驱动程序...MTU最大传输单元,即帧最多能携带多少上层协议数据(比如IP数据报),正因为如此,过长的IP数据报可能需要分片传输。 说明:以太网帧的MTU=1500,...
  • 这篇是关于IP层协议接收报文时的处理,重点说明了路由表的查找,以及IP分片重组。 ip_rcv进入IP层报文接收函数  丢弃掉不是发往本机的报文,skb->pkt_type在网卡接收报文处理以太网头时会根据dst mac设置,协议栈...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    不过目前大多数较新的Linux发行版本(包括红旗 Linux、中软Linux、Mandrake Linux等)都可以自动挂装文件系统,但Red Hat Linux除外。 umount 1.作用 umount命令的作用是卸载一个文件系统,它的使用权限是超级...
  • GSO

    2012-02-20 21:46:19
    GSO就是尽可能的delay分片直至发送到网卡driver之前,此时kernel会检查网卡是否只是fragmentation offload,如果支持直接发送到网卡,如果不支持就进行分片后再发往网卡。 可以将TSO和UFO看做GSO的一种: ...
  • TCP Segmentation Offload(TSO)

    千次阅读 2019-06-11 13:14:13
    TSO (TCP Segmentation Offload) 是一种利用网卡替代CPU对大数据包进行分片,降低CPU负载的技术。如果数据包的类型只能是TCP,则被称之为TSO。此功能需要网卡提供支持。TSO 是使得网络协议栈能够将大块 buffer 推送...
  • 4.2 TCP Segmentation Offload(TSO)

    千次阅读 2015-03-23 20:53:41
    TSO (TCP Segmentation Offload) 是一种利用网卡替代CPU对大数据包进行分片,降低CPU负载的技术。如果数据包的类型只能是TCP,则被称之为TSO。此功能需要网卡提供支持。TSO 是使得网络协议栈能够将大块 buffer 推送...
  • 网络入侵检测规避工具fragrouter 网络入侵检测系统可以通过拦截数据包,获取内容进而判断是否为恶意数据包。对于传输较大的数据包,通常会采用分片的方式,将...该工具可以拦截发送给网卡的数据,进行重新分片,...
  • Wireshark数据包分析实战(第二版)

    千次下载 热门讨论 2014-06-29 14:24:16
    6.2.4IP分片 6.3传输控制协议 6.3.1TCP头 6.3.2TCP端口 6.3.3TCP的三次握手 6.3.4TCP终止 6.3.5TCP重置 6.4用户数据报协议 6.5互联网控制消息协议 6.5.1ICMP头 6.5.2ICMP类型和消息 6.5.3Ech0请求与响应 6.5.4路由...
  • 2.3.2安装Linux操作系统 2.3.3挂载iSCSI磁盘 2.3.4配置udev固定iSCSI磁盘设备名称 2.3.5配置服务器的图形化环境 2.4 RAC运行环境安装前检查 2.4.1服务器检查 2.4.2存储检查 2.4.3网络检查 2.5配置数据库...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

linux分片网卡

linux 订阅