网络篇10 | 网络层 IP
- 01 简介
- 02 名称解释
- 03 IP报文格式(IPv4)
- 1)4位版本协议(version)
- 2)4位首部长度(header length)
- 3)8位服务类型(Type Of Service, TOS)
- 4)16位总长度
- 5)16位(分片)标识
- 6)3位(分片)标志
- 7)13位片偏移
- 8)8位TTL
- 9)8位协议
- 10)16位校验和
- 11)32位源地址
- 12)32位目的地址
- 13)选项字段(不定长, 最多40字节)
- 04 网段划分
- 1)5类IP地址
- 2)公网IP地址
- 3)私有IP地址
- 4)多播(Multicast)通信
- 5)特殊的保留地址
- 05 IP地址的数量限制
- 1)CIDR子网掩码
- 2)动态分配IP地址
- 3)NAT技术
- 4)IPv6
- 06 路由选择
- 1)路由表维护
- 2)路由选择过程
01 简介
对上可载送传输层各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。
IP地址是定位主机的,具有一个将数据报从A主机跨网络可靠的送到B主机的能力。但是有能力就一定能做到吗,只能说有很大的概率。TCP为IP提供策略,IP用于执行行动。
02 名称解释
- 主机: 配有IP地址, 但是不进行路由控制的设备;
- 路由器: 即配有IP地址, 又能进行路由控制,一般都带有DHCP功能,可以看做一个DHCP服务器。
- 节点: 主机和路由器的统称;
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
- 不同的子网其实就是把网络号相同的主机放到一起,;
- 子网:其实就是把网络号相同的主机放到一起。
- DHCP技术:能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
03 IP报文格式(IPv4)
1)4位版本协议(version)
通信双方的IP协议必须要达到一致, IPv4的版本就是4
2)4位首部长度(header length)
定义了IP协议首部(报头)的长度, 以4字节为单位, IP报头是不定长的, 首部长度范围 [5, 15] 即 [20字节, 60字节]
3)8位服务类型(Type Of Service, TOS)
3 位优先权字段(已经弃用), 4位TOS字段, 和一位保留字段(此位必须置0), 思维TOS分别表示 : 最小延迟, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能有一个置1. 对于ssh/telnet这样的应用程序, 最小延时标胶重要, 对于ftp(文件传输协议)类型的程序, 最大吞吐量比较重要.
4)16位总长度
IP数据报整体占多少个字节(单位是字节), 16位能表示的最大数是 65535, 即65535字节, 即64k, 那么TCP的数据肯定不能大于64k -20-20, 一个20是IP报头最次小长度, 一个20是TCP报头的最小长度; UDP的数据肯定不能大于64K-20-8, 第一个20也是IP报头的最短长度, 8是UDP报头的长度. TCP会在传输层根据MSS(最大分段大小, Maxitum Segment Size)自动进行数据分段; UDP在传输层不会分段; 传输的IP报文还受到下层数据链路层的MTU(最大传输单元, Maximum Transfer Unit)的限制; 而TCP中的MSS就是根据数据链路层的MTU计算的. UDP在在传输层不会分段, 所以当UDP数据大小 大于 MTU 而小于64k 20-8 时, 数据就会在网络层进行分片
5)16位(分片)标识
在进行数据分片重组的时候表示数据分片属于那个完整的UDP报文, 具体来说, IP在存储器中维持一个计数器, 每产生一个 数据报, 计数器就加1, 并将此值赋给标识字段. 但这个标识并不是平常的序号,因为IP是无连接, 不可靠服务, 数据报不存在按序接收的问题. 当数据报由于长度超过链路层的MTU而必须分片时, 这个标识字段的值就被复制到所有的数据报片的标识字段中, 等到对端重组的时候, 相同标识符的值的数据报就会被重新组装成一个数据报.
6)3位(分片)标志
高位未用, 中间位DF置1, 表示不能进行分片,置0才可以进行分片操作. 最低位MF, 置1表示后面还有数据分片,MF=0表示这已经是最后一个数据分片了.
7)13位片偏移
标识一个分片在原始UDP报文中的位置, 以8字节为单位, 例如将一个10001的UDP报文按256字节分片后, 第一片的数据报的片偏移就是0, 第二片数据报的片偏移就是256/8 = 32, 第三片就是512/8=64, 第四片就是768/8=96, 第四片并没有256个字节, 如果分片前的数据不能够被8整除, 那么分片后的最后一个数据大小就是分片前的数据报大小除以8的余数. 可以看到不管分片前的大小能不能被8整除, 片偏移永远是8的整数倍.
8)8位TTL
报文在网络中的生存周期 – 即跳数, 指的是能够经过多少路由器, 每经过一个路由器就称为一跳, 该值就减1, 为0时就被网络丢弃掉, 8位TTL, 最大值为2^8 - 1 = 255.
9)8位协议
标识传输层使用的是什么协议, 用于数据分用
10)16位校验和
二进制反码求和, 用于校验数据的一致性
11)32位源地址
用于标识源端,
12)32位目的地址
用于标识对端主机, 路由器就是根据对端主机IP地址进行路径选择的
13)选项字段(不定长, 最多40字节)
基本很少用到;
04 网段划分
IP地址分为两个部分, 网络号和主机号。192.168.10.20,网络号为192.168.10,主机号为20。
1)5类IP地址
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示(该图出 自[TCPIP])。
随着互联网的飞速发展, 这种划分方案的局限性很快就显现出来, 大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址. 这是因为申请一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更是达到数千万之多, 然而实际网络架设中, 不会存在一个子网内有这么多主机的情况. 因此大量的A类IP地址都被浪费掉了.
A类 : 0.0.0.0 ~ 127.255.255.255,高1位固定 + 7位网络号 + 24位主机号, 网段的选择就是0 ~ 127, 最多容纳2^24-2台主机, 即16777214台主机, 用于组建超大型的网络
B类 : 128.0.0.0 ~ 191.255.255.255,高2位固定 + 14位网络号 + 16位主机号, 网段的选择就是128.0 ~ 191.255, 最多容纳2^16-2台主机, 即65534台主机, 用于组建中型网络
C类 : 192.0.0.0 ~ 223.255.255.255,高3位固定 + 21位网络号 + 8位主机号, 网段的选择就是192.0.0 ~ 223.255.255, 最多容纳2^8-2台主机, 即254台主机, 用于组建小型网络
D类 : 224.0.0.0 ~ 239.255.255.255,高4位固定 + 28位多播组号。
E类 : 240.0.0.0 ~ 247.255.255.255,高5位固定 + 27位留用。
2)公网IP地址
- A 类:0.0.0.0 到 127.255.255.255(1.0.0.0 到 126.255.255.255 是保留地址,不分配给网络设备)
- B 类:128.0.0.0 到 191.255.255.255(172.16.0.0 到 172.31.255.255 是保留地址,不分配给网络设备)
- C 类:192.0.0.0 到 223.255.255.255(192.168.0.0 到 192.168.255.255是保留地址,不分配给网络设备)
3)私有IP地址
RFC 1918 规定了三个私有 IP 地址段,在组织内部构建局域网时,可以使用私有 IP 地址进行内部通信,而无需直接连接到因特网上。
- 10.0.0.0 到 10.255.255.255(共计 16,777,216 个地址)
- 172.16.0.0 到 172.31.255.255(共计 1,048,576 个地址)
- 192.168.0.0 到 192.168.255.255(共计 65,536 个地址)
这些私有 IP 地址段是专门为内部网络通信保留的,不会被路由器转发到因特网上,避免与全局 IP 地址冲突。
4)多播(Multicast)通信
- D 类和 E 类属于 IPv4 地址空间中的特殊地址范围:
- D 类:224.0.0.0 到 239.255.255.255,用于多播组通信。D 类地址用于多播(Multicast)通信,一次发送数据到多个目标设备。在多播通信中,数据包被发送到一个预定义的组,而不是单个目标设备。
- E 类:240.0.0.0 到 247.255.255.255,属于未分配或保留地址空间。E 类地址原本曾被用作实验性地址或为将来使用保留的地址空间。这些地址并没有常规应用,可以说是未指定的保留地址。
总结起来,D 类用于多播通信,而 E 类则是未分配或保留的地址空间,在现有网络中并没有明确定义的使用方式。
5)特殊的保留地址
除了 A 类、B 类和 C 类中的私有 IP 地址段(RFC 1918 规定的保留地址)外,还有一些其他保留地址段。
- IP地址中的主机号全为0, 就成了网络号, 代表这个局域网
- 将IP地址中的主机号的二进制全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包(此时目的地址当然就被设为了广播地址)
- 127.0.0.1. 它代表设备的本地虚拟接口, 所以默认被看作是永远不会宕掉的接口. 所以通常在安装物理网卡前就可以ping通这个本地回环地址. 一般都会用来检查本地网络协议、基本数据接口等是否正常的.
- 0.0.0.0 标识本机上的所有网卡, 用与TCP服务端程序的绑定地址, 相当于监听本机的所有网卡.
- Loopback 地址:127.0.0.0 到 127.255.255.255(127.0.0.0/8),用于本地回环测试,通常表示本机自身。
05 IP地址的数量限制
IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址. 这意味着, 一共只有43亿台主机能接入网络么?实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址。
1)CIDR子网掩码
对于这种情况, 人们提出了新的划分方案, 称为CIDR(Classless Interdomain Routing) :
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号(和IP地址一样也用点分10进制来表示)
- 子网掩码也是一个32位的无符号整数. 通常用一串 “0” 来结尾, (所以说子网掩码的二进制从高位到低位的1肯定是连续的)
- 将IP地址和子网掩码进行 按位与 操作, 得到的结果就是网络号
- 网络号和主机号的划分与这个IP地址是A类, B类还是C类无关
例子1 : IP : 140.252.20.68 子网掩码 : 255.255.255.0 ==> 网络号 : IP和子网掩码按位与 :140.252.20.0
==> 子网地址范围就是主机号的二进制从全0到全1, 140.252.20.0 ~ 140.252.20.255
例子2 : IP : 140.252.20.68 子网掩码 : 255.255.255.240 ==> 网络号 : IP和子网掩码按位与 :140.252.20.64
==> 子网地址范围就是主机号的二进制从全0到全1, 140.252.20.53 ~ 140.252.20.79
IP地址和子网掩码还有一种更加简洁的表示方法, 例如 : 140.252.20.68/24, 表示IP地址是140.252.20.68, 子网掩码的高24位全为1, 也就是255.255.255.0
最大的主机号 + 1 就是局域网中主机的个数. 再看一个例子:
某公司网络的网段是192.168.2.0/24, 现在公司想从这个网段中划分出四个子网, 给公司的四个部门, 问, 每个子网的网络号以及子网掩码是多少, 以及每个子网中的IP地址范围是多少?
首先, 这是一个C类网络, 一个C类网络可以有256个主机号, 分为4个子网, 则每个子网的主机号个数就是64, 那每个子网中最大主机号就是64 - 1 = 63, 这个值就是子网掩码取反后的值, 那子网掩码就是63取反的值, 为255.255.255.192
四个子网的子网掩码是一样的, 因为其能分配的主机数都是一样的, 这道题中子网掩码为255.255.255.192
第一个子网IP范围 : 192.168.2.0 ~ 192.168.2.63 -- 网络号 : 192.168.2.0
第一个子网IP范围 : 192.168.2.64 ~ 192.168.2.127 -- 网络号 : 192.168.2.64
第一个子网IP范围 : 192.168.2.128 ~ 192.168.2.191 -- 网络号 : 192.168.2.128
第一个子网IP范围 : 192.168.2.192 ~ 192.168.2.255 -- 网络号 : 192.168.2.192
2)动态分配IP地址
利用DHCP协议, 给接入网络的设备动态分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的
3)NAT技术
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP)。WAN口IP对外,LAN口IP对内
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
4)IPv6
在2019年11月26日15时35分, 位于荷兰阿姆斯特丹的IP地址管理机构正式宣布, 全球43亿(具体是2^32)个 IPV4地址已经全部分配完毕, 但我们还有IPv6协议可以用, IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 目前IPv6已经开始部署, 但还没有完全普及。
06 路由选择
1)路由表维护
路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由).相关的算法有距离向量算法, LS算法, Dijkstra算法等。
2)路由选择过程
路由就是在复杂的网络结构中, 找出一条通往终点的路线; 路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程.所谓 “一跳” 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间
过程如下 :
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
重复这个过程, 一直到达目的IP(或者TTL为0时被丢弃)
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表。
- 路由表可以使用route命令查看;
- 如果目的IP命中了路由表, 就直接转发即可;
- 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
- Destination : 目的网段 (与我相连的网络的网络号)
- Gatway : 网关(下一跳路由器入口的ip)
- Getmask : 子网掩码
- Metric : 跳数, 该条路由记录的质量, 一般情况下, 如果有多条到达相同目的地的路由记录, 路由器会采用metric值小的那条路由
- Use Iface : 与这个网络相连的网卡名称
以上图路由表为例, 对于一个到达该节点(主机或路由器)的IP数据包,逐行检查目标IP地址与路由表中的每一行。首先,将目标地址与第一行子网掩码255.255.0.0 进行按位与操作,如果结果与网络号172.17.0.0 相等,则目标主机在本地局域网内,直接转发即可。若不相等,则继续与下一行子网掩码进行比较。重复这个过程,直到找到匹配项为止。如果所有行都不匹配,则将数据包发送给上层网关处理。
转发的过程:遍历路由表,目的IP & 路由表中配置的Genmask,确定该报文要去的目标网络,对比结果和Destination,通过IFace接口发出报文