折腾过计算机的人都知道如何查看IP地址,在Windows上是ipconfig,在Linux上是ifconfig或ip addr。
但是如果你登入一个裁剪过的Linux操作系统,里面既没有ifconfig,也没有ip addr,这时候怎么办?你可以自行安装net-tools和iproute2这两个工具。装好之后,运行ip addr,我们会看到下面的内容:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:a3:43:da brd ff:ff:ff:ff:ff:ff
inet 192.168.28.134/24 brd 192.168.28.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::f4e6:adf7:e0d9:16de/64 scope link noprefixroute
valid_lft forever preferred_lft forever
这个命令显示了这台机器上所有的网卡。大部分网卡都会有一个IP地址,当然也会有没有IP地址的网卡。
IP地址是网络世界中的通讯地址,相当于现实世界的门牌号码。既然是门牌号码肯定不能重复,如果一样,送快递的就不知道怎么送了。
如上图,192.168.28.134就是一个IP地址。这个地址被分隔成四个部分,每个部分8位,所以IP地址总共是32位。这样的IP地址很快就不够用了,所以后来就有了IPv6,就是上面的 inet6 fe80::f4e6:adf7:e0d9:16de/64,这个IP地址有128位。
32位的IP地址,被分成了5类:
在网络地址中,对于A B C类主要分两部分,前一部分是网络号,后一部分是主机号。这很好理解,大家都是一单元101号,你是小区A的一单元101号,我是小区B 的一单元101号。
可以看到C类地址能包含的最大主机数太少了,只有254个,而B类包含的最大主机数又太多了,6万多个,这样又会造成浪费。
无类型域间路由(CIDR)
针对上面分类造成的分配不均问题,有了一个折中的方案,叫做无类型域间选路,简称CIDR。这种方式将32位IP地址一分为二,前面是网络号,后面是主机号。怎么区分哪些位是网络号,哪些位是主机号呢?如果你注意观察,你会发现,192.168.28.134/24 这个IP地址后面有一个斜杠,斜杠后面有一个数字24,这种地址表示形式就是CIDR。后面24的意思是,32位的IP地址中,前24位是网络号,后8位是主机号。
跟CIDR相关联的,一个是广播地址192.168.28.255,如果向这个地址发包,所有192.168.28网络里的主机都会收到。另一个是子网掩码,255.255.255.0。
将子网掩码和IP地址进行与运算(AND),就可以得到网络号。
公有IP地址和私有IP地址
继续看上面的表格,最右边是私有IP地址段。平时我们在办公室、家里或学校的IP地址,一般都是私有IP地址,这些地址由组织内的IT人员自己管理和分配。所以,你学校的某个私有IP地址段和我学校的可以是一样的。
公有IP地址是有个组织统一分配,需要去买。如果你要搭建一个网站,给学校内的人用,那么你找你学校的IT人员要一个IP地址就行。但是假如你要做一个类似网易163这样的网站,让全世界人用,那么你就需要一个公有IP地址。
最常用的私有IP地址是192.168.0.x。比如你家里的Wi-Fi,就有一个IP地址,一般家里的设备不会超过256个,所以/24就基本够用了。
举例:一个容易”犯错“的CIDR
我们有一个16.158.165.91/22这个CIDR,请问这个地址的网络号、子网掩码和广播地址。
如果你说是16.158.165.0,那就错了。
/22不是8的整数倍,所以不能一眼看出来,需要换算成二进制。16.158占了前16位,先不动;中间的165,变成二进制是10100101,这个8位中前6位是网络号,后6位是主机号,也就是16.158.<101001>是网络号,<01>.91是主机号。
所以网络号是16.158.164.0,子网掩码是255.255.<111111><00>.0,即255.255.252.0,广播地址是16.158.<101001><11>.255,即16.158.167.255。
五类地址中,D类是组播地址。使用这一类地址,一个组内的机器都能收到。就像公司里大家加入一个邮件组,发送邮件,组内的成员都能收到。
接着分析上面的ip addr 的输出,ip地址后面有一个scope,对于ens33这张网卡来讲是global,表面这张网卡可以对外,可以接收来自各个地方的包。对于lo来说是host,说明这张网卡仅供本机相互通信。
lo的全称是loopback,又称环回接口,往往会分配到127.0.0.1这个地址。这个地址用于本机通信,不会在任何网络中出现。
MAC地址
IP地址的上一行是 link/ether 00:0c:29:a3:43:da ,这个是MAC地址,是一个网卡的物理地址,用十六进,6个字节表示。
MAC地址像是身份证,是一个唯一的标识。它的唯一性设计是为了在一个网络里的主机不用担心冲突,从硬件角度,区分不同的网卡。
MAC地址是用来在一个子网内进行通信的,而IP地址可以跨不同的网段通信。
网络设备的状态标识
<BROADCAST,MULTICAST,UP,LOWER_UP>
这是干什么的?这个叫做net device flags,即网络设备的状态标识。
UP 表示网卡处于启动状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP表示L1是启动的,即网线插着。
MTU 1500是什么?这是以太网的默认值。我们知道网络是层层封装的。MTU是二层MAC层的概念,以太网规定MAC的正文部分不能超过1500字节,如果上层交给MAC层的数据大于这个值就需要分片来传输。
qdisc pfifo_fast 是什么意思呢?qdisc全称是queueing discipline,中文叫排队规则。内核如果需要通过某个网络接口发送数据包,它需要按照这个配置的排队规则把数据包加入队列。
最简单的qdisc 是pfifo,它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。pfifo_fast复杂一些,它的队列包含三个波段(band)。每个波段使用先进先出的规则。
三个波段(band)的优先级不同。band 0优先级最高,band 最低。如果band 0里面有数据包,系统就不会处理band 1里面的数据包。
数据包是按照服务类型(Type of Service,TOS)分配到三个波段里的。TOS是IP头里面的一个字段,代表当前包的优先级。
小结
- IP地址可以跨不同网络传递;MAC地址只能在一个网络里传递;
- CIDR可以判断是不是本地人;
- IP分为公有IP和私有IP。
两个思考题:
1. 你知道net-tools和iproute2的“历史”故事吗?
2. 你知道IP地址是怎么来的吗?