浅谈网络协议(三) 关于IP的一些讲解

如何获取一台电脑的IP地址?
这是个简单的问题,稍微折腾过linux系统的人,都知道如何获取电脑的IP地址。windows上面ipconfig,linux上面是 ifconfigip addr

但是不是所有人都知道 ifconfigip addr 的区别。这里要涉及到 net-toolsiproute2 的历史了。

如果你安装了一个仅有linux内核的系统,发现 ifconfigip addr 指令都不存在,你会怎么操作?这个时候,你可以自行安装 net-toolsiproute2 这两个工具。当然,大多数时候这两个命令是系统自带的。

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

root@heihei:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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 00:16:3c:c7:2f:79 brd ff:ff:ff:ff:ff:ff
    inet 103.1.153.13/25 brd 103.1.153.127 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2402:c480:8000:1:0:106:f89f:da7c/96 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3cff:fec7:2f79/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:fe:82:cb:41 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:feff:fe82:cb41/64 scope link 
       valid_lft forever preferred_lft forever
5: vethde92e06@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ca:7b:d4:e4:7e:e9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::c87b:d4ff:fee4:7ee9/64 scope link 
       valid_lft forever preferred_lft forever

以上显示了这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址,但是 IP 并不是必须的。IP 地址是网卡在互联网世界中的通讯地址,不能有重复的,否则就回引起冲突。

如上输出的结果,103.1.153.13 就是一个 IP 地址。这个地址被点分隔为四个部分,每个部分 8 个 bit,所以 IP 地址总共是 32 位。这样产生的 IP 地址的数量很快就不够用了。因为当时设计 IP 地址的时候,低估了计算机的发展,并没有想到现在会有这么多计算机!所以现在就有了 IPv6,也就是上面输出结果里面 inet6 fe80::216:3cff:fec7:2f79/64。 IPv6有128位的地址,现在是够了,但是将来会不会少就不好说了。

32 位的 IP 地址还被分成了 5 类,于是就更加不够了。 1

在网络地址中,对于 A、B、C 类主要分两部分,一部分是网络号,一部分是主机号。区分不同局域网中相同主机号的计算机。

下图是 A、B、C 三类地址所能包含的主机数量。

2

不同的类型表示网络的方法也不同 A类:网络号.主机号.主机号.主机号
B类:网络号.网络号.主机号.主机号
C类:网络号.网络号.网络号.主机号

A类网络地址范围中,第一字节的第一位必须是0,所以其网络地址范围从 00000000-01111111。即0-127。
B类网络地址范围中,第一字节的前2位必须是10,所以其网络地址范围从 10000000-10111111。即128-191。
C类网络地址范围中,第一字节的前3位必须是110,所以其网络地址范围从 11000000-11011111。即192-223。

A类网络用8位表示网络号,24位表示主机位,B类网络以16位表示网络,16位表示主机,C类网络用24位表示网络号,8位表示主机位。D类和E类是我们平时不用的,

这里面有个尴尬的事情,就是 C 类地址能包含的最大主机数量太少了,只有 254 个。而 B 类地址能包含的最大主机数量又太多了。6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。

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

binary 11111111.11111111.11111111.10000000
ip 255.255.255.128
可用网络从 11111111.11111111.11111111.10000001 - 11111111.11111111.11111111.11111110
即从103.1.153.1 到 103.1.153.126

伴随着 CIDR 存在的,一个是广播地址,103.1.153.127。如果发送这个地址,所有同网段的网络里面的机器都可以收到。当主机位是全1时我们将该地址作为子网广播地址,则广播地址为103.1.153.127。将子网掩码和 IP 地址按位计算 AND,就可得到网络号。

公有 IP 地址和私有 IP 地址 在日常的工作中,几乎不用划分 A 类、B 类或者 C 类,反而是 CIDR 用得比较多。但是有一点还是要注意的,就是公有 IP 地址和私有 IP 地址。

简单来说,私有IP,就是局域网内部用的,不同的局域网内可以重复,C类的私有IP相信很多人都很熟悉。 公有 IP 地址有组织统一分配,你需要去买。如果你搭建一个网站,给你学校或者公司的人使用,让学校或者公司的网管给你一个 IP 地址就行。但是如果你要一个全世界人都能访问的网站,那么你就需要购买一个公有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的主机位就只有7。

举例:一个容易“犯错”的 CIDR 我们来看 16.158.165.91/22 这个 CIDR。求一下这个网络的第一个地址、子网掩码和广播地址。

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

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

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

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

MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。很多人看到这里就会想,既然这样,整个互联网的通信,全部用 MAC 地址好了,只要知道了对方的 MAC 地址,就可以把信息传过去。这个问题之前已经说过,就不再这里说了。

MAC 地址是有一定定位功能,但是范围非常有限,只在同一网段起作用。例如,从 192.168.0.2/24 访问 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子网,即从 192.168.0.2/24 到 192.168.1.2/24,MAC 地址就不行了,需要 IP 地址起作用了。

网络设备的状态标识 解析完了 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 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章