网络层 ######################################## IPv4 **************************************** IP 分组是由首部和数据部分组成,其中固定长度为 20B , 变长部分最长为 40B ,因此,一个 IP 的分组头部长度为 20 ~ 60B。其头部组成如下: .. image:: assets/网络层-IPV4数据报格式.png 由于 IP 分组一般为 20B ,故对于一个 IPv4 的数据报而言,其第一个字节一般为 :math:`(0100\_0101)_2` 即:0x45 - 首部长度:``单位为 4B`` - 总长度:首部 + 数据部分的总长度。``单位为 1B`` - 标识:每产生一个数据报就加一,但是只用来组装被分片的数据报。IP 是无连接服务 - 标志:3 位,最高位不用,其次两位分别是 :abbr:`DF (Don't Fragment)` 、 :abbr:`MF (More Fragment)` 。 - 片偏移:``单位为 8B`` ,每个分片的数据部分长度一定为 8B 的整数倍。 - 协议:用来表示该分组的上层协议是什么, ``6 为 TCP``, ``17 为 UDP``。 数据报的长度受 :abbr:`MTU (Maximum Transmission Unit)` 所限制。以太网的 MTU 为 1500B,大多数广域网不超过 576B。当数据报的总长度大于 MTU 后,若 DF = 0 ,则进行分片,否则丢弃数据报并发送 ICMP 差错报文。被分片的数据报在目的主机进行组装,若被分片的分组不是最后一个,则 MF = 1 。 需要注意的是: - 路由器只负责分片,分片的组装由目的主机负责 - 被分片后数据报数据部分长度为 8B 的整数倍 - 被分片的数据报的最后一片 MF = 0,其他均为 1 IP 地址分类 ======================================== IPv4 地址长度为 32B,按照 ``点分十进制`` 记法,每 8 位放到一起,共分 4 组。IP 地址分为 ``网络号`` 和 ``主机号`` 两部分,将 IP 地址与其子网掩码进行按位与可以获得 ``网络号`` 。网络号的相同的 IP 被划分到一个子网下。 IP 地址分为 5 类: .. csv-table:: :header: 分类, 范围, 子网掩码 A, 1~126, 255.0.0.0 B, 128~191, 255.255.0.0 C, 192~223, 255.255.255.0 D, 224~239, 组播地址,不用于标识主机 E, 240~255, 保留地址,不使用 对于整个互联网而言,网络号不得相同。对于子网而言,主机号不得相同。 以下地址为特殊地址: .. csv-table:: :header: 地址, 作用 主机号全为 0, 代表本子网 主机号全为 1, 本子网的广播地址 127.0.0.1, 主机本身。用于本地回环测试 0.0.0.0, 本网络上的本主机。在向其他主机发送报文,但是不知道自己 IP 地址时在源 IP 填此地址 255.255.255.255, 整个网络的广播地址,由于路由器的隔离,也代表本子网的广播地址 以下地址被划分为 ``私有地址`` 。公网上路由器不转发目的地址为私有地址的分组: .. csv-table:: :header: 分类, 地址 A 类, 10.0.0.0 ~ 10.255.255.255 B 类, 172.16.0.0 ~ 172.16.255.255 C 类, 192.168.0.0 ~ 192.168.255.255 IP地址聚合 ======================================== 无类域间路由选择( :abbr:`CIDR (Classless Inter-Domain Routing)` )是一种 ``地址聚合`` 规范,而不是 ``子网划分`` 规范。 CIDR 提供了两种服务: - 子网掩码 - 前缀聚合 NAT ======================================== 网络地址转换( :abbr:`NAT (Network Address Translation)` ) 一个典型的 NAT 表为: .. csv-table:: :header: WAN 端, LAN 端 138.76.29.7:5001, 192.168.0.2:2233 138.76.29.7:5060, 192.168.0.3:1234 此时,将本地 192.168.0.2:2233 上的数据报中的源地址和源端口改为 138.76.29.7:5001。 .. important:: NAT 路由器在将分组转发到公网或者将公网分组转发到内网时才会更改源地址和源端口。而普通路由器在任何时候都不会更改分组内容 DHCP **************************************** :abbr:`DHCP (Dynamic Host Configuration Protocol)` 申请 IP 地址有四个步骤: +-----------------+---------------------------+ | 发送报文类型 | 报文内容 | +=================+===========================+ | | src = 0.0.0.0:68 | + +---------------------------+ | DHCP 服务器发现 | dest = 255.255.255.255:67 | + +---------------------------+ | | yiaddr = 0.0.0.0 | +-----------------+---------------------------+ | | src= 服务器 IP : 67 | + +---------------------------+ | DHCP 服务器提供 | dest = 255.255.255.255:68 | + +---------------------------+ | | yiaddr = 服务器提供的 IP | +-----------------+---------------------------+ | DHCP请求报文 | | +-----------------+---------------------------+ | DHCP ACK 报文 | | +-----------------+---------------------------+