网络层典型协议–IP协议
文章目录
前言
网络层协议,提供地址管理与路由选择,描述了通信两台主机的IP地址。
在复杂的一个网络环境中规划一个合适的路径。
1 IP协议格式
4位版本号
:指定IP协议的版本,ipv4就是44位首部长度
:以4字节为单位,4bit表示最大的数是15,所以IP报头最大长度是60,最小20字节。8位服务类型(TOS)
:3位优先权字段弃用,4位服务类型,1位保留(必须置0)
4位TOS字段
:
最小延时
、最大吞吐量
、最高可靠性
、最小成本
,这四个字段是互相冲突的,只能选其一,不同情况选择不同的字段。
如,ssh/telnet这样的应用程序,最小延时比较重要;ftp这样的程序,最大吞吐量就比较重要。
16位数据报长度
:限制一个IP报文包含报头在内的最大不能超过 65535
udp报文中最大数据大小必须小于 64k-8-2016位分片标识
:标识当前分片属于哪个原始报文。
唯一的标识主机发送的报文,若报文在数据链路层被分片了,那么每一个片里面的id都是一样的。
- 链路层中MTU,会限制传输报文的大小,以太网协议默认大小为 1500,若一个报文在网络层封装了IP报头之后大于了MTU大小,数据就会在链路层无法传输,这就需要在网络层进行数据分片,将一个报文分割成多个小的报文,分别封装IP报头进行发送,分割后小的报文称为分片;大的报文被分成多个小的分片进行传输,多个分片到达对端网络层就需要分片重组,重新组成一个完整的报文后交付给传输层。
- 因为网络状态不定,分片可能会出现乱序,那如何区分哪个分片属于哪个原始报文?
16位分片标识,标识当前分片属于哪个原始报文。- 如何获知当前分片在原始报文的哪个位置?
13位分片偏移,标识当前分片在原始报文中的位置。
3位标志
:
第一位保留
第二位置为1表示禁止分片,此种情况下,若报文长度大于MTU,IP模块就会丢弃报文
第三位表示更多分片,若分片,最后一个分片置1,其余置0
13位片偏移
:标识当前分片在原始报文中的位置,分片偏移单位为 8 字节。
故实际偏移的字节数为**(该值*8)**,所以除了最后一个报文之外,其它报文的长度都必须是8的整数倍。
如,实际偏移为 56544 字节,实际的分片偏移就是 56544 / 8=7068 。8位TTL
:存放一个数据在网络中所能经过的路由器跳数,每经过一次路由器就会减1,为0时,就会将报文丢弃,主要是为了避免路由环路的情况。8位协议类型
:当前IP报文所封装的数据所使用的协议类型,即上层协议的类型。
16位首部检验和
:使用CRC进行校验,检验数据一致性和鉴别头部是否损坏32位源端IP地址 & 32位对端IP地址
:描述数据从哪儿来到哪儿去选项数据
:0-40字节选项数据传输层数据
2 网段划分
IP地址分为两部分:网络号+主机号。
- 网络号:一个网络的标识,一个网络所分配的IP地址中都会包含有该标识
通过网络号,路由器能够判断出某个IP地址属于哪个网络- 主机号:一台主机在一个网络中的标识
通过主机号,路由器能够判断某个IP是当前网络中的哪个主机
不同的子网就是把网络号相同的主机给放在一起;若在子网中增加一台主机,则这台主机的网络号和子网的网络号一致,但是主机号不能和子网中的其它主机重复。
2.1 网络号的划分
类别 | 网络号与主机号 | 表示IP范围 | 网络数 | 主机数 |
---|---|---|---|---|
A类 | 第一个字节表示网络号 | 0.0.0.0 ~ 27.255.255.255 | 128 | 16777216 |
B类 | 前两个字节表示网络号 | 128.0.0.0 ~ 191.255.255.255 | 16384 | 65536 |
C类 | 前三个字节表示网络号 | 192.0.0.0 ~ 223.255.255.255 | 2097152 | 256 |
A类网络适用于组建大型网络;B类网络适用于组建中型网络;C类网络适用于组建小型网络。
而此种划分情况,我们可以看到,划分出来的网络数和主机数要么很多要么很少,这势必会造成地址的额外浪费。
2.2 子网掩码
为解决简单分类导致的IP分配不合理和浪费问题,就出现了子网掩码。
🤔情景:
假设现在一个地区分配了一个C类的网络 192.168.1.x
,但是该地区只有4台主机,只需要4个不同的IP地址,多了就会造成浪费,在不考虑特殊地址的情况下,我们知道,x的范围是0~255,所以就只需要 192.168.1.0
、192.168.1.1
、192.168.1.2
、192.168.1.3
这四个地址,剩下的 4 ~ 255的地址都不要,这样,就得用一种方法来表示这四个IP地址同属于一个网络。
即子网掩码,实际上,子网掩码就是为了划分网络号和主机号的,要表示192.168.1.0 ~ 192.168.1.3
的网络号,先把这些十进制的IP地址转化位二进制,因为分配的网络是 192.168.1.x
,即表示前三个字节是不变的,作为网络号的部分,所以用二进制的1来表示锁定前三个字节部分的二进制,那么就锁定了24位二进制数,而 192.168.1.0
、192.168.1.1
、192.168.1.2
、192.168.1.3
地址中最后一个字节的八位二进制数中前六位二进制数也是一样的,也用二进制的1来进行锁定,而剩下的两位二进制数就是用来表示主机号了,用二进制的0来表示不锁定;如此之后,最后将锁定部分的二进制数转化为十进制,就是 255.255.255.252
,而此数就是所谓的子网掩码。
过程如下:
可以看到,这样的子网掩码写起来很长,CIDR
的方式来进行简洁表示。
上述的情境中,我们将高30位锁定为1,即故该子网掩码可以表示成 192.168.1.0/30
。
3 特殊的网络及IP地址
3.1 特殊网络
组建私网--NAT技术
搭配NAT技术,即网络地址转换技术,将私网向外发送的数据,在流经网关的时候,进行网络地址的替换,替换成为网关设备向外的地址,并且在设备中,记录对应的映射关系。
网络划分的时候,专门为组建私网划分了专门的网络号:
10.*.*.*
/ 172.16.*.* ~ 172.32.*.*
/ 192.168.*.* ~ 192.168.255.*
其中,私网的网络号,只要注意相邻的网络不使用相同的网络号,就能保证私网地址不冲突。
因为私网主机对外通信都是使用对外的公网地址,经过NAT网络地址替换之后,对外的地址是不冲突的,所以不相邻的私网,是可以使用相同的网络号,即IP地址可以重复。
- 一个路由器可以配置两个IP地址,WAN口IP和LAN口IP(子网IP)
- 路由器LAN口连接的主机,都从属于当前该路由器的子网中
- 不同的路由器,子网IP地址实际上都是一样的(通常是 192.168.1.1 ),子网中主机不可重复,子网内主机IP地址不能重复,但不同子网内主机就可以重复
- 每一个家用路由器,实际上又作为运营商路由器的子网中的一个节点,如此的运营商路由器可能会有很多级,最外层的运营商路由器WAN口IP就是一个公网IP
- 子网内主机需要和外网进行通信的时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP,此技术,即NAT地址转换技术。
- 若自己实现的服务器程序,希望能够在公网中被访问到,就需要将程序部署到一台具有外网IP的服务器上。
3.2 特殊的IP地址
0.0.0.0
:代表本地主机上的任意网卡IP地址,通常用于服务端程序的绑定监听地址。255.255.255.255
:全网广播地址。主机号全为0的地址
:成为了网络号,是网络的标识,代表该局域网,不可分配给主机。主机号全为1的地址
:局域网广播地址,用于给同一个链路中互相连接是所有主机发送数据包,也不可分配给主机。127.0.0.1
:本地主机上的虚拟回环网卡地址,主要用于本地网络回环测试。
所以在前面阐述子网掩码的情景中,最后处理的结果是 192.168.1.0/30
网络,但实际上,192.168.1.0
是网络号不可分配,192.168.1.3
是局域网广播地址也不可分配,所以该网络中可分配的IP地址只有 192.168.1.1
和 192.168.1.2
这两个地址。
4 IP地址的数量限制
ipv4,一个4字节32位的正整数,就有2的32次方的IP地址,tcp/ip协议规定,每个主机都需要一个IP地址,那是代表只能有改数量的主机可以接入网络吗?
实际上,由于一些特殊IP地址的出现,数量远没有这么多,而IP地址也并非是按照主机台数来进行配置的,而是每一个网卡都需要配置一个或多个IP地址。
CIDR在一定程度上缓解了IP地址的浪费问题,但是实际上IP地址的数量并没有得到增加。IP地址还是存在地址不够用的情况。
解决方法:
- 动态分配IP地址:
只给接入网络的设备分配IP地址,故同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。- NAT技术(网络地址转换技术):
一个私网向外发送数据,流经网关设备的时候,需要进行网络地址转换,替换成为网关设备对外的地址,并且在设备中,记录其映射关系。- IPv6:
用16字节128位来表示一个IP地址,但是并不向前兼容IPv4,目前并未普及。
5 路由器
在复杂的网络结构中,找出一条通往终点的路线。
路由选择:路由器为流经的数据选择合适的路径进行转发。
所谓一跳,就是数据链路层中的一个区间,具体在以太网中指从源端MAC地址到目的MAC地址之间帧传输区间。
IP数据包的传输过程:
- IP数据包到达路由器时,路由器先查看目的IP
- 然后路由器决定该数据包是能直接发送给目标主机,还是需要发送给下一个路由器
- 依次重复进行,知道数据到达目标主机
那该过程是如何判定该数据包该发送给目的主机还是下一个路由器呢?
实际上,路由器中每个节点内部都维护了一个路由表。
★ 查看主机网络接口配置和路由表
route
[dev@localhost ~]$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 eth0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.153.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[dev@localhost ~]$
可以看到,当前主机有两个网络接口,一个网络接口连到 192.168.122.0/24 网络,一个网络接口连接到 192.168.153.0/24 网络。
表相关信息:
- Destination:目标网络网络号
- Gateway:网关地址,表示下一跳地址
- Genmask:表示子网掩码
- Iface:连接该网络的网卡
- Flags
U:表示此条目有效
G:表示此条目的下一跳地址是某一个路由器的地址
没有G的标志条目表示目的网络地址是与本机接口相连的网络,不必经路由器来转发
每个路由器连接了多少个网络就会有多少块网卡,每一块网卡都能获取一个对应所在网络的IP地址,它的路由器中就会有多少条路由信息。
总结
网络层,提供了地址管理和相关的路由选择,描述通信两台主机的IP地址,典型设备即路由器。