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协议栈

八.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方式。

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

Linux网络基础-总的更多相关文章

  1. Linux网络基础配置

    这是看itercast视频的笔记 Linux网络基础配置 以太网连接 在Linux中,以太网接口被命令为:eth0, eth1等, 0,1代表网卡编号 通过lspci命令可以查看网上硬件信息(如果是u ...

  2. Linux网络服务01——Linux网络基础设置

    Linux网络服务01--Linux网络基础设置 一.查看及测试网络 1.使用ifconfig命令查看网络接口 (1)查看活动的网络接口 ifconfig命令 [root@crushlinux ~]# ...

  3. linux网络基础设置 以及 软件安装

    ifconfig #查看所有已激活的网卡信息 临时配置 #yum install net-tools -y 默认ifconfig是没有安装的,可能需要安装 ifconfig eth0 #查看单独一块网 ...

  4. Linux高性能server编程——Linux网络基础API及应用

     Linux网络编程基础API 具体介绍了socket地址意义极其API,在介绍数据读写API部分引入一个有关带外数据发送和接收的程序,最后还介绍了其它一些辅助API. socket地址API 主 ...

  5. 【Linux网络基础】网络拓扑、OSI层次模型、TCP/IP协议簇

    一.前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工作来说这些并不是重点,因此,我不可能从最基础的网络知识开始讲起.本节内容更多是从一个梳理和 ...

  6. Linux网络基础

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3840284.html ...

  7. linux——网络基础

    装完linux系统要对网络(ip地址,子网掩码,网关,DNS)进行配置,才能连接网络 一,开启网卡eth0 CentOS显示没有网卡(eth0) 2.设置静态IP vim /etc/sysconfig ...

  8. 关于linux网络基础记录

    1.linux操作系统是一套非常稳定的操作系统,作用永不止于提供网络服务那么简单.(www.Mail.FTP.DNS.DHCP.NAT.Router) 2.对于一个服务器而言,“搭建容易维护难”:维护 ...

  9. linux网络基础-网卡bonding技术

    1.bondingbonding(绑定)是一种linux系统下的网卡绑定技术,可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是 ...

随机推荐

  1. Python_数据类型的补充、集合set、深浅copy

    1.数据类型的补充 1.1 元组 当元组里面只有一个元素且没有逗号时,则该数据的数据类型与括号里面的元素相同. tu1 = ('laonanhai') tu2 = ('laonanhai') prin ...

  2. 3 Asking for more information

    1 Could you tell me more about your idea? 2 Could I hear more about your idea? 3 Could you expain yo ...

  3. python数据结构与算法第三天【时间复杂度计算方法】

    最优时间复杂度(不可靠) 最坏时间复杂度(保证) 平均时间复杂度(平均状况) 不同语句的时间复杂度: (1)顺序语句:使用加法 (2)循环语句:使用乘法 (3)分支语句:使用坏时间复杂度 例如:如下代 ...

  4. pip 升级

    pip install --upgrade qrcode pip install --upgrade qrcode==5.3

  5. QTP自动化测试-按行取值(win10下输入?问题)-笔记20181119

    在win10下运行qtp10 所有输入汉字都会为?,在win7下可以.查询了百度.bingo没有解决问题.当前的解决办法 ,在脚本中使用DataTable取数据值,添加2行记录,一行使用汉字,一行使用 ...

  6. python之读取和写入csv文件

    写入csv文件源码: #输出数据写入CSV文件 import csv data = [ ("Mike", "male", 24), ("Lee&quo ...

  7. Running Web API using Docker and Kubernetes

    Context As companies are continuously seeking ways to become more Agile and embracing DevOps culture ...

  8. Node.js 安装与管理

    一.node安装 Windows下,官网下载 Node.js 安装包,运行安装即可, 安装成功后,可查看版本号 node -v 二.npm npm 是 node 包管理工具,随同node一起安装,安装 ...

  9. 基于junit的单元测试类编写

    首先定义抽象类BaseTest package com.geostar.gfstack.operationcenter.common.util; import com.google.gson.Gson ...

  10. 微信小程序——使用vue构建小程序【外传】

    文档 http://mpvue.com/mpvue/ 根据文档构建完成的页面如下 更多的,还要继续看下文档~