网络层协议IP

网络层的作用
在复杂的网络环境中通过IP确定目标主机的合适路径
IP协议
- 主机 :配有IP地址,但是不进行路由控制。
- 路由器 :配有IP地址,能够进行路由。
- 节点:主机和路由器的统称。
IP协议的报头格式

- 4位版本号:指定IP协议的版本,IPv4对应就是4。
- 4位头部长度: 对应IP报头的长度,这里类似于TCP协议中的首部长度,由于报头的长度是变长的,因此我们通过头部长度*4表示整个报头的长度。
- 16位总长度:IP数据报的整体长度。
- 8位上层协议:表示上层协议的类型。
- 8位生存时间:计算机网络是一个巨大的拓扑网络,如果让数据报一直传输,那么很有可能出现环的问题,因此规定了数据报在网络结构中的存在时间,超过这个时间就会直接丢弃。
剩下的参数都会在下面介绍到
网段划分
IP地址分为两个部分:网络号 + 主机号
- 网络号:保证相互连接的两个网段具有不同的标识。
- 主机号:同一网段内,主机具有相同的网络号,但是具有不同的主机号。
通过合理的设计,能够保证不同的主机一定网络号和主机号不同时相同。
子网掩码
过去曾经提出过一种划分网络号和主机号的方式,把所有的IP地址分为两类,
类型 | 开始的规定字段 | 网络号 | 剩下都为主机号 |
---|---|---|---|
A类 | 0 | 7位网络号 | |
B类 | 10 | 14位网络号 | |
C类 | 110 | 21位网络号 | |
D类 | 1110 | 28位网络号 | |
E类 | 11110 | 27位网络号 |
我们的国家或者组织包括企业都可以去申请这样的网络号。
但是这样划分存在问题🧐
A类网路号的用不完,B类不够用。显然这样的设计会造成很大的浪费😓
所以引入了子网掩码这一个概念,帮助我们进行更细的划分
子网掩码 :
子网掩码通常高位全为1,低位全为零,我们正常的IP地址与子网掩码进行按位与的操作后得到的就是网络号。

比如这是我的电脑的一个IP地址,那么显然我电脑的网络号就是192.168.124.0,主机号位1。
其实还是很好理解的对吧😀😀😀
其实子网掩码的作用就是帮助我们进行动态的调节网络号的。
特殊的IP地址
- 将IP地址中主机地址全部置零就成了网络号,代表这一个局域网。
- 将IP地址中的主机地址全部置一就成了广播地址,用来给同一个链路相互连接的主机发送信息。(这一点我会在数据链路层详细讲解)。
- 127.0.0.1用于本机环回(loopback)。
私有IP和公网IP
如果一个组织内部想要组建局域网,IP地址只用于局域网通信,而不是直接连接到Internet上,理论上可以使用任意的IP地址,但是RFC规定了用于组建局域网的私有IP地址
- 10.*:前八位网络号
- 172.16.*:前12位是网络号
- 192.168.*:前16位是网络号
路由器
路由器具有转发路由的功能,因此一个路由器可以配置两个IP地址,一个叫做LAN口IP,表示局域网所属的子网的IP地址,另一叫做WAN口IP,表示路由器所处的上级的IP地址。
路由器能够实现网络中报文中的转发,必然是跨网段的,也就是说他一定处于两个网段的交界处,这样他才能实现跨网段。我们网络拓扑结构式层状的,假设我们理解成多叉树(现实复杂很多),我们下层节点直接通过路由器向上层节点转发。
IP分片和组装

前面我们提到了IP协议的报头的格式,但是有几个字段我们还没有谈到。比如16位标识,13位片偏移,3位标志。
- 首先我们谈谈IP为什么要分片:
在我们网络层下面还有数据链路层,显然我们一次传递报文的大小是有限制的,肯定不能想要传多大就传多大,所以提到了一个新的概念,MTU(maximum transmit unit)
(英语不好,如果写错了,见谅🥺)
下面就是我的windows操作系统的MTU的大小:
当一个IP数据报大于MTU的时候,网络层就会默认帮助我们进行分片操作。
- 怎么进行分片操作:
分片其实思想很简单,比如我们吃东西,直接吃不下去,但是把他切成小块小块的就很好吃下去。网络层也是这么干的。
这里就可以解释上面IP报头里面的那几个字段的作用了。
这里很重要
- 标识字段:就是判断你们哪些是一家的,当几个报文切片后同时到达一个主机,主机怎么确定那些事一家的,就是通过标识字段。
- 偏移量 :就是编号,你切了我在对端得把你重新拼在一起,就是通过偏移量进行拼接,但是有些人要问,偏移量13位,但是总共大小可以到16位,怎么办?如果你能问出这个问题,说明你很有水平 ,这里我们默认的偏移量的单位是8,也就是说我们默认偏移量是在这个值的基础上*8才是我们真正的偏移量。有人问如果偏移量不是8的倍数怎么办,如果你能问出这个问题,那说明你超级会思考,1500(MTU大小)- 20(报头大小)= 1480显然是8的倍数,所以所以我们的报文的大小一定是1480,1480的发,最后省一点一起发,这个时候,你想一下,如果以他们的首地址编号,是不是一定是8的倍数。😯😯😯
注意
IP分片是一个好的解决方案,但是我们不希望IP进行分片,因为如果一个报文丢失,我们整个报文都会直接作废,一个报文都是的概率是k,那么分片后丢失的概率就是1 -(1-k)^ n,学过一天进步1%那套理论的都能够理解这里面的概率相差多大,或者用matplotlib或者自己求导画个图都知道相差很多。
基于分片再谈TCP/UDP协议
如果你看过我的TCP/UDP讲解或者自己了解,可以看看这里,没看过就算了。
我们谈过TCP具有滑动窗口的策略,当时我没有讲为什么要分成一块一块的发,为什么不能直接发呢,现在应该理解了,就是为了减少IP分片的问题。
UDP协议本来就是限制了传输的大小,同时为了防止IP切片的问题,我们在传输UDP报文的时候,也尽量不要超过MTU的大小
总结
IP协议作为TCP/IP协议族的核心,扮演着互联网通信基石的角色。它如同一位尽职尽责的邮差,在网络世界中穿梭,将数据包准确无误地送达目的地。