网络层
网络层需要定义发送方和接收方的位置,并且在发送方和接收方中众多的交换机,路由器之中找到一个合理的路径进行传输数据
IP协议报文格式
- 4位版本 (只有IPv4和IPv6两个版本)
- 4位首部长度 (和TCP一样,首部可以变长)
- 8位服务类型 (实际只有4位有效,并且4位中只有一个可以取1,代表IP协议的工作模式)
- 16位总长度 (代表IP数据报的长度)
- 16位标识 (同组的包有相同的标识,便于包的组装)
- 3位标志 (主要有两位起作用,一位代表当前是否分包,一位代表这个包是不是最后一个)
- 13位片偏移 (区分分包后的前后顺序)
- 8位生存时间 (单位是次数,一般是32/64/128,每经过一个路由器转发,次数就会减一,如果这个包的生存时间到了0还没有到达接受方,就销毁这个包,防止这个包陷入传输的循环,空空浪费传输的资源)
- 8位协议 (IP载荷中的数据报使用的传输层的协议,便于接受方在拆包时区分用哪个传输层协议解析数据)
- 32位源IP地址 (发送方IP地址)
- 32位目的IP地址 (接收方IP地址)
- 数据 (载荷)
可以看到我们的IP地址只有32位,也就是说我们最多有42亿9000万个不同的主机,但是由于我们有各种服务器,物联网装备等等,所以这个数量对于我们来说是不够用的,我们通过以下
方式解决这个问题
动态分配IP地址
并不是一个设备出厂时就绑定好一个IP地址,而是只有当其上网时才给分配一个IP地址,不上网时就把IP地址回收。这样的话当美国人那边到了深夜,就很多人不上网了,就可以给我们这分配很多的IP地址
NAT机制
并不是每个主机都有独立的IP地址
将IP地址分成两类
- 外网/公网IP
- 内网/私网/局域网IP(例如10.xxx ,172.16xxx,172.31.xxx,192.168.xxx 这些都是内网IP)
我们约定在同一个局域网内部,IP地址不可以重复,而在不同的局域网下,IP地址可以重复。在局域网内部如果访问外网的服务器,就用一个外网的IP来代替局域网中的所有设备
例如我的路由器的IP地址是1.2.3.4,我有三个设备,手机IP是192.168.1.1,平板IP是192.168.1.2,电脑IP是192.168.1.3。这些设备在我的局域网中的IP地址是不能相同的。当我想拿我的手机访问CSDN的服务器(IP是5.6.7.8)时,会构造这样的一份数据报
源IP地址:192.168.1.1
目的IP地址:5.6.7.8
而当这个数据报传输到路由器上时,会将192.168.1.1替换成1。2.3.4,并且记录这个映射关系,然后把数据发送给CSDN的服务器,服务器会收到这样的数据报
源IP地址:1.2.3.4
目的IP地址:5.6.7.8
然后CSDN会根据请求生成响应,构造下面这样的数据报
源IP地址:5.6.7.8
目的IP地址:1.2.3.4
而当这个数据发送到路由器上,路由器会根据之前的映射关系,把1.2.3.4替换成192.168.1.1,再发送回我的手机上
这样的话,我们就可以用一个外网IP地址代替很多的设备的IP地址,也就可以解决IP地址数量不够用的问题了
使用IPv6
上述两个方法只是把不够用的资源通过不同的分配方式分给了主机,使得IP地址够用。然而想要根本上解决这个问题,我们可以使用IPv6这个协议。
IPv4使用4个字节表示IP地址,因此只有42亿个
而IPv6使用14个字节表示IP地址,这个数量就算给地球上每个沙子分配一个IP地址,也是够用的。
而IPv6之所以没有大量普及,就是因为其和IPv4不兼容,因此需要花钱换路由器。然而在国家的强制要求下,许多企业都升级成了IPv6,这也是防止美国对我们的限制
IP地址
主要分为以下两个部分
- 网络号,用来标识网段,相互连接的两个网段有不同的标识
- 主机号,用来标识主机,同一网段下的主机有相同的网络号,但是有不同的主机号
也就是说,同一个局域网下的设备的网络号是相同的,不同的主机有不同的主机号,两个相邻的局域网的网络号是不同的
而子网掩码(32位)可以划分出来从哪一位到哪一位是网络号
例如这32位中前面是23个一,就代表前23位是网络号,后9位是主机号,而所有连接在同一个局域网中的设备的网络号相同,因此前23位都是相同的
而如果我的路由器连接了两个局域网,那么这两个局域网的网络号是不同的,也即是前23位是不同的
特殊的IP地址
- 主机号为0,代表这个IP是网络号
- 主机号为1,代表这个IP是这个局域网的网关(一般就是路由器)
- 主机号为全1,代表这个IP是广播IP
- 127.XXX,代表这个IP是换回IP(例如我们的127.0.0.1)
路由选择
之所以我们的数据能够从发送者精确的规划出路径传送到接受者,就是因为路由选择的概念
当我们的数据到达路由器时,会把我们的数据报中的IP地址提供给路由器,路由器中有一个叫“路由表”的数据结构,也就是这个路由器认识的通往各个IP地址的路,如果认识,就直接告诉数据报应该怎么走,如果不认识,路由器就会把这个数据报转发给别的有可能认识的路由器
因此这个概念就相当于我们出去找地一样,问一个大爷路,这个大爷也许不知道应该怎么走,但是会告诉你一个大致的方向,你按照这个方向再去问问别人怎么走