gitbook/趣谈网络协议/docs/7772.md
2022-09-03 22:05:03 +08:00

13 KiB
Raw Permalink Blame History

第3讲 | ifconfig最熟悉又陌生的命令行

上一节结尾给你留的一个思考题是你知道怎么查看IP地址吗

当面试听到这个问题的时候,面试者常常会觉得走错了房间。我面试的是技术岗位啊,怎么问这么简单的问题?

的确即便没有专业学过计算机的人只要倒腾过电脑重装过系统大多也会知道这个问题的答案在Windows上是ipconfig在Linux上是ifconfig。

那你知道在Linux上还有什么其他命令可以查看IP地址吗答案是ip addr。如果回答不上来这个问题那你可能没怎么用过Linux。

那你知道ifconfig和ip addr的区别吗这是一个有关net-tools和iproute2的“历史”故事你刚来到第三节暂时不用了解这么细但这也是一个常考的知识点。

想象一下你登录进入一个被裁剪过的非常小的Linux系统中发现既没有ifconfig命令也没有ip addr命令你是不是感觉这个系统压根儿没法用这个时候你可以自行安装net-tools和iproute2这两个工具。当然大多数时候这两个命令是系统自带的。

安装好后我们来运行一下ip addr。不出意外应该会输出下面的内容。

root@test:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff
    inet 10.100.122.2/24 brd 10.100.122.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fec7:7975/64 scope link 
       valid_lft forever preferred_lft forever

这个命令显示了这台机器上所有的网卡。大部分的网卡都会有一个IP地址当然这不是必须的。在后面的分享中我们会遇到没有IP地址的情况。

IP地址是一个网卡在网络世界的通讯地址相当于我们现实世界的门牌号码。既然是门牌号码不能大家都一样不然就会起冲突。比方说假如大家都叫六单元1001号那快递就找不到地方了。所以有时候咱们的电脑弹出网络地址冲突出现上不去网的情况多半是IP地址冲突了。

如上输出的结果10.100.122.2就是一个IP地址。这个地址被点分隔为四个部分每个部分8个bit所以IP地址总共是32位。这样产生的IP地址的数量很快就不够用了。因为当时设计IP地址的时候哪知道今天会有这么多的计算机啊因为不够用于是就有了IPv6也就是上面输出结果里面inet6 fe80::f816:3eff:fec7:7975/64。这个有128位现在看来是够了但是未来的事情谁知道呢

本来32位的IP地址就不够还被分成了5类。现在想想当时分配地址的时候真是太奢侈了。

在网络地址中至少在当时设计的时候对于A、B、 C类主要分两部分前面一部分是网络号后面一部分是主机号。这很好理解大家都是六单元1001号我是小区A的六单元1001号而你是小区B的六单元1001号。

下面这个表格详细地展示了A、B、C三类地址所能包含的主机的数量。在后文中我也会多次借助这个表格来讲解。

这里面有个尴尬的事情就是C类地址能包含的最大主机数量实在太少了只有254个。当时设计的时候恐怕没想到现在估计一个网吧都不够用吧。而B类地址能包含的最大主机数量又太多了。6万多台机器放在一个网络下面一般的企业基本达不到这个规模闲着的地址就是浪费。

无类型域间选路CIDR

于是有了一个折中的方式叫作无类型域间选路,简称CIDR。这种方式打破了原来设计的几类地址的做法将32位的IP地址一分为二前面是网络号,后面是主机号。从哪里分呢你如果注意观察的话可以看到10.100.122.2/24这个IP地址中有一个斜杠斜杠后面有个数字24。这种地址表示形式就是CIDR。后面24的意思是32位中前24位是网络号后8位是主机号。

伴随着CIDR存在的一个是广播地址10.100.122.255。如果发送这个地址所有10.100.122网络里面的机器都可以收到。另一个是子网掩码255.255.255.0。

将子网掩码和IP地址进行AND计算。前面三个255转成二进制都是1。1和任何数值取AND都是原来数值因而前三个数不变为10.100.122。后面一个0转换成二进制是00和任何数值取AND都是0因而最后一个数变为0合起来就是10.100.122.0。这就是网络号将子网掩码和IP地址按位计算AND就可得到网络号。

公有IP地址和私有IP地址

在日常的工作中几乎不用划分A类、B类或者C类所以时间长了很多人就忘记了这个分类而只记得CIDR。但是有一点还是要注意的就是公有IP地址和私有IP地址。

我们继续看上面的表格。表格最右列是私有IP地址段。平时我们看到的数据中心里办公室、家里或学校的IP地址一般都是私有IP地址段。因为这些地址允许组织内部的IT人员自己管理、自己分配而且可以重复。因此你学校的某个私有IP地址段和我学校的可以是一样的。

这就像每个小区有自己的楼编号和门牌号你们小区可以叫6栋我们小区也叫6栋没有任何问题。但是一旦出了小区就需要使用公有IP地址。就像人民路888号是国家统一分配的不能两个小区都叫人民路888号。

公有IP地址有个组织统一分配你需要去买。如果你搭建一个网站给你学校的人使用让你们学校的IT人员给你一个IP地址就行。但是假如你要做一个类似网易163这样的网站就需要有公有IP地址这样全世界的人才能访问。

表格中的192.168.0.x是最常用的私有IP地址。你家里有Wi-Fi对应就会有一个IP地址。一般你家里地上网设备不会超过256个所以/24基本就够了。有时候我们也能见到/16的CIDR这两种是最常见的也是最容易理解的。

不需要将十进制转换为二进制32位就能明显看出192.168.0是网络号后面是主机号。而整个网络里面的第一个地址192.168.0.1往往就是你这个私有网络的出口地址。例如你家里的电脑连接Wi-FiWi-Fi路由器的地址就是192.168.0.1而192.168.0.255就是广播地址。一旦发送这个地址整个192.168.0网络里面的所有机器都能收到。

但是也不总都是这样的情况。因此,其他情况往往就会很难理解,还容易出错。

举例一个容易“犯错”的CIDR

我们来看16.158.165.91/22这个CIDR。求一下这个网络的第一个地址、子网掩码和广播地址。

你要是上来就写16.158.165.1,那就大错特错了。

/22不是8的整数倍不好办只能先变成二进制来看。16.158的部分不会动它占了前16位。中间的165变为二进制为10100101。除了前面的16位还剩6位。所以这8位中前6位是网络号16.158.<101001>,而<01>.91是机器号。

第一个地址是16.158.<101001><00>.1即16.158.164.1。子网掩码是255.255.<111111><00>.0即255.255.252.0。广播地址为16.158.<101001><11>.255即16.158.167.255。

这五类地址中还有一类D类是组播地址。使用这一类地址属于某个组的机器都能收到。这有点类似在公司里面大家都加入了一个邮件组。发送邮件加入这个组的都能收到。组播地址在后面讲述VXLAN协议的时候会提到。

讲了这么多才讲了上面的输出结果中很小的一部分是不是觉得原来并没有真的理解ip addr呢我们接着来分析。

在IP地址的后面有个scope对于eth0这张网卡来讲是global说明这张网卡是可以对外的可以接收来自各个地方的包。对于lo来讲是host说明这张网卡仅仅可以供本机相互通信。

lo全称是loopback,又称环回接口往往会被分配到127.0.0.1这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。

MAC地址

在IP地址的上一行是link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff这个被称为MAC地址是一个网卡的物理地址用十六进制6个byte表示。

MAC地址是一个很容易让人“误解”的地址。因为MAC地址号称全局唯一不会有两个网卡有相同的MAC地址而且网卡自生产出来就带着这个地址。很多人看到这里就会想既然这样整个互联网的通信全部用MAC地址好了只要知道了对方的MAC地址就可以把信息传过去。

这样当然是不行的。 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的IP地址才是有远程定位功能的。

例如你去杭州市网商路599号B楼6层找刘超你在路上问路可能被问的人不知道B楼是哪个但是可以给你指网商路怎么去。但是如果你问一个人你知道这个身份证号的人在哪里吗可想而知没有人知道。

MAC地址更像是身份证是一个唯一的标识。它的唯一性设计是为了组网的时候不同的网卡放在一个网络里面的时候可以不用担心冲突。从硬件角度保证不同的网卡有不同的标识。

MAC地址是有一定定位功能的只不过范围非常有限。你可以根据IP地址找到杭州市网商路599号B楼6层但是依然找不到我你就可以靠吼了大声喊身份证XXXX的是哪位我听到了我就会站起来说是我啊。但是如果你在上海到处喊身份证XXXX的是哪位我不在现场当然不会回答因为我在杭州不在上海。

所以MAC地址的通信范围比较小局限在一个子网里面。例如从192.168.0.2/24访问192.168.0.3/24是可以用MAC地址的。一旦跨子网即从192.168.0.2/24到192.168.1.2/24MAC地址就不行了需要IP地址起作用了。

网络设备的状态标识

解析完了MAC地址我们再来看 <BROADCAST,MULTICAST,UP,LOWER_UP>是干什么的?这个叫做net_device flags网络设备的状态标识

UP表示网卡处于启动的状态BROADCAST表示这个网卡有广播地址可以发送广播包MULTICAST表示网卡可以发送多播包LOWER_UP表示L1是启动的也即网线插着呢。MTU1500是指什么意思呢是哪一层的概念呢最大传输单元MTU为1500这是以太网的默认值。

上一节我们讲过网络包是层层封装的。MTU是二层MAC层的概念。MAC层有MAC的头以太网规定正文部分不允许超过1500个字节。正文里面有IP的头、TCP的头、HTTP的头。如果放不下就需要分片来传输。

qdisc pfifo_fast是什么意思呢qdisc全称是queueing discipline,中文叫排队规则。内核如果需要通过某个网络接口发送数据包它都需要按照为这个接口配置的qdisc排队规则把数据包加入队列。

最简单的qdisc是pfifo它不对进入的数据包做任何的处理数据包采用先入先出的方式通过队列。pfifo_fast稍微复杂一些它的队列包括三个波段band。在每个波段里面使用先进先出规则。

三个波段band的优先级也不相同。band 0的优先级最高band 2的最低。如果band 0里面有数据包系统就不会处理band 1里面的数据包band 1和band 2之间也是一样。

数据包是按照服务类型(Type of ServiceTOS被分配到三个波段band里面的。TOS是IP头里面的一个字段代表了当前的包是高优先级的还是低优先级的。

队列是个好东西,后面我们讲云计算中的网络的时候,会有很多用户共享一个网络出口的情况,这个时候如何排队,每个队列有多粗,队列处理速度应该怎么提升,我都会详细为你讲解。

小结

怎么样,看起来很简单的一个命令,里面学问很大吧?通过这一节,希望你能记住以下的知识点,后面都能用得上:

  • IP是地址有定位功能MAC是身份证无定位功能

  • CIDR可以用来判断是不是本地人

  • IP分公有的IP和私有的IP。后面的章节中我会谈到“出国门”就与这个有关。

最后,给你留两个思考题。

  1. 你知道net-tools和iproute2的“历史”故事吗
  2. 这一节讲的是如何查看IP地址那你知道IP地址是怎么来的吗

欢迎你留言和我讨论。趣谈网络协议,我们下期见!