• 网卡丢包问题排查即路由添加删除


    ifconfig查询结果解析

    # 设置网卡最大传输单元
    ifconfig eth0 mtu 1500
    
    ethtool ens33  # 查看网卡是千兆还万兆网卡
    # 编辑网卡的传输单元:
    ifconfig ens33 mtu 9000 # 命令行
    或者:
    	编辑/etc/rc.d/rc.loacal文件
    		ifconfig ens33 mtu 9000
    	chmod +x /etc/rc.d/rc.local
    
    
    ifconfig eth0 promisc # 开启繁杂模式  在局域网内发送的数据包发现目标主机不是自己,会将这个包丢掉,但是开启繁杂模式,不管局域网内发的数据包是不是自己主机的,都会接收。通常在抓包的时候可以开启
    ifconfig eth0 -promisc  # 关闭繁杂模式
    
    ifconfig ens33 multicast
    ifconfig ens33 -multicast #
    
    ifconfig eth0 allmulti # 开启
    ifconfig eth0 -allmulti # 关闭
    
    # 添加、删除ipv6地址
    ifconfig eth0 add 3ffe:3240:800
    ifconfig eth0 del 3ffe:3240:800
    

    解决网卡丢包问题

    CRC:
    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性
    
    # 网卡工作原理
    网卡发包:
    	1.ip包+14个字节的mac头变成数据帧frame
    	2.frame拷贝到网卡芯片内部的缓冲区,由网卡处理
    	3.网卡芯片为frame添加头部同步信息和CRC校验,此时才是真正可以发送的packet,然后发送该packet
    网卡收包:
    	1.网络包packet到达网卡,网卡先检查包packet的CRC校验,保证其完整性和正确性,然后去掉他的头得到frame
    	2.网卡将frame拷贝到网卡内部的FIFO缓冲区
    	3.网卡驱动程序产生硬件中断,把frame从网卡拷贝到内存中,接下来就交给内核处理
    	
    网卡丢包:
    	内核通常需要快速的拷贝网络数据包到系统内存
    	因为网卡上接收网络数据包的缓存大小固定,而且相比系统内存也要小得多。
    	所以上述拷贝动作一旦被延迟,必然造成网卡FIFO缓存溢出,进入的数据包沾满了网卡的缓存,后续的包只能被丢弃,这也应该就是ifcofing里的oberrun的来源。
    
    ethtool -g ens33 # 查看收发包缓冲区大小
    ethtool -G ens33 rx 2048  # 设定收发包缓冲区的大小
    mii-tool ens33
    	ens33: negotiated 1000baseT-FD flow-control, link ok
    	
    丢包问题解决:
    	# 丢包排查
    	网卡工作在数据链路层,数据量链路层会做一些校验,封装成帧,我们可以查看校验是否出错,确定传输是否存在问题,然后从软件层面,是否因为缓冲区太小丢包。
    	#1.先查看硬件情况
    	一台机器经常收到丢包的报警,先看看最底层的有没有问题:
    	#1.1 查看工作模式是否正常
    	ethtool ens33 | egrep 'Speed|Duplex'
    		Speed:100Mb/s
    		Duplex:Full
    	#1.2查看CRC校验是否正常
    	ethtool -S ens33 | grep crc # crc错误值大通常是因为服务器外部的网络环境有问题导致的
    		rx_crc-errors:0
    		-------Speed,Duplex,CRC之类的都没问题,基本可以排除物理层面的干扰--------
    

    路由管理

    一台Linux主机能够被当成路由器用的三大前提:
    	1.至少由两块网卡分别连接两个不同的网段
    	2.开启路由转发功能
    		echo 1> /proc/sys/net/ipv4/ip_forward
    	3.在Linux主机上添加正确的路由规则/策略
    		route
    
    其他主机若想要撒谎给你书Linux主机帮自己转发数据包,必须将自己的gw指定成上述linux主机的ip
    

    网关/路由

    Linux上分为3中路由:
    
    主机路由:掩码位32位,Destination精确到某一台主机,所以主机路由是直接指明到某台主机怎么走,主机路由也就是所谓的静态路由
    网络路由:掩码小于32位,Destination精确到某一个网段的主机,所以网络路由知名到某类网络怎么走
    默认路由:掩码通常位0,不走主机路由的和网络路由的、全部都走默认路由。操作系统上设置的默认路由一般也成为网关。
    
    路由时却分优先级的:若Linux上到某主机由多条路由可以选择,这时候会挑选优先级高的路由
    	大前提:
    	主机范围越小、越精确、优先级越高,而缩小主机范围的恰恰就是子网掩码,掩码越长范围越小,越精确、优先级越高
    	
    	优先级区分:
    	# 1.在Linux中,路由条目的优先级确定方式是先匹配掩码位长度,掩码越长的优先级越高
    	也就是说,掩码为长的路由条目优先级一定比掩码位短的优先级高,所以主机路由的优先级最高,然后是直连网络(即同网段)的路由(也算是网络路由)次之,再是网络路由,最后才是默认路由即网关。
    	# 2.若路由条目的掩码长度相同,则比较节点之间的管理距离(比如metric),管理距离短的 生效。
    
    eg:在本机上查看到的路由表如下:
    
    route -n 
    
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens33
    172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
    192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
    
    对于Flags列,如果没有安装路由软件,则只可能出现下面的3中值:
    	U(route is up)
    	H (target is a host)
    	G (use gateway,也即是设置了下一跳的路由条目)
    	Iface 从那块网卡出去
    	若要管理路由表,则使用add或del选项。
    		route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev]
    		选项说明:
    		add/del:增加或删除路由条目
    		-net:增加或删除的是一条网络路由
    		-host:增加或删除的是一条主机路由
    		default:增加或删除的是一条默认路由
    		netmask:明确使用netmask关键字指定掩码,要可以不使用该选项直接在地址上使用cidr格式的掩码,即IP/MASK.
    		gw:指定吓一跳的地址,要求吓一跳地址必须是能到达的,且一般是和本网段直连的接口。
    		dev:强制将路由条目关联到指定的接口上。一般内核会自动判断路由条目应该关联到哪个网络接口。
    		
    		# route 命令添加的多少临时生效
    
    (1)添加和删除默认路由
    route add default gw 192.168.100.10
    route add -net 0.0.0.0/0 gw 网关地址 # 同上
    
    route del default
    route del default gw 192.168.100.10 # 若有多条默认路由,则再加上gw即可唯一删除指定条目
    
    因为默认路由的目的地是0.0.0.0,所以操作默认路由也可以使用0.0.0.0替代default关键字,但这样就麻烦的多了,还是用default会简单一点。
    (2)添加和删除网络路由
    route add -net 172.16.10.0/24 gw 192.168.100.70
    route add -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70
    
    若是在不知道吓一跳是谁,那么指定本机接口也是可以的。
    route add -net 172.16.10.0/24 dev eth0
    route add -net 2.2.2.0/24 dev ens33
    route add -net 0.0.0.0/0 gw 192.168.1.1
    
    route del 2.2.2.0/24
    删除路由可以直接在增加路由的语句上将add改为del关键字。如:
    
    
    (2)添加和删除主机路由
    route add -host 1.1.1.10/32 dev ens33
    route del -host 1.1.1.10/32 # 不需要指定网卡设别
    

    配置永久路由

    根据接口创建路由配置文件/etc/sysconfig/network-scripts/route-ethX,要从哪个皆苦出去X就是几。
    路由配置文件的配置格式非常简单,每一行一个路由条目,先是要到达的目标,然后是via关键字,最后是吓一跳地址。哟啊求下一跳必须能到达,且一般都和ethX同网段。
    
    格式:
    DEST via nexthop
    
    例如eth0网卡的IP地址是192.168.10.123,要通过网卡eth0出去到达10.0.0.10,那么下一跳的地址要和eth0的地址在同网段,如192.168.10.222.
    
    10.0.0.0 via 192.168.10.222
    
    添加主机路由、默认路由、网段路由示例如下,其中dev是可以省略的,因为没有任何用处,配置在哪个eth文件中就会从哪个接口出去。
    
    # 默认路由
    default		via	192.168.100.1
    1.1.
    0.0.0.0/0	via	192.168.100.1
    
    # 网段路由
    192.168.10.0/24	via	192.168.100.1
    
    # 主机路由
    192.168.100.52/32	via	192.168.100.33	dev	eth1
    
    配置完成后,重启network服务即可立即生效。
    route-ethX文件的还有另外一种永久路由的配置写法,但上面的方法更简单快捷,所以此处就不多说
    
    配置永久路由时,需要注意几点:
    (1)route-ethX的对应网卡配置文件ifcfg-ethX必须存在,否则路由无效(注意:对于虚拟机,通常新添加的网卡都没有对应的ifcfg-ethX文件,但ifconfig却能找到该网卡)
    (2)如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件ifcfg-ethX中的DEFROUTE指令设置为“no”,表示DHCP不设置默认路由。
    (3)如果route-ethX文件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的ifcfg-ethX文件中的PEERROUTES指令设置为“no”,表示DHCP设置的路由允许被覆盖。
    
    
    setenforce 0  # 关闭防火墙
    iptables _F # 清空路由表
    
  • 相关阅读:
    【图灵学院09】RPC底层通讯原理之Netty线程模型源码分析
    【图灵学院10】高并发之java线程池源码分析
    【图灵学院02】大型互联网技术之数据库分库分表
    【图灵学院01】Java程序员开发效率工具IntelliJ IDEA使用
    【OD深入学习】Java多线程面试题
    高级工程师->架构师
    架构师成长之路
    python--openCV--鼠标事件
    python--openCV--视频处理
    python--openCV
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/14819730.html
Copyright © 2020-2023  润新知