网络多层的协议详述
网络层
1)地址管理:制定一系列的规则,通过地址,在网络上描述出一个设备的位置
2)路由选择:网络环境比较复杂,从一个节点到另一个节点,存在很多条不同的路径,需要规划出更适合的路径进行网络传输
TCP/IP协议栈
4位版本
4 => ipv4 6 => ipv6 目前大规模使用的两个版本
4位首部长度
IP协议的报头,也是变长的 0—0xf => *4 => 0-60字节
选项(如果有)
8位服务类型
能够让IP协议,切换形态
3位为优先权字段(已弃用),4位TOS字段,1位保留字段(必须设置为0)
TOS字段的四个位,彼此之间是相互冲突的,只有一位为1
不同的位设为1,表示IP协议不同的形态
最小延时,最大吞吐量,最高可靠性,最小成本
16位总长度(字节)
描述了IP数据包最长的长度
IP协议也存在64kb的限制,但是IP协议自身支持“拆包组包”功能——
16位标识——将一个大的数据包拆成若干个小包,16位标识就是相同的值
3位标志——一位表示是否允许拆包,一位表示是否是最后一个包
13位片偏移——描述当前每个小的数据包(分片)的相对位置
8位生存时间
描述了一个IP数据包,在网络上还能存活多久
TTL的单位是次数
数据包被构造出来,TTL会被设置成一个初始值,数据包在转发过程中,每次经过一个路由器,TTL就会减1
如果数据包把TTL耗尽,还没顺利到达对方,就被丢弃了
8位协议
描述的是IP数据包的载荷部分,是一个UDP数据包,还是TCP数据包(传输层是那个协议)
16位首部校验和
这个校验和,只是校验IP首部,不管IP的载荷(UDP/TCP这样数据,自身都是有校验和的)
32位源IP地址 —— 32位目的IP地址
IP地址,本质上是一个32位的整数,一般写作 点分十进制
地址管理
IP地址,是一个32位整数 2*32 => 42亿9千万
地址理论上是不能重复的,互联网发展至今,能上网的设备早已超过IP地址的范围
此时如何解决IP地址不够用的问题:
1)动态分配IP
提高了IP地址的利用率,但是没有增加IP地址的数量(广泛使用的过渡方案)
2)NAT机制(网络地址转换)
本质上是让一个IP地址,代表一批设备
把IP地址分成两大类:
1. 内网IP(局域网IP)
在同一个局域网内部,内网IP之间不能重复
在不同局域网中,内网IP可以重复
2. 外网IP(广域网IP)
外网IP始终不允许重复,务必唯一
例如现在要传输一个数据:
此时IP地址是相同,但是每台主机的端口号是不同的
如果此时恰好两台主机分配端口号相同——>
请求到达路由器后,路由器会发现这两个数据包的目的IP地址和目的端口都一样(访问同一个服务器),源端口也一样
路由器会把源端口也一起替换掉(路由器内部会记录映射关系)
当前的网络环境就是以 NAT + 动态分配 的方式解决IP地址不够用的问题
NAT机制是“纯软件”的方案,因此局域网内部的设备能够主动访问外网的设备,外网的设备不能主动访问局域网的设备
3)IPv6
IPv6 使用16个字节表示IP地址 0—2*128
地球上所有的设备都可以有一个自己的 IPv6地址
IPv6 和 IPv4 是不兼容的
网段划分
同一个局域网中的设备,网络号必须相同,主机号必须不同
不同的局域网,网络号不能相同
子网掩码
一个IP地址,哪部分是网络号,哪部分是主机号,是不一定的
子网掩码,就是用来确定网络号的
32位整数(左边全是1,右边全是0)
子网掩码格式和 IP 地址一样,也是一个 32 位的二进制数。其中左边是网络位,用二进制数字 “1” 表示,1 的数目等于网络位的长度;右边是主机位,用二进制数字 “0” 表示, 0 的数目等于主机位的长度子网掩码也可以使用二进制所有高位1相加的数值来表示
将 IP 地址和子网掩码进行“按位与”操作(二进制相同位,与操作,两个都是1结果为1,否则为0),得到的结果就是网络号。将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号
十进制 | 二进制 | |
IP地址 |
180.210.242.131
|
10110100.11010010.11110010.10000011
|
子网掩码 |
255.255.248.0
|
11111111.11111111.11111000.00000000
|
网络号 |
180.210.240.0
|
10110100.11010010.11110000.00000000
|
主机号 |
0.0.2.131
|
00000000.00000000.00000010.10000011
|
早期的网络分段形式:A类 B类 C类 D类 E类
0 | 网络号(7位) | 主机号(24位) |
1 | 0 | 网络号(14位) | 主机号(16位) |
1 | 1 | 0 | 网络号(21位) | 主机号(8位) |
1 | 1 | 1 | 0 | 多播组号(28位) |
1 | 1 | 1 | 1 | 0 | 留后待用(27位) |
1)将 IP 地址中的主机地址全部设为 0 ,就成为了网络号,代表这个局域网2)将 IP 地址中的主机地址全部设为 1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包3)127.* 的 IP 地址用于本机环回( loop back )测试,通常是 127.0.0.1本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信操作系统提供了一套“虚拟网卡”,关联到这个IP上4).255UDP能天然支持 广播,和这个IP有关使用UDP socket给这个IP发送UDP数据报,此时局域网中的所有设备,都能收到这个数据TCP无法与这个IP建立连接
路由选择
描述了IP协议(IP数据报)转发的过程
IP数据进行转发的时候,无法知道网络的全貌,只知道一些局部信息(一个路由器知道哪些设备和它是相连的),这就意味着IP数据报,在转发的过程中是一个“探索式”/“启发式”的过程
一个网络层数据报,每次到达一个路由器,都会进行“问路”过程
每个路由器内部都有一个数据结构“路由表”,根据数据报中的 目的IP,查路由表
如果查到了,就直接按照路由表中给定的方向(从哪个网口进行转发),继续转发
如果没查到,路由表里有一个“默认的表项”“下一个地址”,按照默认的表项转发
路由表——>
1. 手动配置
2. 自动获取
以太网协议
" 以太网 " 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等通过网线/光纤,来通信,使用的协议是以太网协议
以太网横跨数据链路层和物理层
以太网数据帧:帧头 + 载荷(IP数据报)+ 帧尾
目的地址/源地址
6个字节
不是IP地址,是网络中的另一套地址体系,Mac地址(物理地址)
目前来说,每个设备都是有唯一的Mac地址
Mac地址通常是十六进制表示的,两个十六进制数字就是一个字节
字节和字节之间通常使用 - 或者 : 来分割
IP协议立足于全局,完成整个通信过程中的路径规划工作
以太网则是关注于局部,相邻两个局部之间的通信过程
网络层 与 数据链路层 的路径侧重:
网络层无论有多少条路线,源IP和目的IP始终是整个通信过程中的最初起点和最后终点(不考虑NAT)
数据链路层关注的是“相邻节点”之间的如何转发
源mac和目的mac会根据当前转发的过程,每次到达一个节点,往下一个节点转发的时候,源mac和目的mac都会随之改变
IP数据报的最大长度不超过1500字节
MTU:数据链路层数据报能携带的最大载荷长度
不同数据链路层的协议,MTU不同(和物理层的介质也有关系)
IP数据报的分包组包,大概路是因为MTU,而不是触发64kb上限
这两种协议不是传输“业务数据”,而是辅助转发的协议
像交换机这样的设备,收到以太网数据报时,就需要要进行转发
转发的过程中就需要能根据Mac地址,判定数据要走那个网口
此处的网口是“物理意义”上插网线的接口(IP协议,路由器,走哪个网络接口,都是抽象的概念,最后还是要在数据链路层才能决定走哪个网口)
具体的转发过程:
交换机内部有一个数据结构“转发表”,和前面的路由器表有点像
转发表示一个简单的像hash的映射(此处不一定由软件实现)
转发表中的内容主要由 arp 协议实现
DNS
DNS,即Domain Name System,域名系统。DNS是一整套从域名映射到IP的系统
使用IP地址,描述设备在网络上的位置(应用层协议)
最早的域名解析系统,是通过一个简单文件实现——> hosts文件
现在搭建了一套DNS系统(一组服务器)
如果要访问服务器,先给这个DNS服务器发起请求,查询一下当前的域名对应的IP,再访问目标网站
一个服务器硬件资源是有限的(CPU,内存,硬盘,网络带宽...)
服务器处理每个请求,都会消耗一定的资源
如果单位时间内访问次数超过服务器的上限,机器就挂了——>
1)开源
搭建“镜像服务器”,同步与主根的数据,用户会先访问距离自己最近的镜像服务器
2)节流
让请求量变少,让每个上网的设备,设置网络缓存
对于短时间的多次访问,只让第一次请求DNS即可,把到的结果保存到本地,后面的请求都是用第一次的结果即可