前言

作为一名软件工程师,Linux相关的知识是一个不可或缺的技能点,而网络问题往往是初学者接触Linux时最先碰到的一只拦路虎,本篇博客将系统的讲解一个解决Linux网络问题的通用方法论,一个科学的方法论往往能达到事半功倍的效果。

本篇博客侧重点不是讲解计算机网络的相关知识,所以假定你有一定的网络基础,如果没有的话,可以先看看我文末的推荐书单。

本篇博客是基于Ubuntu 18.04来写的,使用 cat /etc/issue 可查看版本,对于其他版本的Linux发行版,部分命令可能会有所不同,但本质都是一样的。

整体图景

首先,要解决网络问题,哪么你必须要了解网络的分层结构和拓扑结构,这会让你对整个网络有一个宏观的认知,对你定位问题有极大的帮助。

  1. 对于网络的分层结构,你需要知道每一层都有哪些常用的协议,并了解协议的相关原理,因为后面我们提到的工具都是利用相应的协议来工作的。
  2. 对于网络的拓扑结构,你需要知道一个数据包在内网公网中是怎么流动的,还有交换机路由器的区别是什么。

问题定位

网络出了问题,无非就是硬件问题和软件问题。

硬件问题

这个问题涉及的面比较广,比如网线没插好,路由器坏了,等等。其实这个属于小概率事件,一般出了问题可能得相关专业的维修人员来解决,作为软件工程师,我们关注的点是软件问题。

软件问题

对于一般的电脑使用者,上不了网了,大概率就指的是上不了百度等网站。但是作为软件工程师,我们得明确为什么上不了网了,到底是网络的那一层出现了问题?

一般排查问题的思路有两种,自底向上自顶向下,这两种思路本质都是一样的,本篇文章就自底向上来排查网络问题。

网卡是否正常工作?(链路层)

这个问题严格来说是属于硬件问题,但是我们可以使用命令来操作网卡,在软件行业,重启可能会解决一大部分问题。

如下图所示,使用 ifconfig 查看网卡信息,显示的结果应该会有多条,有虚拟机创建的虚拟网卡,还有你电脑的真实网卡,我们关注的网卡一般叫ens33,或者eth0,这个不重要,只是一个名称。

然后我们使用 ifdown ens33 来关掉它,再使用 ifup ens33 来启动它(ens33是你的网卡名称),大多数情况下,重启网卡后网络就能正常访问。

网卡配置是否正确?(网络层)

在网卡没有损坏的情况下,重启后还是无法访问网络,哪我们就应该排查网络层的问题,也就是网卡的配置信息是否正常?主要有以下4点:

  1. IP地址

    我们都知道IP地址是用来标识你的计算机在互联网上的地址,目前我们大多数情况下使用的是IPv4地址,不过在不久的将来,IPv6会普及。(32位的IPv4地址现在已经远远不够用了)

    如上图所示的 inet 192.168.81.129 就是我的IP地址。

  2. 子网掩码

    子网掩码和IP地址相与可以得到网络号,就是你所在的网段。

  3. 网关

    网关就是你的数据包要从内网发送到公网所必须经过的,一般情况下是本网段的第一个或者最后一个地址。

    如下图所示,我们可以使用 route -n 来查看相关的信息。

  4. DNS服务器

    DNS服务器是用来解析域名然后给你返回对应的IP地址,比如 www.baidu.com ,所对应的就是182.61.200.7,常见的DNS服务器有1.1.1.1,8.8.8.8,114.114.114.114

    如下图所示,我们可以使用 cat /etc/resolv.conf 命令来查看本机设置的DNS服务器地址。

注意!!!

你的IP地址子网掩码网关DNS服务器都正常才是网络正常工作的必要条件。

一般情况下,你的DHCP服务器会自动地给你分配IP,以及相关的设置。如果DHCP服务器没有正常工作,这时候就需要你自己手动分配正确的IP,并且确保相关配置都正确。

(鉴于篇幅的原因,而且本文主要是讲述一个科学的方法论,所以如何手动配置这些信息,请大家查阅别的资料)

检验!!!

在这些配置都正确后,我们可以使用 ping 命令,来测试网络层是否正常工作。(注意,有些局域网的路由器被设置为禁止ping,这对我们排查网络问题造成了极大的困扰)

  • 首先我们可以ping网关的IP地址,或者局域网内的别的IP地址,如果正常工作,哪么即可确认在局域网内我们是正常的。

(注意:Windows系统的防火墙默认是不通过ICMP协议(ping命令使用就是ICMP协议)的,所以你ping一台Windows系统的电脑可能会失败)

  • 其次,我们可以ping百度,如果正常工作,哪么说明在公网上我们也是正常的。

服务是否监听端口?(传输层)

对一般使用者来说,能够ping通百度,就足够满足他的日常需求了,但是对于我们软件工程师来说,我们还会搭建自己的服务站点,提供自己的应用服务,或者我们会配置VPS来实现访问谷歌。

当你按照教程配置好一台VPS后,发现使用不了,而且采用了前两步的方法,发现VPS可以正常上网,这时候大概率就是你VPS服务的问题。

服务端

  • 首先查看VPS进程是否正常工作?使用 ps -aux|grep docker (插一句哈,使用docker来部署我们的应用程序简直太爽了)

  • 查看VPS是否正常监听端口?

客户端

如果以上的两步都没有问题,但是在你的客户端上还是无法访问谷歌的话,哪么你需要来测试以下端口是否真的通了,即客服端和服务端是否能建立会话。

如下图所示,我们可以使用telnet ip地址 端口 来测试。

如果连接失败,就表示端口是不通的,此时很可能是VPS的配置文件有问题,需要做别的排查,如下图所示。

防火墙,安全组

如果以上的测试都没有问题,哪么问题大概率是防火墙或者安全策略组(买过阿里云或者腾讯云的同学应该知道),大多数情况下,我们所使用的协议和监听的端口不会被防火墙所阻挡,所以碰到这种情况的时候不多,鉴于篇幅原因,本文就不讲了。

服务是否正常工作?(应用层)

这种情况一般很明显,比如大家常见的 404 NOT FOUND ,这种要么是被墙了,要么是服务端发生了错误。一般错误信息比较明显。

总结

初学计算机网络的时候,感觉知识又多又杂,而且单纯的看书,效果比较差,而且容易犯困。其实,在我们刚开始学习一门知识的时候,首先要做的就是建立整个宏观知识体系,然后学习工作中经常使用的部分,比如应用层,传输层,网络层的基本概念。等基本的和常用的知识都学完后,结合自己的兴趣再去深入的学习原理。要知道28原理,即20%的知识可以解决80%的问题。

推荐资料

《计算机网络》谢希仁 编著(配合B站的韩立刚老师的视频课程效果更佳)

Linux网络问题排错的更多相关文章

  1. Linux 网络排错检查思路

    Linux 网络排错检查思路 graph TD A[当网络不通时] --> B{ping想要访问的地址,<br>如www.runoob.com} B --> |不通| C{pi ...

  2. Linux网络编程&内核学习

    c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...

  3. Linux网络编程必看书籍推荐

    首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...

  4. Linux网络管理——Linux网络命令

    3. Linux网络命令 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  5. Linux网络技术管理及进程管理(week2_day4)--技术流ken

    OSI七层模型和TCP/IP四层模型 OSI七层模型:OSI(Open System Interconnection)开放系统互连参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联 ...

  6. Linux网络技术管理及进程管理

    OSI七层模型和TCP/IP四层模型 OSI七层模型:OSI(Open System Interconnection)开放系统互连参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联 ...

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

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

  8. Linux网络技术管理

    1. OSI七层模型和TCP/IP四层模型 1.1 osi 七层模型 Open System interconnection,开放系统互连参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系 ...

  9. Linux网络——查看网络连接情况的命令

    Linux网络——查看网络连接情况的命令 摘要:本文主要学习了Linux中用来查看网络连接情况的命令. hostname命令 hostname命令用于显示和设置系统的主机名称,设置只是临时生效,永久生 ...

随机推荐

  1. golang http json http://www.alexedwards.net/blog/golang-response-snippets

    http://www.alexedwards.net/blog/golang-response-snippets https://gist.github.com/andreagrandi/97263a ...

  2. 个人永久性免费-Excel催化剂功能第51波-聚光灯功能,长宽工作表不看错位使用

    Excel的聚光灯功能,笔者是有点看不上,也曾经写文吐槽过这些类似的功能的实用性,但现实可能真的很多小白很需要,大家Excel水平参差不齐,大量的不规范做表习惯,致使此功能使用场景仍然非常广阔.很怀疑 ...

  3. c实现生产者消费者问题。 windows下。

    #include <stdio.h>#include <windows.h> #define P(S) WaitForSingleObject(S,INFINITE)//定义W ...

  4. 【SVN】SVN使用教程总结

    SVN使用教程总结 SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subve ...

  5. linux初学者-iptables篇

     linux初学者-iptables篇 iptables是防火墙的一种,是用来设置.维护和检查linux内核的IP过滤规则的,可以完成封包过滤.封包重定向和网络地址转换(NAT)等功能. iptabl ...

  6. java练习---11

    package cn.lyhh; class Person{ private String name; private int age; static String city = "A城&q ...

  7. js - 原生ajax访问后台读取数据并显示在页面上

    1.前台调用ajax访问后台方法,并接收数据 <%@ page contentType="text/html;charset=UTF-8" language="ja ...

  8. shiro解析ini文件

    来吧,看看shiro是怎么解析ini文件的,这里假设ini文件在classpath下,名字叫做shiro.ini Factory<org.apache.shiro.mgt.SecurityMan ...

  9. Currency Exchange POJ1860

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  10. MariaDB 修改存储路径后启动失败问题解决

    修改 MariaDB 路径到 home 路径下, 执行 systemctl start mariadb 启动MariaDB 时,报错提示: Job for mariadb.service failed ...