网络层:IP协议
IP协议报头
其中取值只有两种,分别是4和6,分别对应IPv4和IPv6
IP报头,单位是4个字节,可变长
type of service,表示当前IP协议所处的工作模式
实际上只有四位是有效的。而且这4为是彼此冲突的,只有1位为1,其他3位为0
4位工作模式分别为
最小延时:吃饭吃得快
最大吞吐量:吃饭吃的多 != 快
最高可靠性:减少丢包的概率
最小成本:硬件设备的开销
描述了一个IP数据包的长度(报头+载荷)
虽然IP自身有长度限制,但是IP也提供了拆包/组包这样的功能。当TCP载荷很大,超过了64KB,到了IP这一层就可以拆成多个IP数据报,每个数据报拿一部分载荷
上述的拆包过程是系统内核自动完成的,程序员通过软件代码无法干预到
其实IP的拆包并不是完全因为64K的限制,而是在数据链路层还有限制
16位标识:描述哪些IP数据报的载荷应该往一起组装
3位标志:只有两位有效,其中1位表示这次的IP数据是否拆包了,还有1位是结束标记
13位片偏移:描述包与包之间的先后顺序
单位是次数,存储的是一个整数,一个IP数据报,每次经过一个路由器转发,TTL就-1。如果TTL为0了,说明快要丢包了
TTL一般来说采用32或者64这样的整数,足以支持当前的网络传输,也能防止某个数据在网络上不停地转发下去
32位整数够用吗?
其实是够的。参考六度空间理论:世界上任何两个人想互相认识,只需要最多6位朋友的介绍
在计算机中,每个路由就代表一位朋友,即使互联网很复杂,要访问到世界的每一个角落,最多只需要2^5=32 / 2^6=64次就足够了
表示在传输层使用哪个协议
针对IP首部进行校验,不管载荷
表示发件人地址和收件人地址
IP协议主要完成的工作:
1.地址管理
IP地址本质上是一个32位整数。为了方便一般把IP表示成点分十进制的方式,通过三个点分成4个部分,每个部分一个字节,每个部分的取值都是0~255
IP地址的意义:区分网络上的不同设备,让每台网络设备都有一个唯一的IP地址。
虽然表示的数据范围很大,但还是有不够用的情况,那怎么办?
①动态分配IP地址。
全世界的设备不是同一时刻都在上网,没上网的设备就可以把原来的IP地址让出来给准备上网的设备
②NAT机制(网络地址映射)
本质:不增加IP地址,让IP地址复用,提高IP的利用率
把IP地址分成两大类
1)私网IP/局域网IP,后面三类IP地址10.*,172.16.*~172.31.*,192.168.*都属于死亡IP
2)公网IP/广域网IP,除了上面三类IP地址剩下的都是公网IP
现在要求公网上的设备对应的公网IP都必须是唯一的,但是私网/局域网上的设备使用私网IP,只要保证单个局域网内部的IP不重复即可。不同的局域网之间的IP允许重复
重要的限制:
1)在不同的局域网中,其中一个局域网的设备访问另一个局域网的设备是不被允许的
2)局域网设备访问公网设备就需要对局域网设备的IP进行地址转换
3)公网设备不允许主动访问局域网设备
构造一个IP数据报,源IP是192.168.2.10,目的IP是1.2.3.4
现在假设这个路由器的WAN口IP是5.6.7.8,这时候从电脑发出的数据经过路由器如果要进一步转发就需要路由器把IP报头中的源IP进行替换
现在的IP数据报长这样
此时这个数据包到达服务器之后服务器看到的IP就是5.6.7.8,无法看到之前的IP
替换的意义?
本质上是让一个公网IP可以对应到多个设备,从而起到节省IP的效果
现在假设有两台主机,主机1的IP地址为192.168.1.10,主机2的IP地址为192.168.1.20,路由器WAN口IP同上,现在主机1给服务器发送数据包
服务器返回的响应数据报经过路由器,路由器查通信信息记录表找到对应的表项,此时就把目的IP还原成之前的局域网IP。变成这样
如果局域网的各个设备访问的都是不同的服务器,路由器就可以很简单的通过服务器IP地址来区分当前进行的是哪次替换
如果同一个局域网内多个设备都要访问同一个服务器?
实际上路由器查的表还包含源端口和目的端口,端口号既可以区分同个主机的不同进程,也可以去区分不同主机的不同进程。由于客户端分配的端口号是随机的,所以两个主机之间的端口大概率是不一样的,路由器也可以用不一样的端口区分哪次替换
那如果恰好分配到相同的端口号呢?
NAT可能会修改传输层的报头,路由器会把相同的源端口号进行替换(映射),替换成主机之间互不相同的端口号,比如:
服务器收到数据之后会记录对端的信息,目的IP:5.6.7.8,目的端口:10001
网段划分
为了进行组网,把一个IP地址分成两个部分:网络号 + 主机号
网络号标识当前网段/局域网,主机号是当前局域网该主机的身份标识
前半部分 192.168是网络号;后半部分72.1是主机号
如果一个局域网中网络号和主机号相同,或者局域网中的设备网络号和路由器的网络号不同(这个主机无法通过路由器访问外网,也无法访问局域网中其他设备),都是无法上网的
两个相邻的局域网,网络号不能相同(相邻?一个路由器连接的两个网络就是相邻的)
子网掩码
子网掩码可以用二进制表示成 1111 1111 1111 1111 1111 0000 0000 0000,这里有个特点,就是左半部分全是1,右半部分全是0,有明显的分割,不会1和0混着的。位置为1的部分就是网络号,为0的部分就是主机号。
我没有手动配置IP地址,为什么还能上网而且没遇到冲突的情况呢?
路由器的一种功能DHCP,能够自动帮你把局域网的设备IP都分配好。这样的分配,每次连到服务器(也就是重启电脑)后,得到的IP可能会不同
网关:局域网网络数据的进出口(一般是路由器),后面填的就是路由器的IP(LAN口的IP)
特殊IP地址
127.0.0.1 环回IP,表示自己本机(一般用来进行测试)
127.*开头的都是环回IP
某个IP主机号全都是0(二进制比特位),表示这个网段,这个IP比较特殊,不能分配给某个主机
如果某个IP的主机号为全1,表示广播地址,也不能分配给某个主机
广播?表示一对多这样的传输,往广播地址上发(UDP)消息,局域网中所有设备都能收到
单播:一对一
组播:一对多(这里的多表示整体的一部分)
广播:一对多(这里的多表示整体)
广播的典型应用:手机投屏/电视投屏
投屏一般有一个要求:必须在同一个局域网中。手机如何知道有哪些设备支持投屏的呢?
通过广播完成,点击投屏,手机就会在局域网中广播一个查询数据包,看看有哪些设备回应。根据收到的回应就知道IP为哪个的设备能支持投屏。
接下来选择对应设备,就可以让手机和该设备进行通信,投屏的过程是直接传输数据的过程
所以除去全0和全1,路由器最多能分配254个IP地址,但是实际上路由器会有一个配置项,表示分配的IP地址的范围,也就是说,实际上分配的IP会更少
③IPv6
本质:增加IP地址的个数
IPv4使用4个字节表示IP地址,就有2^32个地址
IPv6使用16个字节表示IP地址,就有2^128个地址
IPv6的报头结构和IPv4是不兼容的,引入IPv6就意味着要更换成支持IPv6的设备
2.路由选择
路由选择就是规划路径。由于网络结构比较复杂,每个路由器只能掌握局部信息,无法掌握全局的信息,所以此时规划出来的路线只能是一个较优解
路由器的路线规划是一种探索是/启发式/渐进式的路线规划,通俗来说就是走一步看一步
数据包中包含了目的IP的字段,由于每个路由器内部有一个数据结构称为路由表,所以他们对于网络环境(相邻其他设备)是有一定的了解的,此时就可以根据路由器的路由表告诉数据包从路由器的哪个口出。
当然有可能你查询的目的IP在路由表里面找不到,他会默认让数据包走向更上层的路由器
数据链路层
以太网
横跨数据链路层和物理层,让硬件和软件相互配合
MAC地址
在数据链路层中引入另外一套地址体系,称为MAC地址或者物理地址,注意和IP地址是不一样的
IP地址侧重于全局转发,数据包从起点到终点整个转发过程由IP地址负责完成
MAC地址侧重于局部转发,只负责数据包在两个相邻设备之间的转发
MAC通常按照十六进制的方式表示,字节之间用横线(-)或者冒号(:)来分割
MAC地址表示的范围比IPv4地址大很多,所以当前MAC地址都是和主机一对一绑定的。而且MAC地址是静态分配的,在出厂的时候就写死了(MAC地址就可以作为机器的身份标识,例子:外挂)
数据帧格式
这里一般叫数据帧,和数据包是一样的
标识了载荷数据的类型
意味着以太网数据帧是一个能够携带业务数据的报文
以太网数据帧载荷部分有长度要求,最短46字节(ARP的长度),最长是1500字节(硬件限制)
ARP和RARP是两个横跨了网络层和数据链路层的协议
ARP能够让路由器/交换机建立一个内部的结构,让IP地址映射到MAC地址,这个结构称为转发表,只是描述一个设备和哪些设备是连接着的
RARP是让路由器/交换机建立内部的结构,让MAC地址映射到IP地址(不重要)
DNS:域名解析系统
我们一般使用IP地址来描述网络设备的位置,但是我们一般在搜索栏里面输入的是www.bilibili.com这类的网站,而DNS就是用来把这一连串单词解析成IP地址的
全球那么多人上网,DNS服务器不得崩溃了?
DNS服务器并非是唯一的,而是有很多份。最开始的一套DNS服务器称为根域名服务器,里面的内容最全。后来每个国家根据里面的内容搭建镜像服务器,现在全世界有无数个镜像服务器
并且,搭建域名服务器的时候还会对域名进行分级管理,分成一级域名,二级域名等,这样可以让每个服务器管理的数据不多
8.8.8.8是谷歌搞的DNS镜像服务器,一般是不会挂的