网络层
对于网络层来说,它是传输层协议的具体实施,那么它具体是如何实施的呢?
IP协议
IP能够实现将数据从A主机送到B主机,在网络中,每一个IP报文都包含了它的目标网络和目标主机。
而IP协议就是网络层使用的协议。
IP协议报头
为了了解协议,我们需要了解它的报头。
- 4位版本号:表示使用的IP协议的版本(分为IPV4和IPV6)
- 4位首部长度:表示报头的长度,其单位是4字节
- 8位服务类型:三位优先权字段(已弃用),4位TOS字段,和1位保留字段。其中4位TOS字段分别是:最小延迟,最大吞吐量,最高可靠性,最小成本,这四者互相冲突,只能选择一个
- 16位总长度:IP数据报总长度
- 8位生存时间(TTL):数据到达目的地的最大报文跳数,一般为64,每经过一个路由器就-1,目的是防止路由循环
- 8位协议:表示上层协议
- 16位校验和:CRC校验,鉴别头部是否损坏
- 32位源IP地址:发送端的IP地址
- 32位IP地址:接收段的IP地址
其中,IP地址所记录的就是网络号和主机号。
分片
在数据链路层有一个规定,就是发送的数据不可超过1500字节,但是传输层并不关心数据有没有超过1500字节,因此网络层对传输层发下来的数据要进行分片,将数据分开。
如何知道数据被分片了?
解决这个问题我们需要先了解报头中的这三个属性。
- 16位标示:唯一的标识主机发送的报文,若是报文被分片了,同一报文中被分片的数据的标识都是相同的
- 3位标志:第一位保留(目前没用),第二位为1表示禁止分片,第三位为‘更多分片’,如果一个报文的第三位为1,表示它后续还有被分片的报文,为0则表示它是最后一个分片
- 13位片偏移:就是分片相对于原始IP报文开始出的偏移,表示该分片处于原报文的哪个位置,实际偏移量为这个值 *8 ,因此出了最后一个报文,其他报文长度都是8的整数倍
通过这三个属性,我们就知道报文是否被分片了。
若是3位标志的第三个为1表示是分片,若是为0&&13位片偏移大于0也说明是分片。
同一报文的分片则通过16位标示分辨。
而分片的数据则按照13位片偏移来按升序组装,而报头中的校验和则保证数据的正确性。
如何进行分片的?
当传输层发下来三千字节的数据时,网络层的IP协议会先添加报头。
然后发现数据已经超过1500字节了,因此它就会将数据给分片。
第一片包括原来的IP报头和1480字节的数据。
第二片则是纯1480字节的数据,然后添加报头。
第三片则是剩下的40字节的数据,然后添加报头。
网段划分(重要)*
为了提高传输效率,方便定位主机,互联网上的每一台主机都隶属于一个子网,每一台主机在网络上都有自己主机号,每一个子网都有自己的网络号。
我们可以将子网当成学院,主机则是学生,同一个学院的学生的学院号相同,但是它们的学号不同。
而网络通信的过程就像是学生寻找失主的过程。
假设王五捡到了张三的学生证,王五就去学生群里发消息说捡到了学号为 000 123 学号的学生证,让他认领,张三就在学生群中看到了消息,从而找回了自己的学生证。
然后我们更换下概念,学生是主机,学院是这个主机所在的子网,学生群则是公网。
就像图中,同一个网段中的主机标识不同,但是不同网段的主机标识可以相同,而且不同网段的网络号也不同,此外,连接两个子网的就是路由器。
这样就能够保证网络中的主机的IP地址都不相同。
其中路由器在网络中担任了重要角色,它带有DHCP功能,能够自动的给子网内新增节点分配IP地址。
子网掩码
在之前,曾提出过一种划分网络号和主机号的方案,将IP地址分为五类。
- A类:从 0.0.0.0 到 127.255.255.255
- B类:从128.0.0.0 到 191.255.255.255
- C类:从192.0.0.0 到 223.255.255.255
- D类:从 224.0.0.0 到 239.255.255.255
- E类:从 240.0.0.0 到 247.255.255.255
但是这种方案随着网络的发展出现了局限性,大部分组织都申请的是B类的IP地址,导致B类很快就分配完了,但是A类却浪费了大量地址。
因此又提出了新的划分方案:CIDR。
- 引入了额外的子网掩码来区分网络号和主机号
- 子网掩码是一个32位的正整数,通常由一串 ‘0’ 结尾
- 将IP地址和子网掩码进行 “按位与” 的操作,就得到了网络号
- 而网络号和主机号的划分与这几个方案都无关
例如:
通过与操作能够成功的计算出网络号和子网地址范围。
此外还有一种特殊的表述方法:140.252.20.68/24,就表示IP地址是 140.252.20.68,子网掩码高24位为1,也就是 255.255.255.0 。
特殊的IP地址
- 主机地址全为0表示网络号,也就是这个局域网
- 主机地址全为1表示广播地址,也就是给同一链路中的所有主机发送数据包
- 127.*表示本地环回测试,一般是127.0.0.1
IP地址的数量限制
由于特殊IP地址和网络高速发展,IPV4版本的IP协议已经不够用了。
即便有CIDR来缓解,但是依旧治标不治本。
因此各界大佬提供了三种方案。
- 动态分配IP地址:只给接入网络的设备分配IP地址
- NAT技术
- IPv6协议:是一个128位16字节的协议,能够大大缓解当前IP地址不足的问题
私有IP和公网IP地址
一般组建局域网的都是私有IP,而私有IP是规定了的。
- 10.*,前8位是网络号
- 172.16到172.31,前12位是网络号
- 192.168.*,前16位是网络号
- 在这个范围内的都是私有IP
而公网都需要运营商的路由器来连接。
- 每台主机发送数据都需要经过家用路由器,企业路由器然后放到广域网中,再发送给对应的主机以此来通信。
- 每一个路由器可以配置两个IP地址:WAN口IP和LAN口IP(子网IP)
- 路由器LAN口连接的主机都从属于该路由器的子网
- 每个路由器它的LAN口IP都相同,但是子网内的主机IP不同,不过子网之间的IP地址就可以重复了
- 最外层的运营商路由器的WAN口IP就是公网IP
- NAT技术就是每一层路由器将IP首部的IP地址进行替换,这一层的WAN口IP变为上一层的LAN口IP,逐级替换最后到公网IP
路由
目前我们已经知道了网络通信实际上是主机发送数据包给路由器,路由器通过数据报上的目的IP来一层一层的找到对应主机,那么IP协议是如何做到的呢?
实际上IP协议这种一层一层找到对应主机的路的方式叫做路由,而路由就是靠路由器内部维护的路由表。
路由表
在网络中的每个节点都维护着自己的路由表。
在命令行中可以用 route 命令查看。
- Flag 中的 U 表示此条目可用,带有G表示下一跳是路由器地址,没有G则表示同一子网中的其他主机地址
当我们发送数据报时,就是在路由表上通过与子网掩码运算,来和目的地址对比,若是运算后有对应的目的地址,就直接跳转,没有就采用默认目的地址,通过路由发送到其他子网上去。
通过这样的方式,我们经过一层一层的路由表的子网掩码计算得到的目的IP会越来越准确,最终定位到目标主机。
总结
本篇博客了解了什么是IP,IP协议的报头格式,以及报头各个属性的作用,然后还了解了什么是分片。
而后了解到为了方便定位主机,提高传输效率,大佬们提出了网段划分,但是随之而来的是IP地址的不足,为了解决这个问题大佬提出了子网掩码的解决方法,还了解到一些特殊的IP地址以及IP地址的数量限制。
后面又了解到私有IP的划分,还了解到不同局域网之间的主机进行通信的大致过程,还了解了路由以及每个节点维护的路由表。
以上就是网络层协议的内容。