✨个人主页:bit me
✨当前专栏:Java EE初阶

目 录

  • 一. IP协议报头格式
  • 二. IP 地址
  • 三. 路由选择

网络层协议的工作:

  1. 地址管理
  2. 路由选择(规划路径)

网络层中,最核心的协议就是 IP 协议

一. IP协议报头格式

协议头格式如下:

  • 4 位版本号当前 IP 协议的版本号,有 4 和 6 ,此文我们以 IPv4 为主!
  • 4 位首部长度IP 报头的长度。带有选项字段(可以有,也可以没有,可以有一个,也可以有多个)(0 – 15 的单位是 4 个字节!最长是 60 个字节,最短是 20 个字节)
  • 8位服务类型(TOS)(Type Of Service)其实有效位为 4 位,另外 4 位是保留位。

有效的 4 位是:4 个服务类型的 bit 位是互斥的,一个报文里面 4 个位只有一个可以是 1 ,剩下的都是 0,用来表示当前的 服务类型。(4位 TOS 分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。)可以根据需求来切换到不同的形态,虽然提供了这个,但是影响是有限的,实际开发的时候,很少真的手动调整 TOS。

4 个保留位:现在不用,但是先占个位置,后面可能要用,给后续的拓展留下余地。

  • 16 位总长度(字节数)一个 IP 数据报有多长(报头 + 载荷)。载荷部分就是一个完整的传输层数据报!(比如完整的 TCP 数据报)

16 位意味着,一个 IP 数据报最大就是 64 KB?

例如我们前面学的 UDP,UDP 是被 64 KB限制死了的,UDP 想要传输更大的应用层数据报,需要在代码中手动拆包组包。而当前的 IP 协议,自己内置了拆包组包的功能!如果搭载太长了的 TCP 数据报,此时 IP 就会分包!每个包来携带 TCP 的一部分数据!拆包组包在这里是不需要我们自己动手的,它自己携带有(下面三个就都是的)

  • 16 位标识:同一个包拆出来的若干个小的包,标识是一样的
  • 3 位标识:说是 3 位,其中 1 位是最关键的,标识结束标记~,1 后面还有,0 后面没了(类似于 链表的 null),还有一个标记描述是否分包了!
  • 13 位片偏移:描述了拆出来的每个包的先后顺序


例如网络层构造出上述数据报之后,发现载荷部分太长了,超出最大长度限制了,于是就进行拆包!

片偏移大小不是随便给的,内部有规则进行计算,此处我们不多了解,我们只需要知道小的在前,大的在后即可,即使接收方 “后发先至” 了,也可以通过片偏移把若干个包进行重新排序组合。

如果需要在 UDP 这里,实现拆包组包,可以参考此处 IP 的机制上述三个字段

  • 8位生存时间(TTL):描述了这个 IP 数据报,还能在网络上存活多久!

网络环境非常复杂,例如 A 给 B 发送一个 IP 数据报,数据报就会沿着网络尝试去找 B 的位置,如果 B 存在,能找到,就直接发过去了,如果 B 不存在,找了半天没找到,就要放弃了。

此处的整数并不是 “秒” 这样的时间单位,而是表示次数!能够被转发的次数~,例如给定一个初始 TTL 为 64(32,64,128),每次数据报经过一个路由器的转发,TTL -= 1,一旦 TTL = 0,则认为这个 IP 就找不到,包就要丢弃

  • 8 位协议:表示了传输层使用了哪个协议
  • 16 位首部校验和:校验和和前面的校验和都是一样的,这个校验和只针对 “首部” ,而不对数据部分校验,数据部分的校验自然是传输层的协议来负责。
  • 32位源 IP 地址和32位目标 IP 地址:表示发送端和接收端。

    类似于一个包裹的传输,上述四个元素必不可少

IP 地址本质上是一个 32 位的整数,因为 32 位的整数不方便看,也不方便记,因此就发明出了另外一种表示方式:点分十进制~。使用三个点把 32 位的整数,分成四个部分(每个部分 8 位,1 个字节)每个部分取值 0 – 255。


二. IP 地址

IP 地址能保证唯一性吗?

能否给每一个主机都分配一个唯一的 IP 地址呢?(最初设计 IP 协议初心是这样的),但是后来由于网络发展迅速,32 位数字表示的 42 亿 9 千万不够用了,那么该如何解决 IP 地址不够用的问题呢?

  1. 动态分配 IP 地址(DHCP)

一个设备上网就分配 IP 地址,不上网就不分配 IP 地址

  1. NAT, IP 地址转换

把 IP 分成两个大类

  1. 内网 IP (局域网使用的 IP)
  2. 外网 IP (广域网中使用的 IP)

允许局域网之间的内网 IP 重复,但是外网 IP 要保持唯一(同一个局域网中的 IP 地址不能一样,但是不同局域网中的 IP 地址允许重复)

NAT 机制,本质就是用一个外网 IP 代表了一大堆(可能是一个小区,也可能是多个小区,几万人的设备)内网的设备

内网 IP 有三类:

  • 10.*
  • 172.16.* – 172.31.*
  • 192.168.*

这三类 IP 都是内网,其他就是外网 IP 了

  1. IPv6 :解决 IP 不够用问题的终极方案

IPv6相当于是另一个网络层的协议,和IPv4可以视为是完全不同的两个协议,而不是IPv4的升级版~~

lPv6 使用 16 字节(128位)这样的值表示IP地址了(2 ^ 128 = 2 ^ 32 * 2 ^ 32* 2 ^ 32* 2 ^ 32)(相当于 42 亿 *42 亿 *42 亿 *42 亿 *,所以 IP 地址完全够了)

IPv4 是 4 个字节(2 ^ 32)

此处还有一个很大的问题就是 IPv4 和 IPv6 不兼容的问题,现存的支持 IPv4 的网络设备(路由器,网卡,交换机…) 不一定支持IPv6。

IP 地址 是一个四个字节的整数,为了更好的进行组网,对于这个 IP 地址又做出了一些更详细的划分,把一个 IP 分成两段,前一半叫做叫做网络号,后一半叫做主机号。

如何划分呢?以前是把 IP 地址分为五类,A,B,C,D,E类,但是目前这种分法很少见,现在主流的分法是 CIDR。引入了一个 “子网掩码”,通过这个来区分哪个是网络号,哪个部分是主机号,也是一个 32 位的整数,左侧都是 1 ,右侧都是 0。255.255.255.0:标记为 1 的部分,就表示了这部分 IP 是网络号

同一个局域网内部,设备之间的网络号,都是一样的,主机号是不同的;两个相邻的局域网(同一个路由器连接的两个局域网),网络号是不一样的

192.168.0.1 / 192.168.1.1 主机号为 .1 的 IP ,通常用来作为网关(关:入口,出口)(不是绝对的,常见的默认的情况,完全可以手动配置成其他的 IP)

192.168.0.0 / 192.168.1.0 主机号为 .0 的 IP 也就是网络号(表示当前局域网 / 网段)

192.168.0.255 / 192.168.1.255 主机号为 255 的 IP 是广播 IP(如果我们往 192.168.0.255 这个 IP 地址上发送数据,此时整个 192.168.0 这个局域网中所有的设备都会收到这个包)

UDP 实现广播,就可以搭配这个广播 IP

127.0.0.1 / 127.* 环回 IP(表示主机自己),每个主机上都有表示一个虚拟的表示环回 IP 的网卡


三. 路由选择

和地图寻路一样,从 A 到 B 两点之间的路径规划就是路由选择,相比于高德地图或者百度地图,路由规划没有那么大的空间来收集每个地方的位置信息,每个路由器就只能知道位置信息的一部分,它只能只能相邻的一些设备怎么走或者可以知道相邻的设备。路由选择这里的数据转发,就相当于原始的寻路方式:问路!!