-
网络-网卡-禁用linux网卡协助cpu分段分片处理功能(TCP offload engine)
2020-01-09 11:07:13有时希望网卡不做cpu减压处理,希望能够,禁用TCP offload engine ethtool --offload ethX rx off tx off有时希望网卡不做cpu减压处理,希望能够,禁用TCP offload engine
ethtool --offload ethX rx off tx off
-
linuxeth0路径_linux内核网络路径数据包分片功能介绍
2021-01-13 23:27:51众所周知,网络数据包的传输是受到...现在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
(完)
-
深入理解TCP/IP协议的实现之ip分片(基于linux1.2.13)
2020-03-13 22:56:17上次分析了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 调底层接口逐个发送分片
分片的逻辑不算复杂,不讲解的太详细了。 -
c语言实现ip协议_深入理解TCP/IP协议的实现之ip分片(基于linux1.2.13)
2021-01-14 10:02:40上次分析了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 功能都... -
redhat linux 比赛入门培训笔记
2018-11-30 13:43:003.linux默认网卡模式是DHCP[自动获取] 4.虚拟机使用的虚拟网卡, windows使用3种 仅主机模式 直连模式 5.修改linuxip 打开设置 network 设置 ipv4填入ip[要和window是在一个网段,在同一个网段可以不填网关 填入... -
[Linux] 网络知识汇总
2016-10-21 10:29:00MTU 最大传输单元IP层传输分片的依据 ICMP可以简单的认为就是IP的最基本控制报文 Ping利用应答请求和应答回显两个类型 Tracert利用了IP的TTL和TTLexceeded类型 linux有七种网卡绑定模式:0. round robin,1.... -
LINUX的中断处理
2011-11-06 20:54:32一、概念 首先我们要知道为什么中断需要下半部 。我们可以想象一下,如果没有...我们知道TCP/IP协议栈是一个比较复杂的软件模块,里面对packet的处理会经过非常多的步骤,首先是链路层,然后是IP层(这里又包括分片 -
Linux系统硬件知识说明
2019-11-20 17:21:00服务器根据不同依据分类 外观:机架式 刀片 塔式 尺寸:1U 2U 4U 8U ——U=4.45cm 性能:普通机架式 小型机 大型机 企业应用:物理主机 云主机 服务器硬件组成: ...网卡:负责上网 电源:供电 光驱... -
02-Linux运维课程预备知识说明
2019-11-29 20:19:03) 服务器硬件分类说明 服务器按照硬件用途分类:家用硬件设备(台式机,笔记本),企业硬件设备(服务器设备) ...2存储(内存,磁盘) 3卡(网卡,阵列卡,远程管理卡) 服务器硬件详述说明 (1)CPU(... -
【Linux网络编程】TCP/IP协议族体系结构
2019-05-24 22:34:071、TCP/IP协议族 1.1 数据链路层 实现了网卡接口的网络驱动程序...MTU最大传输单元,即帧最多能携带多少上层协议数据(比如IP数据报),正因为如此,过长的IP数据报可能需要分片传输。 说明:以太网帧的MTU=1500,... -
Linux内核分析 - 网络[八]:IP协议
2013-07-08 22:15:35这篇是关于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:19GSO就是尽可能的delay分片直至发送到网卡driver之前,此时kernel会检查网卡是否只是fragmentation offload,如果支持直接发送到网卡,如果不支持就进行分片后再发往网卡。 可以将TSO和UFO看做GSO的一种: ... -
TCP Segmentation Offload(TSO)
2019-06-11 13:14:13TSO (TCP Segmentation Offload) 是一种利用网卡替代CPU对大数据包进行分片,降低CPU负载的技术。如果数据包的类型只能是TCP,则被称之为TSO。此功能需要网卡提供支持。TSO 是使得网络协议栈能够将大块 buffer 推送... -
4.2 TCP Segmentation Offload(TSO)
2015-03-23 20:53:41TSO (TCP Segmentation Offload) 是一种利用网卡替代CPU对大数据包进行分片,降低CPU负载的技术。如果数据包的类型只能是TCP,则被称之为TSO。此功能需要网卡提供支持。TSO 是使得网络协议栈能够将大块 buffer 推送... -
网络入侵检测规避工具fragrouter
2017-03-29 15:05:00网络入侵检测规避工具fragrouter 网络入侵检测系统可以通过拦截数据包,获取内容进而判断是否为恶意数据包。对于传输较大的数据包,通常会采用分片的方式,将...该工具可以拦截发送给网卡的数据,进行重新分片,... -
Wireshark数据包分析实战(第二版)
2014-06-29 14:24:166.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路由... -
构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化
2016-05-11 15:07:102.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配置数据库...
-
织梦道路护栏交通设施类网站织梦模板模板(带手机端)
-
【转载】dos下通过wmic命令查看硬盘和内存/CPU信息(windows自带命令查看硬件信息)
-
【摩斯密码】真·发电报 我真的是High到不行 !#摩根密码#摩尔斯密码
-
C++核心准则GSL.util:实用程序
-
华为1+X——网络系统建设与运维(中级)
-
Unity RUST 逆向安全开发
-
蓝光CsPbBrxCl3-x钙钛矿纳米片/TiO2/ZnTiO3复合粉体/PbTiO_3纳米片的单晶复合材料
-
【PC端】Gif动图制作神器.rar
-
华为1+X——网络系统建设与运维(高级)
-
MA2CuCl4/PVDF纳米复合薄膜/聚偏氟乙烯-钛酸钡复合薄膜/聚苯乙烯—钛酸钡复合材料
-
python编写是否是闰年
-
tangt-and-song-dynasties-ssm-BookAppointment-master.zip
-
织梦响应式茶叶新闻资讯类网站织梦模板(自适应手机端)
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
Samba 服务配置与管理
-
工程制图 AutoCAD 2012 从二维到三维
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
使用 ESP-AT 固件测试 ESP32 透传,是否支持 TCP、UDP 同时透传?
-
tangt-and-song-dynasties-spring_springmvc_mybatis-master.zip
-
K8S监控docker状态并进行故障自愈探针