网络层
网络层这里重点介绍 IP 协议,首先先解析 IP 数据包:
先介绍第一行:
4位版本号是指使用了哪一个版本的 IP 协议,这里有 IPV4 和 IPV6 两种协议,现在主要使用的是 IPV4 这一个版本号, IPV6 在国内也在逐步推广中,这里重点介绍 IPV4
4 位首部长度就是 IP 报头占多少个 (四字节) ,由此可见 IP 报头最大占 15 * 4 = 60 字节
8 位 服务类型:3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量,最高可靠性, 最小成本. 这四者相互冲突, 只能选择⼀个.
对于 ssh / telnet 这样的应用程序, 最小延时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要
16 位总长度:表示整个 IP 数据包占多少字节
第二行:
因为 IP 数据包是由最大容量限制的,一旦超过这个限制就会进行拆包,如何确认哪些数据包是一组的呢?
这里就使用了 16 位标识:如果是同一组的数据包,那么标识位就是一样的
3位标志位:第⼀位保留(保留的意思是现在不用,但是还没想好说不定以后要用到).第二位置为1表示禁止分片, 这时候如果报文度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后⼀个分片置为1, 其他是0. 类似于一个结束标记.
13位置片偏移:标识这个数据包具体在这一组的哪一个位置,使用偏移量来表示
第三行:
8 位生存时间:表示在网络链路中最多可以经过多少个路由器,每经过一个路由那么次数简易,直到减到0,那么这个数据包就会被丢弃。【因为我们发送的数据包的目的IP 可能是不存在的,那么,为了避免这个数据包无限制地在网络中传输消耗资源,才引入了生存时间】
8位协议:表示上一层使用的是什么协议(UDP/TCP...)
16 位首部校验和:专门校验IP 数据包报头有没有出错
最后就是源IP 和 目的IP 以及选项(选项最大为40字节)
地址管理
首先IPV4的 IP 地址占 4 个字节,也就是 32 个比特位,大约有42 亿个 IP 地址可供使用,由于时代的飞速发展和科技的不断进步,很多设备都需要上网,在十几年前,IPV4的地址已经被分配完了。
既然 IPV4的地址已经被分配完了,那为什么我们还是可以正常上网???
在IPV4耗尽之前,提出了三个解决方案:
动态分配 IP 地址
第一个方案是动态分配IP 地址,因为很多设备不是一天 24 h 都在上网,我们可以将不上网的设备的IP 地址剥夺给其他要上网但没有IP 地址的设备使用,因为要上网的设备特别多,这种方案治标不治本。
NAT
第二个方案是 使用 NAT 技术,也就是网络地址转化技术,将 IP 地址分为公网 IP 和 私网IP
10.*
172.16.* - 172.31. *
192.168.*
上面三种 IP 地址类型是分配给私网使用的,其他 IP 则是属于公网使用的。
NAT 技术就是使用一个公网IP地址给一个私网使用,一个私网里面可以有成千上万台设备,这样在一定程度上缓解了 IPV4 的 IP 地址不够用的困境。
在公网里的 IP 地址是唯一的不可以重复
在同一个私网里IP 地址是唯一的不可重复的,但是不同私网里可以出现重复的 IP 地址,因为这些设备不在同一个私网里,这就是为什么 NAT 技术可以极大缓解 IPV4 的困境
公网IP是不可以主动访问私网的 IP
私网的IP 不可以主动访问其他私网的IP
私网内部的IP 可以访问本私网内部的其他 IP
私网的IP 可以主动访问公网的 IP
公网的IP 可以主动访问公网的其他IP
那么私网 IP 是 如何访问公网的 IP ???
这里使用了网络地址转化技术
首先 私网的 IP 会被转化为公网的 IP,然后进行数据通信
知识补充:
私网的IP里前面固定的数字是网络号,剩余的后面的数字属于主机号,例如一个私网分配到 192.168.*, 假设它使用 192.168 最为网络号,主机号全为 0,也就是 192.168.0.0,这个IP地址表示整个局域网的网络号,不分配给任意主机使用;如果主机号全为1,那么这个地址就是广播地址,192.168.255.255,可以像整个私网的所有设备发送广播。
由于 IPV4 占 4 个字节,我们一般使用点分十进制来表示,方便我们观察,也就是每一个8位二进制的数字使用十进制来表示,后面再加一个点,例如 127.0.0.1
- * 是环回地址,这个地址一般是用于设备自测,例如我们之前写的服务器代码,我们会使用 127.0.0.1这个 IP 地址来进行代码测试,这个IP 地址就是本机默认的IP 地址,发送的数据包发送方和接收方都是本机。
地址转化的原理:
利用私网发送的数据包中的IP 地址和端口号,在 实现 NAT 技术的路由器中有一个表项,里面存在的是私网的 IP 和端口号对应 公网的 IP 和 端口号,因为私网所有的设备都使用 同一个 公网的 IP 地址,所以这里使用 端口号加以区分。
IPV6
第三个解决方案就是 IPV6
IPV6 使用 128 个比特位来表示 IP 地址,也就是 2 ^128-1 这个数量级,也就是 16 个字节
可以为每一粒沙子都分配一个 IP 地址,在根本上解决了 IPV4 地址不够用。
但是由于 IPV6 和 IPV4 不兼容,所以升级为 IPV6 需要更换硬件设备,现在我们使用的方案是再路由器安装 IPV6 的 IP 地址 可以转化为 IPV4 地址的软件,保证不影响当前网络的使用,逐步推进IPV6 的升级,这也是国家网络安全的部署。
路由选择
在路由器上会配置一个路由表
路由表的作用:当某个数据包到达该路由时,下一步应该往哪一个路由走
会存在默认的下一跳的IP 地址,也就是当路由表没有查询到数据包的目的IP 地址的时候,就会将数据包交给下一跳,下一跳的 路由器直到的路会更多,可能存在数据包的目的IP 地址的方向,实在没有会继续交给下一跳。
数据链路层
以太网数据帧
这里的目的地址和源地址都是 6 个字节,为 MAC 地址,MAC 地址是物理地址(和 IP 地址不同,这是直接给硬件标上的地址,每张网卡出厂之前都被标上了唯一的 MAC 地址,由于是MAC 地址占 6 个字节,目前没有被消耗完)
拓展:由于当时设计网络层和数据链路层的大佬们不知道对方都加了地址,所以网络层有IP地址,数据链路层有自己的 MAC 地址,这两种地址都被保留了下来。
IP 地址在网络层使用,关注的是整个网络的转发传输过程,举个例子:加入IP 地址为 129.154.123.183 要发送给 185.146.220.120 一个数据包,那么网络层会使用关注起点和终点MAC 地址是在数据链路层使用,数据链路层关注的是两个相邻的设备之间的转发,还是上面两个IP 地址的转发,在数据链路层不管你的终点和起点,只关心你这个数据包下一个节点应该往哪里走。
数据链路层的载荷部分 类型 有三种:IP, ARP, RARP
帧末尾的 CRC 是校验码
数据链路层的载荷部分最大长度为 1500 字节
由于数据链路层能搭载的载荷比较小,所以IP 数据包在数据链路层经常需要进行拆包和租包
ARP 不是用来传输业务数据的,而是根据 IP 地址来得到对应的MAC 地址,例如通过广播地址,发送 ARP 数据包,获得局域网内的所有的设备的 IP 地址和 MAC 地址,最后路由器构建一张类似哈希表的表来保存 IP 和 MAC 地址。
应用层协议 ------ DNS
网络上为了方便用户的记忆和使用,我们使用域名来命名网址,例如百度的网址是 www.baidu.com
但是计算机里的世界只认识二进制,所以这个域名会被解析为对应的IP 地址,这个工作由 DNS 完成
一开始时,域名解析工作是由主机电脑内置的 host 文件实现的,这个文件记录 域名 和 IP 地址的映射关系
由于互联网的飞速发展,为了适应数以亿计的域名解析工作,于是出现了专门用来进行域名解析工作的 DNS 服务器,这个服务器分为很多级,根,一级,二级等等...
计算机本地会有缓存保存一些域名和对应的IP地址,这样就不用屡次访问DNS 服务器,提高效率,现在访问DNS 服务器进行域名解析一般在几毫秒内完成。
根服务器在美国,其他国家使用镜像根服务器,每隔一段时间就要像根服务器获得新的数据和授权。
为了实现网络独立自主发展,我国大力推动 IPV6 发展,也是因为 IPV6 的升级同样也需要新的 DNS 服务器,目前 IPV6 配置 了 三个根服务器,分别在中,美,日,三国手中,还有十几个辅根服务器在其他国家手中。