《趣谈网络协议》读书笔记(一):网络分层,IP与MAC

概述

此文为极客时间趣谈网络协议第一模块“通信协议综述”的学习笔记。

主要内容包括数据包在如何在层间传输, IP 地址与 MAC 地址的介绍,IP 地址的设置与分配。

一、网络分层

1.数据包如何在层间流转

分层是一个复杂程序的必然趋势,因而复杂的网络协议就会有分层的要求。

以下图为例,下图描述了我们输入网址并回车后,整个大体的请求流程:

img

我们知道,按 TCP/IP 的四层模型,HTTP 协议属于应用层。假设用伪代码代表不同层级间对数据包的处理流程,当我们从应用层发起请求时:

  • 从应用层进入传输层。经过 send_tcp()的处理,会加上 TCP 头,里面有端口;
  • 从传输层进入网络层,经过 send_layer3()的处理,加上 IP 头;
  • 从网络层进入数据链路层,经过 send_layer()的处理,加上目标 MAC 或网关 MAC。

经过数据链路层传到目标主机后:

  • 从数据链路层进入网络层,经过 process_layer2()处理,解析获取目标 MAC;
  • 若 MAC 符合,就从网络层进入传输层,经过 process_layer3()处理,解析获取 IP;
  • 若 IP 符合,就从传输层进入应用层,经过 process_tcp()处理,解析获取 TCP 头,将数据包转发给 TCP 头中的端口;
  • 监听端口的引用收到数据包,开始真正处理数据。

2.如何理解分层

一个数据包被发出的过程从顶层到底层会不断的被打包,而接受的过程会不断的被拆包,这一过程其实就是添加信息和校验信息的过程。有点像包装商品,出厂包装写上名称和产地,然后发快递再装进纸箱,表明收件人和发件人,快递小哥根据目的地送到你家,然后再拆开纸箱确认东西是你要的。

二、IP地址

1.如何获取IP

在 windows 中,通过 ipconfig可以获取 ip 地址,而在 Linux 中则是 ifconfig,此外,还可以通过 ip addr命令获取网卡信息,然后查看网卡对应的 ip 地址。

在一些精简的 Linux 系统中可能没有安装 net-tools 和 iproute2 工具,因此以上的命令都需要先安装该工具后才可以执行。

2.什么是 IP

IP 协议是 TCP/IP 协议中的核心,我们一般所说的 IP 即是指 IP 地址。在 TCP/IP 体系中,IP 地址就相当于网卡在网络中的通讯地址。

10.100.122.2 为例,我们最常见到的 IPv4 地址通常都是这样的的结构。

IP 地址由点分为4段,每段是8个 bit,因此一串 IP 地址就是 32位,由于后来联网设备越来越多,传统的32位的 IPv4 地址不够用,于是就有了 128 位的 IPv6 地址,他的格式是这样的:fe80::f816:3eff:fec7:7975/64,共 128 位。

3.IP地址的构成

img

IP 地址被分为五类,其中 ABC 都由两部分组成:网络号+主机号。网络号表示网段,而主机号代表主机,加起来一串 IP 地址就是主机在某一网段内的地址。

但是实际上,由于位数的不同,决定了同一网段下最多第地址数量,换句话说,如果超过这个数量主机就拿不到 IP,就不能联网。其中,A 类最多可有 16777214 个地址,B 类可有 65534 个地址,而 C 类只可有最多 254 个地址。

img

4.无类型域间选路(CIDR)

对于 A 类和 B 类地址,一般企业达不到这样的规模,地址会出现闲置,而 C 类地址又太少。因此就有了一个无类型域间选路(CIDR),也就是不再直接按固定类型划分 IP,而是通过斜杠来分割网络号与主机号,比如10.100.122.2/24这样的 IP,斜杠后24的意思是,在32位的地址中,前24位是网络号,后8位是主机号

与 CIDR 一起出现的,是广播地址 10.100.122.255和子网掩码 255.255.255.0

广播地址就是如果发送数据到这个地址,那么统一网段下的所有地址都能收到

子网掩码则是用于通过与运算根据 IP 计算网络号。255转为二进制就是8个1,也就是1111111,换句话说,255.255.255.0转为二进制,前24位都为1,后8位都为0,将其与二进制的 IP 地址进行与运算,由于与运算要求都为1才为1,运算后第8位就一定会是0,最后得到的就是纯粹的网络号。

5.共有IP和私有IP

在局域网里面,我们可以自己分配 IP,因为 IP 只在局域网内使用,因此不同的局域网允许同时存在相同的 IP,但是从外部是无法访问私有的 IP 的,因为这个 IP 只在局域网有效,就像拿中国的地址去美国找人,是肯定找不到的。如果要是真正可以在任何地方都能访问的到的地址,需要去 IANA 申请。

一般,在局域网里,第一个地址往往就是出口设备的 IP 地址。比如 wifi 提供的家庭局域网通常地址是 192.168.0.x,这个一眼就能看出 192.168.0.0就是网络号,因而第一个 IP ,也就是 192.168.0.1一般就会是路由器地址,而192.168.0.255就会是广播地址。

我们在 Linux 上使用 ip addr命令,会出现如下显示:

1
2
3
4
5
6
7
8
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:06:5d:0f brd ff:ff:ff:ff:ff:ff
inet 172.17.31.234/18 brd 172.17.63.255 scope global dynamic eth0
valid_lft 289791687sec preferred_lft 289791687sec

其中,eth0 网卡的 IP 后面有一个 scope global,表示 IP 作用范围是全局,外部可以通过该 IP 访问本机。而 lo 网卡的 scope 是 host,也就是仅能在在本机通讯。因此,lo 全程 loopback,又称回环接口,经操作系统内部处理后直接返回,不会在外部网络中出现。

三、MAC

1.什么是MAC

我们可以看到,ip addr命令展示的网卡信息里,eth0 的 IP 地址上有 link/ether 00:16:3e:06:5d:0f brd ff:ff:ff:ff:ff:ff一行,这个就是网卡的 MAC 地址,用十六进制,6 个 byte 表示。

MAC 的全程是 Media Access Control Address ,即媒体访问控制。它是网卡的物理地址,从生产的时候就带着这个地址,是唯一的。不过虽然如此,MAC 是不能取代 IP 的,因为 MAC 并没有导航定位功能,就像一个人的身份证,而你是不可能在寄快递的时候直接填收件人的身份证。

MAC 地址的主要作用是在局域网中作为设备的唯一标识,换句话说,只在一个子网内是可以光凭 MAC 找到对应设备的,比如从 192.168.0.2/24 访问 192.168.0.3/24 但是跨网络就不行了,比如去访问 192.168.1.2/24 。这就像你在一个房间里可以直接通过身份证找到人,放大到一个城市里就不行了。

2.网络设备的状态标识

网络设备状态标识

还是上述的 ip addr展示的信息,我们可以在 eth0 看到 <BROADCAST,MULTICAST,UP,LOWER_UP>,这个叫做net_device flags,即网络设备的状态标识。

  • UP:表示网卡处于启动状态;
  • BROADCAST:表示网卡有广播地址,可以发送广播;
  • MULTICAST:表示网卡可以发送多播包;
  • LOWER_UP:表示 L1 是启动的,即插着网线;

最大传输单元

除此之外,还能看到 mtu 1500,即最大传输单元 MTU 为 1500,这是以太网的默认值。

排队规则

qdisc pfifo_fast state,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列。

qdisc 又分为两类:

  • pfifo:不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列;
  • pfifo_fast:分为三个 band,按优先级分别是 band0 到 band2,若数据包中有高优先级的就只处理高优先级的。数据包根据 IP 头中的 TOS(Type of Service) 字段分配到相应的 band 中。

四、如何配置IP

1.随意配置IP会带来什么问题

还是在 Linux 系统中,假如我们可以自己设置 IP,然后使用以下命令配置网卡:

1
2
sudo ifconfig eth1 10.0.0.1/24;
sudo ifconfig eth1 up;

实际上,配置的 IP 是不一定能上网的。比如本机在 192.168.0.x网段,但是却设置为了 10.168.0.5,现在要发送给 192.168.1.4这台设备,实际上是发不出去的。

在 Linux 中,当我们要发送数据的时候,Linux 会先检测源 IP 与目标 IP 是否在同一网段,如果在同一网段,就会发送 ARP 请求获取 MAC 地址,但是如果不在同一网段,就会先先获取网关的 MAC 地址,然后将数据发给本网段的网关,然后本网段的网关转发给外网网关,网关上有 IP 与 MAC 的路由表,它根据路由表再把 MAC 填上,转发给对应的主机,主机收到后确认 MAC 是自己的,于是就接受数据包。

而在上面的例子中,因为本机在 192.168.0.X网段,因而网关必然也在该网段,设置为 10.168.0.5后,Linux 就会去 10.168.0.x网段找网关,然而这个网关实际上是不存在的,因此这次请求一直找不到目标 MAC,也就一直都没法发到目标主机

2.什么是DHCP

实际上,如果每次设备接入设备都需要手动配置 IP 是很不方便的,因此就有了动态分配 IP 的动态主机配置协议(DHCP):管理员设置好一个网段,然后接入的机器就会直接获取一个 IP。

五、DHCP的工作方式

image-20201223162722289

1.主机发起申请

当一台主机加入网络时,它仍然未获取一个可用的 IP 地址,因此此时它的 IP 为 0.0.0.0

首先,主机通过广播地址 255.255.255.255发送一个封装了 UDP 协议的广播包以申请可用 IP,这个 UDP 协议里头封装了 BOOTP 协议。我们管这个申请 IP 的请求叫做 Boot Request

现在,本次请求的数据包格式是这样的:

img

2.Server响应申请

如果管理员配置了 DHCP Server 的话,它就会响应这次请求,分配一个可用 IP,并且记录申请 IP 的主机的 MAC 以及 MAC 和 IP 的对应关系,以防止下一个主机申请到相同的 IP。

现在,DHCP Server 要发送数据包给申请 IP 的主机,这个数据包中会包括分配给主机的 IP,IP 的租用期限,子网掩码,网关等信息。我们管这个 DHCP Server 回复主机的响应叫做 Boot Offer

img

注意,现在的 Boot Offer 可能会广播也可能会直接发送给主机,这取决于 IP 的数据头中的 BROADCAST 位是1还是0,1表示能接受,则单发,否则就广播

3.主机回复响应

主机会收到 DHCP Server 发送的 Boot Offer,如果有多个 DHCP Server 则会受到多个 Boot Offer。一般主机会选择第一个接收到的 Boot Offer,并且在接受到以后继续通过 255.255.255.255广播发送 Boot Request,里面会有主机接受的 IP,MAC,提供 IP 的 DHCP Server 的 IP 等。

4.Server接受响应

被拒绝的 DHCP Server 会取消分配的 IP 以供下一次使用,而被接受的 DHCP Server 会返回一个 DHCP ACK 消息包,表明收到主机同意的消息。

img

5.主机设置IP

最终,主机收到了 DHCP Server 的响应,将自己的 IP 以及子网掩码等数据变更为 Server 提供的。

不过 IP 的租用是有期限的,当租期过去50%的时候,主机会主动发送 request,向 Server 申请新的配置数据。

六、总结

网络分层

数据包发送的时候会从高层到底层一层一层的封装,而接收的时候会从最外层一层一层的拆解,一个完整的数据包,必然由外层协议包含内层协议。

IP 地址

IP 地址表示主机在网络中的位置,一般常见的 IPv4 地址表现为被点分割为4部分的12位数字,对应为32位二进制字符,即 xxx.xxx.xxx.xxx

IP 地址由网络号与主机号构成,网络号表示同一网段,而主机号表示主机在子网中的位置,根据网络号长度分为 ABCDE 五类 IP。

由于默认分类使用不便,因而一般使用无类型的 CIDR IP 地址。CIDR 在 IP 尾端使用/n表示 IP 的后多少位为主机号,其余部分为网络号,比如 xxx.xxx.xxx.xxx/8即表示前24位为网络号,后8位为主机号。

CIDR 带来了子网掩码与广播地址。广播地址默认为网络号+255,比如xxx.xxx.xxx.255/8。而子网掩码默认为 255 + 0,比如 255.255.255.0就是 xxx.xxx.xxx.255/8的子网掩码,因为掩码与 IP 与运算后就能得到网络号。

MAC 地址

MAC 地址是网卡出厂自带的唯一物理标识,主机间发送数据需要同时有 IP 与 MAC,通过 IP 可以找到主机的网络位置并发送数据包,但是只有目标 MAC 与目标主机 MAC 相同才会真正的被接收。

DHCP

DHCP 用于动态分配 IP。当新机器加入时,默认 IP 为 0.0.0.0,先广播发送 boot request 获取 Server 的响应,Server 接收响应返回带有预分配的 IP 的 boot offer,主机接收后返回响应,Server 确认响应后再次发送相应数据,表明通过申请并记录信息,主机接收到 Server 确认响应后将 IP 改为申请 IP。

0%