Linux网络基础-总

Linux网络基础

一.网卡和数据包的转发

1.收包流程

①.网卡接受报文,根据设置的不同模式及目的mac地址来判断是否接受该报文

网卡的模式有混杂模式(Promiscuous Model)、直接模式(Direct Model)、组播模式(MultiCast Model)和广播模式(BroadCast Model)四种。

直接模式是网卡只接收目的MAC是网卡自身MAC的数据帧的工作模式,

组播模式是网卡接收所有的组播报文数据帧的工作模式,

广播模式网卡可以接收广播帧的工作模式;

混杂模式是网卡可以接收所有任意目的MAC报文的工作模式,即无论报文的目的MAC是否是自身网卡的地址,无论报文是单播还是非单播。

通常情况下网卡正常工作时,只接收目的MAC为网卡自身地址的数据帧和广播的数据帧,以及自己所在组播组的组播报文。

②物理网卡接受到数据帧,使用中断或者轮询的方式查收报文

当网络端口接收到一个超过其MTU大小的数据帧时,网卡就会丢弃该报文并在丢弃报文计数器里增加计数。在TCP报文里MTU的值大小,基本上是MSS
(Maxitum Segment Size,数据包每次能够传输的最大数据分段)的值加上报文各层报文头部的字节数和尾部CRC校验和的字节数。

收发包的技术

·LSO(Large Segment Ofload)是一种通过网卡对TCP或UDP的发送报文进行分片的技术,需要硬件支持检验和计算;TCP的数据报文称之为TSO(TCP Segmentation Offload),UDP的对应功能称之为UFO(UDP Fragment offload)。

·LRO(Large Receive Ofload))和LSO相似,L服务器的网卡接收报文时,在网卡处对TCP或UDP将分片报文进行组合,然后再统一传送到协议栈,以提高协议栈的处理性能。

·GSO(Generic Segmentation Offload)比LSO更通用,针对任意协议,这点只是内核特性,方法是发送报文时尽可能在协议栈减少对报文的分片,而是只经过协议栈一次处理后,如果网卡支持GSO,则直接在数据报文的发送网卡处进行分片,否则协议栈完成数据报文的分片。

·GRO(Generic Receive Offload)功能也是对协议栈报文处理的一种减负处理方式。它不限于TCP/IP协议,同GSO一样也是内核的特性,比LRO更通用,但GRO功能只是针对NAPI类型的驱动。

二.多网卡bonding

多个挖个卡虚拟成一个逻辑的端口,多块网卡公用一个IP地址和mac地址,默认bonding端口的mac地址从第一个网卡成员的mac地址获取

ifconfig bond0 haether可以修改

网卡Bonding有如下七种工作模式。
(1)设置mode-0对应的是Load Balancing Round-Robin的负载均衡方式,这种模式下两块网卡都工作,传输数据包时依次分配到各个网卡进行传输;该模式不需要对端交换机配合,缺点是可能造成同一个TCP流或UDP流的数据包被分到不同链路上,造成接收端服务器的数据包重排序问题。
(2)设置mode=1对应的是Fault-tolerance(Active-backup)方式,该方式提供了网卡冗余备份的能力,并且网卡之间分主备状态且同一时刻只有一个网卡处于主的活动状态,其他网卡处于备的冗余状态,具有较高的冗余性,但是会造成带宽的浪费。
(3)设置mode=2对应的是Balance-xor平衡策略模式,通过配置不同的哈希策略算出一个相应的值,然后再对网卡数目取模来决定从哪一个网卡转出去,这点和交换芯片的静态配置的汇聚口选择具体出端口的做法非常类似,可以提供负载均衡和高可用的功能。
(4)设置mode=3对应的是Broadcast为广播策略模式,让每个报文都能从所有端口转发出去,这种模式虽然提供了容错能力,但是配置也会造成通信带宽的浪费,甚至有可能需要接收端服务器进行TCP流的去重工作。
(5)设置mode=4表示网卡Bonding与对端设备端口通过IEEE802.3adDymamic Link Aggregation 协议(IEEE 802.3ad)建立动态链接聚合。同模式mode=2,也可以通过设置哈希策略来改变报文选择出端口的算法;另外该模式需要每个Bonding网卡支持相同的速率和双工模式,对端交换机和本地Linux系统支持IEEE 802.3ad Dynamic Link Aggregation协议。
(6)设置mode=5表示网卡Bonding工作在Adaptive Transmit Load Balancing模式,即适配器传输负载均衡模式;该模式根据负载情况分配外出的流量;这种模式和mode=2的平衡策略模式的区别与前文提及的交换芯片调度算法WRR和WDRR之间的区别非常类似,一种是基于报文的,另一种则是基于比特流的。
(7)设置mode=6表示网卡Bonding 工作在Adaptive Load Balancing模式,即适配器适应性负载均衡模式;该模式不需要对端交换机的支持,与mode=0的区别是在该模式下流量先都从第一个端口成员转出,直到第一个超过了第一个端口成员的带宽数据报文才从第二个成员端口转出。

三.SR-IOV

SR-IOV标准允许在虚拟机之间高效共享PCIe(PerIPheral Component Interconnect Express,快速外设组件互连)设备,并且它是在硬件中实现的,可以获得能够与本机性能接近的VO性能。

SR-IOV中的两种功能类型是物理功能(Physical Function,PF)和虚拟功能(Virtual Function,VF),PF用于支持SR-IOV的PCI功能,拥有完全配置或控制PCle 设备资源的能力;而VF是一种轻量级的PICe功能,与PF相关联,可以与物理功能以及与同一物理功能关联的其他VF共享一个或多个物理资源。

sriov

四.DPDK

DPDK(Data Plane Development Kit,htp://www.DPDK.org/)是Intel在×86平台上快速处理报文的一个驱动和库,它工作在Linux的用户态,但DPDK并不能提供路由、防火墙、IPsec等网络功能。主要的库包括:
Multi-core Framework

Huge Page Memory

Ring Buffers

Pol1-mode Drivers

DPDK全面分析

五.TUN/TAP

TUN/TAP是Linux下的虚拟网络设备,从对报文的处理来讲,TUN处理IP报文的点对点设备,能够处理IP数据的封装等;

而TAP则是工作在第二层处理以太网数据帧的虚拟以太网设备,应用程序需要通过ioctl函数设置其虚拟网络设备的工作模式。

TUN/TAP可以作为内核空间与用户空间交互的一种方式,即内核通过TUN/TAP 设备向其所属的用户控件的程序发送信息数据,反之用户空间的程序也可以通过TUN/TAP设备向内核空间发送数据,这点在内核空间来看像是内核网卡驱动收发报文一样。虚拟网卡TUN/TAP驱动也是开源的,Openvpn即是在其基础之上进行隧道封装的开源项目。

在云计算中,虚拟机每一个网卡在宿主机里对应一个TAP设备。

TUN/TAP设备浅析

六.Linux bridge 和VLAN

Linux Bridge模拟了物理网络中网桥的概念,即将若干个服务器的端口加入到网桥中,网桥端口对端相连的设备通过发送报文给Linux Bridge,并通过Linux Bridge学习报文SMAC和查找报文的DMAC转发到相应的目的地

Linux Bridge的端口可以是物理网卡端口也可以虚拟的端口。

Linux Bridge本身是没有VLAN功能的,需要VLAN模块协作实现VLAN过滤的功能。当有VLAN Tag的报文进入服务器被Linux Bridge处理时,需要在收包的网卡处对报文的VLANTag进行识别和过滤,并去除报文的VLANTag字段,为上层协议栈对报文提供透明的处理方式。

Linux Bridge上端口的MAC地址的相关表项,在端口加入到Linux Bridge时自动生成,并且被表项中的is local 设置成yes,来标记此MAC地址是本地地址,当有DMAC是此类的MAC地址时,需要将报文送交协议栈来处理。当收到SMAC是此类MAC地址的报文时,会产生错误信息,并将该报文丢弃。

 ⚡ root@localhost  ~  brctl showmacs docker0        
port no	mac addr		is local?	ageing timer
  1	16:13:ae:61:d4:28	yes		   0.00
  1	16:13:ae:61:d4:28	yes		   0.00
  3	1a:15:9e:37:aa:c0	yes		   0.00
  3	1a:15:9e:37:aa:c0	yes		   0.00
  4	26:50:db:32:d1:5a	yes		   0.00
  4	26:50:db:32:d1:5a	yes		   0.00
  5	4e:64:aa:dc:d0:38	yes		   0.00
  5	4e:64:aa:dc:d0:38	yes		   0.00
  2	92:bc:1d:8c:13:43	yes		   0.00
  2	92:bc:1d:8c:13:43	yes		   0.00

veth pair

veth pair 设备类似于一根网线,可以完成两个network namespace的数据通信;当多个network namespace 需要通信时,就需要Linux Bridge来协助。
Linux下创建Bridge的常用命令如下。

brctl addbr br:表示创建一个名为br的Bridge。

brctl addif br etho:表示将端口etho添加到网桥br里。

ifconfig br 192.168.1.100up:表示为br配置IP地址为192.168.1.100并UP起来。

brctl show:用来对网桥配置的显示。

brctl hairpin br portl{onlof}:对br的端口portl开启或关闭发夹功能。

namespace

namespace技术

两个namespace的通信

ip netns add ns0
ip netns add nsl 
ip 1ink add type veth//产生 vetho veth1一对接口34/云计算网络珠玑
ip link set vetho netns ns0
ip link set vethl netns ns1
ip netns exec ns0 ip link set veth0 up 
ip netns exec nso ip address add 10.0.0.2/24 dev vetho 
ip netns exec nsl ip link set vethl up 
ip netns exec nsl ip address add 10.0.0.3/24 dev vethl

cgroups

七.TCP/IP协议栈

Linux协议栈网卡驱动程序通过软中断将报文从网卡送到Linux协议栈进行处理;之后在Linux内核协议栈里数据报文的大致处理流程是根据报文的类型调用不同的处理函数,主要是以太网ARP报文和IP报文;但两者的处理流程有很大的区别。

全面了解linux TCP/IP协议栈

mark

mark

mark

八.Iptables

九.QOS

Linux的TCP/IP协议栈里依据QoS的几个RFC实现了自身的QoS功能,其系统实现与交换机的硬件交换芯片功能体现方式上有些不同。Linux的QoS功能基本步骤分为过滤器(Filter)、分类器(class)和排队(QDisc)服务等,其协同工作的简单模型如图3-5所示。Linux的QoS服务流程是过滤器依据分类器对报文进行分类进入不同的队列,然后依据队列的不同被不同的QoS策略处理,这个过程称为TC(Traffic Control,流量控制器))。过滤器可以是结合IPtables的防火墙或路由来做,而分类器是不同队列的细分。QDisc又分为无类队列和有类队列,因为队列内部又可以分为多个子队列,而原来的队列称之为父队列;所以无类队列类似于数据结构中树里叶子的概念。无类队列技术包括Pfifo fast、SFQ、RED等几种,而有类队列技术分为HTB、CBQ、PRIO和WRR几种。值得一提的是Open vSwitch中的端口入方向限速用的是HTB机制,Pfifo_fast 机制在OpenStackNeutron里物理端口和虚拟端口默认使用一种QoS方式。

mark

十. [负载均衡原理](https://www.cnblogs.com/mrwuzs/p/11582450.html)

posted @ 2018-08-15 17:37  mrwuzs  阅读(1826)  评论(0编辑  收藏  举报