从理论知识到落地能力,你欠缺了什么?

转载自   从理论知识到落地能力,你欠缺了什么?

本文是一个理论过度到实践的典型案例,借助程序员经常遇到的一个问题——网络为什么不通,来具体说明怎么将书本上的死知识真正变成我们解决问题的能力。

 

大学学到的基本概念

我相信你脑子里关于网络基础知识的概念都在下面这张图中。知识内容有点乱,感觉都认识,又都模模糊糊,更谈不上将内容转化成生产力或是用来解决实际问题了。这是因为知识没有贯通、没有实践、没有组织。

 

上图中知识点的作用在RFC1180[1]中讲得无比通俗易懂了。看第一遍的时候也许你就看懂了,但是一个月后又忘记了。其实这些东西我们在大学也学过,但还是忘了(能够理解,缺少实操环境和条件),或者碰到问题才发现之前看懂了的东西其实没懂。

所以接下来我们将示范书本知识到实践的贯通过程,希望把网络概念之间的联系通过实践来组织起来。

 

还是从一个问题入手

最近的环境碰到一个网络ping不通的问题,当时的网络链路是(大概是这样,略有简化):

 

 

现象

  • 从容器1 ping 物理机2 不通;

  • 从物理机1上的容器2 ping物理机2 通;

  • 同时发现即使是通的,有的容器 ping物理机1只需要0.1ms,有的容器需要200ms以上(都在同一个物理机上),不合理;

  • 所有容器 ping 其它外网IP(比如百度)反而是通的。

这个问题扯了一周才解决是因为容器的网络是我们自己配置的,交换机我们没有权限接触,由客户配置。出问题的时候都会觉得自己没问题对方有问题,另外就是对网络基本知识认识不够,所以都觉得自己没问题而不去找证据。

这个问题的答案在大家看完本文的基础知识后会总结出来。

解决这个问题前大家先想想,假如有个面试题是:输入 ping IP 后敲回车,然后发生了什么?

 

复习一下大学课本中的知识点

要解决一个问题你首先要有基础知识,在知识欠缺的情况下就算逻辑再好、思路再清晰、智商再高,也不一定有效。

route 路由表

 

假如你在这台机器上ping 172.17.0.2 ,根据上面的route表得出 172.17.0.2这个IP符合下面这条路由:

 

这条路由规则,那么ping 包会从docker0这张网卡发出去。

但是如果是ping 1.1.4.4 根据路由规则就应该走eth0这张网卡而不是docker0了。接下来就要判断目标IP是否在同一个子网了。

 

ifconfig

首先来看看这台机器的网卡情况:

 

这里有三个网卡和三个IP,三个子网掩码(netmask)。根据目标路由走哪张网卡,得到这个网卡的子网掩码,来计算目标IP是否在这个子网内。

 

arp协议

网络包在物理层传输的时候依赖的mac 地址而不是上面的IP地址,也就是根据mac地址来决定把包发到哪里去。

arp协议就是查询某个IP地址的mac地址是多少,由于这种对应关系一般不太变化,所以每个os都有一份arp缓存(一般15分钟过期),也可以手工清理,下面是arp缓存的内容:

 

 

进入正题,回车后发生什么?

有了上面的基础知识打底,我们来思考一下 ping IP 到底发生了什么。

首先 OS 的协议栈需要把ping命令封成一个icmp包,要填上包头(包括src-IP、mac地址),那么OS先根据目标IP和本机的route规则计算使用哪个interface(网卡),确定了路由也就基本上知道发送包的src-ip和src-mac了。每条路由规则基本都包含目标IP范围、网关、MAC地址、网卡这样几个基本元素。

 

如果目标IP和本机使用的IP在同一子网

如果目标IP和本机IP是同一个子网(根据本机ifconfig上的每个网卡的netmask来判断是否是同一个子网——知识点:子网掩码的作用),并且本机arp缓存没有这条IP对应的mac记录,那么给整个子网的所有机器广播发送一个 arp查询,比如我ping 1.1.3.42,然后tcpdump抓包首先看到的是一个arp请求:

 

上面就是本机发送广播消息,1.1.3.42的mac地址是多少?很快1.1.3.42回复了自己的mac地址。 收到这个回复后,先缓存起来,下个ping包就不需要再次发arp广播了。 然后将这个mac地址填写到ping包的包头的目标Mac(icmp包),然后发出这个icmp request包,按照mac地址,正确到达目标机器,然后对方正确回复icmp reply(对方回复也要查路由规则,arp查发送方的mac,这样回包才能正确路由回来,略过)。

来看一次完整的ping 1.1.3.43,tcpdump抓包结果:

 

我换了个IP地址,接着再ping同一个IP地址,arp有缓存了就看不到arp广播查询过程了。

 

如果目标IP不是同一个子网

arp只是同一子网广播查询,如果目标IP不是同一子网的话就要经过本IP网关进行转发(知识点:网关的作用)。如果本机没有缓存网关mac(一般肯定缓存了),那么先发送一次arp查询网关的mac,然后流程跟上面一样,只是这个icmp包发到网关上去了(mac地址填写的是网关的mac)。

从本机1.1.3.33 ping 11.239.161.60的过程,因为不是同一子网按照路由规则匹配,根据route表应该走1.1.15.254这个网关,如下截图:

 

首先是目标IP 11.239.161.60 符合最上面红框中的路由规则,又不是同一子网,所以查找路由规则中的网关1.1.15.254的Mac地址,arp cache中有,于是将 0c:da:41:6e:23:00 填入包头,那么这个icmp request包就发到1.1.15.254上了,虽然包头的mac是 0c:da:41:6e:23:00,但是IP还是 11.239.161.60。

看看目标IP 11.239.161.60 真正的mac信息(跟ping包包头的Mac是不同的):

 

这个包根据Mac地址路由到了网关上。

 

网关接下来怎么办?

为了简化问题,假设两个网关直连

网关收到这个包后(因为mac地址是它的),打开一看IP地址是 11.239.161.60,不是自己的,于是继续查自己的route和arp缓存,发现11.239.161.60这个IP的网关是11.239.163.247,于是把包的目的mac地址改成11.239.163.247的mac继续发出去。

11.239.163.247这个网关收到包后,一看 11.239.161.60是自己同一子网的IP,于是该arp广播找mac就广播,cache有就拿cache的,然后这个包才最终到达目的11.239.161.60上。

整个过程中目标mac地址每一跳都在变,IP地址不变,每经过一次MAC变化可以简单理解成一跳。

实际上可能要经过多个网关多次跳跃才能真正到达目标机器。

 

目标机器收到这个icmp包后的回复过程一样,略过。

arp广播风暴和arp欺骗

广播风暴:如果一个子网非常大,机器非常多,每次arp查询都是广播的话,也容易因为N*N的问题导致广播风暴。

arp欺骗:同样如果一个子网中的某台机器冒充网关或者其他机器,当收到arp广播查询的时候总是把自己的mac冒充目标机器的mac发给你,然后你的包先走到他,再转发给真正的网关或者目标机器,所以在里面动点什么手脚,看看你发送的内容都还是很容易的。

 

讲完基础知识再来看开篇问题的答案

读完上面的基础知识相信现在我们已经能够回答 ping IP 后发生了什么。这些已经足够解决99%的程序员日常网络中网络为什么不通的问题了。但是前面的问题比这个要稍微复杂一点,还是依靠这些基础知识就能解决——这是基础知识的威力。

 

现场网络同学所做的一些其它测试:

  1. 怀疑不通的IP所使用的mac地址冲突,在交换机上清理了交换机的arp缓存,没有帮助,还是不通;

  2. 新拿出一台物理机配置上不通的容器的IP,这是通的,所以负责网络的同学坚持是容器网络的配置导致了问题。

对于1能通,我认为这个测试不严格,新物理机所用的mac不一样,并且所接的交换机口也不一样,影响了测试结果。

 

祭出万能手段——抓包

抓包在网络问题中是万能的,但是第一次容易被tcpdump抓包命令的众多参数吓晕,不去操作你永远上不了手,差距也就拉开了,你看差距有时候只是你对一条命令的执行。

在物理机2上抓包:

 

 

 

这个抓包能看到核心证据,ping包有到达物理机2,同时物理机2也正确回复了(mac、ip都对)。

同时在物理机1上抓包(抓包截图略掉)只能看到ping包出去,回包没有到物理机1(所以回包肯定不会回到容器里了)。

到这里问题的核心在交换机没有正确地把物理机2的回包送到物理机1上面,同时观察到的不正常延时都在网关那一跳:

 

 

最终的原因

最后在交换机上分析包没正确发到物理机1上的原因跟客户交换机使用了HSRP(热备份路由器协议,就是多个交换机HA高可用,也就是同一子网可以有多个网关的IP),停掉HSRP后所有IP容器都能通了,并且前面的某些容器延时也恢复正常了。

通俗点说就是HSRP把回包拐跑了,有些回包拐跑了又送回来了(延时200ms那些)

至于HSRP为什么会这么做,要厂家出来解释了。这里关键在于能让客户认同问题出现在交换机上还是前面的抓包证据充分,无可辩驳。实际中我们都习惯不给证据就说:我的程序没问题,就是你的问题。这样表述没有一点意义,我们是要拿着证据这么说,对方也好就着证据来反驳,这叫优雅地甩锅。

 

网络到底通不通是个复杂的问题吗?

讲这个过程的核心目的是除了真正的网络不通,有些是服务不可用了也怪网络。很多现场的同学根本讲不清自己的服务(比如80端口上的tomcat服务)还在不在,网络通不通,是网络不通呢还是服务出了问题。一看到SocketTimeoutException 就想把网络同学抓过来羞辱两句:网络不通了,网络抖动导致我的程序异常了(网络抖动是个万能的扛包侠)。

实际这里涉及到四个节点(以两个网关直连为例),srcIP -> src网关 -> dest网关 -> destIP。如果ping不通(也有特殊的防火墙限制ping包不让过的),那么在这四段中分段ping(二分查找程序员应该最熟悉了)。 比如前面的例子就是网关没有把包转发回来。

抓包看ping包有没有出去,对方抓包看有没有收到,收到后有没有回复。

ping自己网关能不能通,ping对方网关能不能通。

 

接下来说点跟程序员日常相关的

如果网络能ping通,服务无法访问

那么尝试telnet IP port 看看你的服务是否还在监听端口,在的话再看看服务进程是否能正常响应新的请求。有时候是进程死掉了,端口也没人监听了;有时候是进程还在但是假死了,所以端口也不响应新的请求了,还有的是TCP连接队列满了不能响应新的连接。

如果端口还在也是正常的话,telnet应该是好的:

 

假如我故意换成一个不存在的端口,目标机器上的OS直接就拒绝了这个
连接(抓包的话一般是看到reset标识):

一个SocketTimeoutException,程序员首先怀疑网络丢包的Case

当时的反馈应用代码抛SocketTimeoutException,怀疑网络问题:

  1. 业务应用连接Server 偶尔会出现超时异常;

  2. 业务很多这样的异常日志:[Server  SocketTimeoutException]

检查一下当时的网络状态非常好,出问题时间段的网卡的量信息也非常正常:

 

上图是通过sar监控到的9号 v24d9e0f23d40 这个网卡的流量,看起来也是正常,流量没有出现明显的波动。

为了监控网络到底有没有问题,接着在出问题的两个容器上各启动一个http server,然后在对方每1秒钟互相发一次发http get请求访问这个http server,基本认识告诉我们如果网络丢包、卡顿严重,那么我这个http server的监控日志时间戳也会跳跃,如果应用是因为网络出现异常那么我启动的http服务也会出现异常——宁愿写个工具都不背锅(主要是背了锅也不一定能解决掉问题)。

从实际监控来看,应用出现异常的时候我的http服务是正常的(写了脚本判断日志的连续性):

 

这也强有力地证明了网络没问题,所以写业务代码的同学一门心思集中火力查看应用的问题。后来的实际调查发现是应用假死掉了(内部线程太多,卡死了),服务端口不响应请求了。

如果基础知识缺乏一点那么甩过来的这个锅网络是扛不动的,同时也阻碍了问题的真正发现。

TCP协议通讯过程跟前面ping一样,只是把ping的icmp协议换成TCP协议,也是要先根据route,然后arp。

 

总结

网络丢包、卡顿、抖动很容易做扛包侠,只有找到真正的原因解决问题才会更快,否则在错误的方向上怎么发力都不对。准确的方向要靠好的基础知识和正确的逻辑以及证据来支撑,而不是猜测。

  • 基础知识是决定你能否干到退休的关键因素;

  • 有了基础知识不代表你能真正转化成生产力;

  • 越是基础,越是几十年不变的基础越是重要;

  • 知识到灵活运用要靠实践,同时才能把知识之间的联系建立起来;

  • 简而言之缺的是融会贯通和运用;

  • 做一个有礼有节的甩包侠;

  • 在别人不给证据愚昧甩包的情况下你的机会就来了。

 

留几个小问题:

  1. server回复client的时候是如何确定回复包中的src-ip和dest-mac的?一定是请求包中的dest-ip当成src-ip吗?

  2. 上面问题中如果是TCP或者UDP协议,他们回复包中的src-ip和dest-mac获取会不一样吗?

  3. 既然局域网中都是依赖Mac地址来定位,那么IP的作用又是什么呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三大特性之多态性

1.理解多态性:可以理解为一个事物的多种形态。 2.何为多态性: 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用) 3.多态的使用:虚拟方法调用 有了对象的多态性以后,我们在编…

在这里,我们为您绘制了专属海报,请您查收!

树叶在空中飘荡,谱写着一曲感恩的乐章,那是大树对滋养它的大地的感恩;白云在蔚蓝的天空中飘荡,绘画着那一幅幅感人的画面,那是白云对哺育它的蓝天的感恩。我们沐浴着爱的阳光长大,我们滋润着人间的真情成长&#xff0c…

ssl1761-城市问题【图论,最短路,Dijkstra】

题目 一个图,输出从k点到每个点的最短路 输入 第一行有两个整数n和k,中间用空格隔开;以下是一个NxN的矩阵,表示点间的距离。 3 1 0 3 1 3 0 2 1 2 0 输出 输出点k到各点的距离 3 0 2 解题思路 用Dijkstra算法&#xff…

10分钟就能学会的.NET Core配置

.NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件、命令行参数、环境变量等读取配置的方法。配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为POCO对象的支持。 目前支持以下配置Provider&#xff…

String 使用不当可能导致内存泄露

转载自 String 使用不当可能导致内存泄露 String是Java中一个比较基础的类,每一个开发人员都会经常接触到。而且,String也是面试中经常会考的知识点。String有很多方法,有些方法比较常用,有些方法不太常用。 今天介绍一个Strin…

instanceof关键字

instanceof关键字的使用 a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先 进行ins…

王宝兴同学谈学习!

对于学习,我认为心态很重要。只要我们明白就应做什么,此刻需要做什么,才能不断地向前迈进,直至终点。不要怕累。其实谁都一样,学习很累,可这个累只是暂时的。只要坚持下去,努力下去,…

ssl1614-医院设置【图论,最短路】

题目 一个像树一样的无向图,每个点有个值,每条边权值都是1,然后 若医院建在:   1处,则距离和4122*202*40136   3处,则距离和4*213204081 要求距离和最小 输入 第一行一个整数n,表示…

.NET Core运行时和基础类库性能提升

微软宣布改进了.NET Core运行时和基础类库的性能。虽然没有像改进ASP.NET Core的性能那样大肆宣传,但这些改进同样重要。 其中,以下10个方面的变化比较显著:集合、LINQ、压缩、加密、数学运算、序列化、文本处理、文件I/O、网络和并发。至于…

JSP 统计网站访问人数

统计访问人数1 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href"<%basePath%>…

阿里巴巴宣布开源限流降级中间件——Sentinel

转载自 阿里巴巴宣布开源限流降级中间件——Sentinel 近日&#xff0c;阿里巴巴中间件团队宣布开源 Sentinel&#xff0c;并发布了首个社区版本v0.1.0。GitHub地址为&#xff1a;https://github.com/alibaba/Sentinel 。 关于Sentinel&#xff0c;阿里巴巴给出的描述比较简单…

张君豪同学谈学习

开学也快一个月了&#xff0c;也渐渐适应了学校生活&#xff0c;与同学一起非常的开心&#xff0c;老师讲的课也听得更认真了&#xff0c;回想一下&#xff0c;过去的几周&#xff0c;还是有不少的感想啊&#xff0c;于是我就粗略的总结一下。因为某些原因&#xff0c;导致晚开…

== 和 equals() 区别

一、回顾 的使用&#xff1a;&#xff1a;运算符 1. 可以使用在基本数据类型变量和引用数据类型变量中 2. 如果比较的是基本数据类型变量&#xff1a;比较两个变量保存的数据是否相等。&#xff08;不一定类型要相同&#xff09;如果比较的是引用数据类型变量&#xff1a;比较…

JSP 登录案例实现

<h3>用户登录</h3> <form action"doLogin.jsp"> 账号&#xff1a;<input type"text" name"zh"/> 密码&#xff1a;<input type"password" name"pwd"> <input type"sub…

.NET Core 2.0 Preview2 发布汇总

前言 关于 ASP.NET Core 2.0 的新功能可以查看 Amazing ASP.NET Core 2.0。 这篇文章是 Priview2中的一些改进。 .NET Core 2.0 - Preview2 Azure 的改进Docker 镜像转移到了 Debian Stretch修复并支持 macOS High Sierra质量和性能的改进dotnet restore 将在 dotnet run,pu…

ssl1624-小萨的烦恼【图论,最短路,Floyd】

题目 一个图&#xff0c;只有一次快速的机会&#xff0c;不快速就得花双倍价格&#xff0c;求点1到点s的最短路&#xff0c;然后*2输出 输入 第一行有三个整数N、T、S 接下来是一个N*N的邻接矩阵。两点之间的距离不超过10^9。A[i,j]为0表示i和j不连通。 4 5 4 0 1 1 1 1…

再有人问你volatile是什么,就把这篇文章发给他

转载自 再有人问你volatile是什么&#xff0c;就把这篇文章发给他 在再有人问你Java内存模型是什么&#xff0c;就把这篇文章发给他中我们曾经介绍过&#xff0c;Java语言为了解决并发编程中存在的原子性、可见性和有序性问题&#xff0c;提供了一系列和并发处理相关的关键字…

端午前夕的班级小游戏

文章原创&#xff1a;高启航同学文章编辑&#xff1a;穆雄雄今天2020年6月24号&#xff0c;端午节放假前夕一早&#xff0c;依旧照常的早自习&#xff0c;同学们抵抗着困倦都在尽力而为的阅读笔记&#xff0c;虽然有些小不情愿&#xff0c;但声音还是很大。今天是班主任以及班委…

ssl1257-产生数【图论,最短路】

题目 给出一个整数 n&#xff08;n<10^30) 和 k 个变换规则&#xff08;k<15&#xff09;。   规则&#xff1a;    一位数可变换成另一个一位数&#xff1a;    规则的右部不能为零。   例如&#xff1a;n234。有规则&#xff08;k&#xff1d;2&#xf…

Servlet 流程控制

在之前的登陆例子里面所有的代码都是放到了jsp的页面中&#xff0c;但是JSP是负责显示的&#xff0c;现在用于了流程控制&#xff0c;这样十分不妥&#xff0c;所以我们把代码提取到了servlet里面 代码实现 Login.jsp <h3>用户登录</h3> <form action"…