前言
因特网(Internet)的前身是美国国防部高级研究计划局(ARPA)用于军事目的的通信网络,真的就是一个内部的工具出圈成了改变世界的事物。网这个词用的很形象也很贴切,如今的世界任何事情都离不开这个大网了,特别是之前炒的非常火爆的万物互联概念,更是把所有事物都挂在了“网”上,虽然这张大网某些节点偶尔会不太通畅,但这并不能阻断消息的往来。之前都在讲全球化,谁能想到短短几年“逆全球化”居然越来越热。
1983年1月1日被认为是互联网的官方生日,在此之前,各种计算机网络没有相互通信的标准方式。但从这一天开始,用于军事目的的阿帕网和国防数据网络正式定义为TCP/IP标准,建立了一种统一的通信协议,它允许不同网络上不同类型的计算机相互”交谈”,互联网就此诞生了。
网络
如今人们已经离不开网络了,不管是每天工作,还是日常娱乐,网络无处不在,连两岁的宝宝看到动画片转圈圈都知道是网卡了,而进行应用开发和游戏开发的搬砖小哥儿们更是无人能逃脱网络问题,遇到网络问题不可怕,重启电脑、重启路由器,重启光猫,问题很可能就解决了。
但,总有那么几个问题是重启解决不了的,所以我们还是得掌握一些正常的工具来排查问题,那么接下来就列举几个常用的命令,真的很常见,大神请绕路~
网络命令
ping
这应该是用的最多的一个网络命令了吧,“ping一下通不通”,这句话经常在日常开发调试中被提及,ping
命令常常用来测试,指定的两台机器之间的网络是否可以连通,命令格式如下:
1 | ping [OPTIONS] 域名或IP地址 |
一些常用的选项:
-4
:只使用 IPv4-6
:只使用 IPv6-c count
:发送多少个测试包之后停止,linux环境下如果不加这个参数会一直发包-i interval
:指定发包的的间隔时间
用常用网站测试一下:
1 | [root@VM-0-3-centos ~]# ping -c 5 -i 2 www.baidu.com |
测试信息的含义:
数据 | 含义 |
---|---|
-c 5 | 发送5个测试包 |
-i 2 | 每个测试包发送间隔2s |
www.baidu.com | 指定的目标地址 |
www.a.shifen.com (110.242.68.3) | 实际的目标主机的主机名和IP地址 |
56(84) bytes | ICMP数据部分的大小56字节,加上8字节的ICMP头,则ICMP包大小为64字节,再加上20字节的IP头,IP包大小为84字节 |
64 bytes | ICMP数据包大小 |
icmp_seq=1 | ICMP包序号 |
ttl=251 | 剩余生存时间,生存时间是指数据包被路由器丢弃之前允许通过的网段数量,由发送主机设置的,以防止数据包在互联网络上永不终止的循环,每经过一个路由器至少将TTL减 1 |
time=10.3 ms | 响应时间,这个时间越小,连接速度越快 |
— www.a.shifen.com ping statistics — | 统计信息分割线,以下为统计信息 |
5 packets transmitted | 发送数据包的数量 |
5 received | 接收到的数据包的数量 |
0% packet loss | 数据包的丢失率 |
time 8007ms | 整个过程消耗的总时间 |
rtt min/avg/max/mdev = 10.217/10.243/10.311/0.132 ms | 最小响应时间/平均响应时间/最大响应时间/响应时间的平均差 |
ping 命令全称 Packe InterNet Groper, 翻译为因特网包探索器,是一个用于测试网络连接状况的程序。该令会使用ICMP(Internet Control Message Protocol)传输协议,向特定的目标主机发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
ICMP协议是IP层的附属协议,是介于IP层和TCP层之间的协议,一般认为属于IP层协议,也就是网络层协议。ICMP用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
注意:在Windows命令行中执行ping命令,默认只发送4个数据包就停止,这个行为和Linux环境下是不同的
telnet
telnet是电信(telecommunications)和网络(networks)的联合缩写,是Internet远程登陆服务的标准协议,为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,可以连接到服务器,直接在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样,进而可以在本地就能控制远端的服务器。
telnet位于OSI模型的第7层,属于应用层上的一种协议,使用端口23,底层基于TCP协议。传输的数据和口令是明文形式,相对来说不安全,存在很大的安全隐患,不再用于通过公共网络访问网络设备和服务器。
现在使用更加安全的ssh代替telnet进行远程管理终端,ssh传输方式是以加密形式传输,并且功能比telnet更齐全,而telnet主要作用变成了查看某个端口是否可访问,常用命令格式如下:
1 | telnet IP或域名 端口 |
测试一下:
1 | [root@VM-0-3-centos ~]# telnet www.baidu.com 80 |
一般情况下测试80端口是否可用,看到第3行的 Connected to www.baidu.com.
就够了,如果想使用telnet工具发送数据,可以按组合键 Ctrl+]
进入输入命令的模式,按字母 q
可以退出。
注意:在Windows环境下如果端口可以连通会显示一个无任何信息的黑框,按组合键
Ctrl+]
才会有反应,如果端口不通则会提示超时
nc
上一小节说过,telnet是基于TCP的应用层协议,所以只能检测TCP端口是否正常,如果想检测一个UDP端口是否可用,使用telnet命令是办不到的,这时候就可以使用 nc
命令来实现,详细的用法可以参考之前的文章《网络工具nc的常见功能和用法》,下面只列举一下检查UDP端口的命令参数:
1 | albert@home-pc:~$ nc -nvuz 82.156.125.169 666 |
traceroute
traceroute是一个路由跟踪命令,用于追踪数据包在网络上的传输时的全部路径,IPv4是发送的探测包大小是60字节,而IPv6默认是80字节,这个可以通过查询 man
手册来查询。
通过traceroute我们可以探测出数据从当前计算机到另一台主机是走了什么样网络路径,不过相同的数据包每次由从相同的出发点到相同目的地走的路径可能并相同,但大部分时候所走的路由是一样的,所以可以帮助我们了解网络状况。
traceroute的原理是利用逐步设置 ttl
参数进行参数,这个参数全称time-to-live
, 指当前数据包在网络中存在的是时间,而时间不是我们平常所说的时间,指的是数据包在网络环境中最多可以被中转的次数,每经过一个路由设备就要减1,减到0则说明数据包超时,要给原地址一个包含自身信息的回应。
既然这样就可以利用 ttl
的特点来探测出路径,先将第一个数据包的 ttl
设置为 1,到达第一个路由设备后 ttl
减为0,返回给发送数据的起始设备,这样我们就找到了网络路径中的第一个点。然后将下一个数据包的 ttl
设置为2,就可以探测出路径上的第二个路由设备,直到找到目的地址,整个探测过程结束。
1 | traceroute [OPTIONS] IP或域名 |
一些常用的选项:
-4
:强制使用 IPv4 追踪,默认自动选择-6
:强制使用 IPv6 追踪,默认自动选择-I
:使用 ICMP 回应进行探测-T
:使用 TCP 同步进行探测-m max_ttl
:指定time-to-live
的最大值,默认是30
测试如下:
1 | [root@VM-0-3-centos ~]# traceroute www.baidu.com -T |
从上面的测试结果来看,每一行都是一个记录,每个纪录表示一跳,从我的机器到 www.baidu.com
一共经过了14个设备才到达,不过并不是每次探测的结果都一样,这个是会变化的,可以看到每行有3个以ms为单位时间,是因为该命令每次默认发送3个探测数据包,这3个时间就是网关响应后返回的时间。
另外在输出信息中部分节点显示 * * *
,关于这种现象,我找到几种说法,遇到了需要针对具体情况进行分析:
- 设备防火墙封掉了ICMP的返回信息,我们得不到什么相关的数据包返回数据
- 由于回送TTL超时信息的时候,CPU生成这个返回包必须被打断,为保证其它工作的正常进行,每隔一秒才会处理traceroute,所以可能会看到中间一路
* * *
,但却看得到最后的destination. 这时往往是路由设备CPU太忙或者中间路由器不回送TTL超时包的原因(感觉不太靠谱)。 - 虚拟机nat路由器,默认丢弃port>32767的包,导致看不到中间路由的信息
注意:在Windows环境下,相同功能的命令为Tracert,而不是traceroute
tcpdump
tcpdump命令是一个网络嗅探,它可以打印所有经过该设备网卡的数据包的信息,也可以使用-w选项将数据包保存到文件中,方便以后分析,功能与Windows平台上的Wiresh相同,生成的数据文件也可以传送到Windows平台,使用 Wireshark 软件进行分析。
命令格式非常简单,必要时加一些参数就可以:
1 | tcpdump [OPTIONS] |
一些常用的选项:
-c count
:接受count个数据包之后退出-i
:指定网卡-v
:打印较详细的信息用于分析-w
:结果写到文件之中tcp
:过滤出tcp数据port xxxx
:仅打印指定端口的数据
测试一下:
1 | [root@VM-0-3-centos ~]# tcpdump -c 6 -v |
因为不能一直盯着某个设备的网络情况,所以会将数据打印到文件中便于日后分析,常常将tcpdump命令后台运行,比如可以写成下面这样:
1 | nohup tcpdump -i eth0 tcp port 8080 -v -w dm8080.cap & |
在Windows平台一般就直接使用Wiresh软件啦,非常方便
总结
- 设备一旦接入网络很难“独善其身”
ping
命令可以测试目的IP是否可达ping www.baidu.com
telnet
命令可以测试指定的tcp端口是否可达telnet 110.242.68.4 80
nc
命令可以测试指定udp端口是否可达nc -nvuz 110.242.68.4 666
tracerout
命令可以探测网络路径traceroute www.baidu.com
tcpdump
命令可以收集所有经过网卡的数据包tcpdump -i eth0 tcp port 8080 -v
“王侯将相,宁有种乎?”讲的是权利;
“天下兴亡,匹夫有责!”说的是义务;
权力和义务的辩证关系体现于此,二者统一,不可分离~2022-5-13 20:59:38