上一节结尾给你留的一个思考题是,你知道怎么查看 IP 地址吗?
当面试听到这个问题的时候,面试者常常会觉得走错了房间。我面试的是技术岗位啊,怎么问这么简单的问题?的确,即便没有专业学过计算机的人,只要倒腾过电脑,重装过系统,大多也会知道这个问题的答案:在 Windows 上是 ipconfig,在 Linux 上是 ifconfig。
那你知道在 Linux 上还有什么其他命令可以查看 IP 地址吗?答案是 ip addr。如果回答不上来这个问题,那你可能没怎么用过 Linux。
1、ifconfig 和 ip addr 的区别?
你知道 ifconfig 和 ip addr 的区别吗?这是一个有关 net-tools 和 iproute2 的“历史”故事,这里暂时不用了解这么细,但这也是一个常考的知识点。
想象一下,你登录进入一个被裁剪过的非常小的 Linux 系统中,发现既没有 ifconfig 命令,也没有 ip addr 命令,你是不是感觉这个系统压根儿没法用?这个时候,你可以自行安装 net-tools 和 iproute2 这两个工具。当然,大多数时候这两个命令是系统自带的。安装好后,我们来运行一下 ip addr。不出意外,应该会输出下面的内容。
这个命令显示了这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址,当然,这不是必须的。在后面的分享中,我们会遇到没有 IP 地址的情况。
IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。既然是门牌号码,不能大家都一样,不然就会起冲突。比方说,假如大家都叫六单元 1001 号,那快递就找不到地方了。所以,有时候咱们的电脑弹出网络地址冲突,出现上不去网的情况,多半是 IP 地址冲突了。
如上输出的结果,10.3.10.77 就是一个 IP 地址。这个地址被点分隔为四个部分,每个部分 8 个 bit,所以 IP 地址总共是 32 位。这样产生的 IP 地址的数量很快就不够用了。因为当时设计 IP 地址的时候,哪知道今天会有这么多的计算机啊!因为不够用,于是就有了 IPv6,也就是上面输出结果里面 inet6 fe80::2cf6:3bff:fe7b:3d94/64。这个有 128 位,现在看来是够了,但是未来的事情谁知道呢?
2、IP地址的分类
本来 32 位的 IP 地址就不够,还被分成了 5 类。现在想想,当时分配地址的时候,真是太奢侈了。
在网络地址中,至少在当时设计的时候,对于 A、B、 C 类主要分两部分,前面一部分是网络号,后面一部分是主机号。这很好理解,大家都是六单元 1001 号,我是小区 A 的六单元 1001 号,而你是小区 B 的六单元 1001 号。
下面这个表格,详细地展示了 A、B、C 三类地址所能包含的主机的数量。在后文中,我也会多次借助这个表格来讲解。
这里面有个尴尬的事情,就是 C 类地址能包含的最大主机数量实在太少了,只有 254 个。当时设计的时候恐怕没想到,现在估计一个网吧都不够用吧。而 B 类地址能包含的最大主机数量又太多了。6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。
3、 无类型域间选路(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。
网络号:前24位是网络号,即10.100.122
主机号:后8位是主机号,即2
4、公有 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-Fi,Wi-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,如果是 global,说明这张网卡是可以对外的,可以接收来自各个地方的包。如果是 host,说明这张网卡仅仅可以供本机相互通信。
lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。
5、MAC 地址
在 IP 地址的上一行是 link/ether 2e:f6:3b:7b:3d:94 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/24,MAC 地址就不行了,需要 IP 地址起作用了。
6、网络设备的状态标识
解析完了 MAC 地址,我们再来看<BROADCAST,MULTICAST,UP,LOWER_UP>是干什么的?这个叫做 net_device flags,网络设备的状态标识。
- UP 表示网卡处于启动的状态;
- BROADCAST 表示这个网卡有广播地址,可以发送广播包;
- MULTICAST 表示网卡可以发送多播包;
- LOWER_UP 表示 L1 是启动的,也即网线插着呢。
- MTU1500 是指什么意思呢?是哪一层的概念呢?最大传输单元 MTU 为 1500,这是以太网的默认值。
上一节,我们讲过网络包是层层封装的。MTU 是二层 MAC 层的概念。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 Service,TOS)被分配到三个波段(band)里面的。TOS 是 IP 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。
队列是个好东西,后面我们讲云计算中的网络的时候,会有很多用户共享一个网络出口的情况,这个时候如何排队,每个队列有多粗,队列处理速度应该怎么提升,我都会详细为你讲解。
7、总结
怎么样,看起来很简单的一个命令,里面学问很大吧?通过这一节,希望你能记住以下的知识点,后面都能用得上:
- IP 是地址,有定位功能;MAC 是身份证,无定位功能;
- CIDR 可以用来判断是不是本地人(CIDR 标注了哪几位是网络号,若网络号相同说明是本地人);
- IP 分公有的 IP 和私有的 IP。后面的章节中我会谈到“出国门”,就与这个有关。
8、思考问题?
1、最后,给你留两个思考题。你知道 net-tools 和 iproute2 的“历史”故事吗?
答案:
net-tools起源于BSD,自2001年起,Linux社区已经对其停止维护,而iproute2旨在取代net-tools,并提供了一些新功能。一些Linux发行版已经停止支持net-tools,只支持iproute2。
net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。
net-tools中工具的名字比较杂乱,而iproute2则相对整齐和直观,基本是ip命令加后面的子命令。
虽然取代意图很明显,但是这么多年过去了,net-tool依然还在被广泛使用,最好还是两套命令都掌握吧。
具体的对比,我这里推荐一篇文章https://linoxide.com/linux-command/use-ip-command-linux/,感兴趣的话可以看看。
2、这一节讲的是如何查看 IP 地址,那你知道 IP 地址是怎么来的吗?
答案:
下一节内容
3、A、B、C 类地址的有效地址范围是多少?A B C类别表里A类数据有问题,应该是1:0:0:1-126:255:255:254,建议检查一下B类和C类
答案:
我在写的时候,没有考虑这么严谨,平时使用地址的时候,也是看个大概的范围。所以这里再回答一下。
A 类 IP 的地址第一个字段范围是 0~127,但是由于全 0 和全 1 的地址用作特殊用途,实际可指派的范围是 1~126。所以我仔细查了一下,如果较真的话,你在答考试题的时候可以说,A 类地址范围和 A 类有效地址范围。
4、网络号、IP 地址、子网掩码和广播地址的先后关系是什么?
答案:
当在一个数据中心或者一个办公室规划一个网络的时候,首先是网络管理员规划网段,一般是根据将来要容纳的机器数量来规划,一旦定了,以后就不好变了。
假如你在一个小公司里,总共就没几台机器,对于私有地址,一般选择 192.168.0.0/24 就可以了。这个时候先有的是网络号。192.168.0 就是网络号。有了网络号,子网掩码同时也就有了,就是前面都是网络号的是 1,其他的是 0,广播地址也有了,除了网络号之外都是 1。
当规划完网络的时候,一般这个网络里面的第一个、第二个地址被默认网关 DHCP 服务器占用,你自己创建的机器,只要和其他的不冲突就可以了,当然你也可以让 DHCP 服务自动配置。
规划网络原来都是网络管理员的事情。有了公有云之后,一般有个概念虚拟网络(VPC),鼠标一点就能创建一个网络,网络完全软件化了,任何人都可以做网络规划。
5、C类地址的主机数为什么是254个,不是256个?什么是网络地址和广播地址,其意义是什么?组播地址是做什么用的,能否介绍一下组播原理?
答案:
C 类地址的主机号 8 位,去掉 0 和 255,就只有 254 个了。
在《TCP/IP 详解》这本书里面,有两章讲了广播、多播以及 IGMP。广播和组播分为两个层面,其中 MAC 层有广播和组播对应的地址,IP 层也有自己的广播地址和组播地址。
广播相对比较简单,MAC 层的广播为 ff:ff:ff:ff:ff:ff,IP 层指向子网的广播地址为主机号为全 1 且有特定子网号的地址。
组播复杂一些,MAC 层中,当地址中最高字节的最低位设置为 1 时,表示该地址是一个组播地址,用十六进制可表示为 01:00:00:00:00:00。IP 层中,组播地址为 D 类 IP 地址,当 IP 地址为组播地址的时候,有一个算法可以计算出对应的 MAC 层地址。
多播进程将目的 IP 地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,然后把数据发送出去。这些接收进程必须通知它们的 IP 层,它们想接收的发给定多播地址的数据报,并且设备驱动程序必须能够接收这些多播帧。这个过程就是“加入一个多播组”。当多播跨越路由器的时候,需要通过 IGMP 协议告诉多播路由器,多播数据包应该如何转发。
6、MTU 1500如果是MAC头加报文的长度,那么如果http请求方法是post的话,报文body中含有内容,那么这个内容不是没有限制吗?岂不是到了二层的MAC这块会和MTU 1500这个限制冲突?
答案:
MTU(Maximum Transmission Unit,最大传输单元)是二层的一个定义。以以太网为例,MTU 为 1500 个 Byte,前面有 6 个 Byte 的目标 MAC 地址,6 个 Byte 的源 MAC 地址,2 个 Byte 的类型,后面有 4 个 Byte 的 CRC 校验,共 1518 个 Byte。(MTU 大小是不包含二层头部和尾部的,MTU 1500表示二层MAC帧大小不超过1518, MAC 头14 字节,尾4字节。可以抓包验证)
在 IP 层,一个 IP 数据报在以太网中传输,如果它的长度大于该 MTU 值,就要进行分片传输。如果不允许分片 DF,就会发送 ICMP 包,这个在ICMP那一节讲过。
在 TCP 层有个 MSS(Maximum Segment Size,最大分段大小),它等于 MTU 减去 IP 头,再减去 TCP 头。即在不分片的情况下,TCP 里面放的最大内容。
在 HTTP 层看来,它的 body 没有限制,而且在应用层看来,下层的 TCP 是一个流,可以一直发送,但其实是会被分成一个个段的。
7、请教一下:我阿里云的多台机器,有172.16.2.145 和172.16.3.28这两个是怎么联通的?
作者回复: 如果/16,就是一个网段的。如果是/24,则中间会有路由器
8、老师,你好~MAC地址是网络生产商写在网卡上的,相当于是写死的。但是iproute2里有命令可以修改网卡的MAC地址,是不是只有虚拟机上的系统的网卡可以修改,而物理网卡的MAC地址是不能修改的?
作者回复: 物理网卡可以改,但改的是系统里面的,不是硬件里面的