44.网络层
TCP/IP协议,核心功能:把数据100%可靠的,从A主机跨网络送到B主机!(网络核心问题和功能)
传输层tcp vs 网络层ip
举例:张三是一个学习很好的学生,考试基本上可以考满分。学校里有报送名额,近期会组织考试,考试考满分就可以拿到。张三爸爸是教导主任,他可以保证如果张三没有考到满分,他可以重新组织考试,直到张三考到满分。
在这个例子中,张三就是IP协议,张三爸爸是TCP协议。张三基本上可以考满分,IP协议保证能力(极大概率发送成功);张三爸爸提供策略,TCP协议根据诸如确认应答,超时重传等保证可靠性(100%)。
IP协议核心作用和功能
IP协议:提供一种能力 -> 有极大概率,能做到某种事情 -> 把数据报从A主机,跨网络,送到B主机 -> 必须有方式,标识通信两端主机的唯一性!IP协议解决的是主机到主机的问题 -> 必须有方式,表示主机的唯一性 -> 每台主机都必须设置IP地址。
TCP协议,对上解决的是进程到进程的问题,端口号。
IP = 目标网络 + 目标主机
路由的本质理解:路上的时候,从一个子网,进入到另一个子网
路由器工作在网络层 -> 当带路由器,已经是一台小型计算机了,可以工作在应用层
IP协议的报头
4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4。
4位首部长度:与TCP同理
16位总长度:IP数据报总长度
8位生存时间(TTL):本质是一个计数器,数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了. 这个字段主要是用来防止出现路由循环(类似图的负权回路问题)
8位协议:
16位首部校验和:使用CRC进行校验, 来鉴别头部是否损坏.
主机内部的走线比较密,电流会产生磁场,磁场也会影响电流,在电磁的相互影响下,可能发生比特位翻转的情况,造成数据出错。
子网划分理解
建立共识:网络是几十年发展的产物,网络建设,历经了几十年 -> 网络是被设计过的 -> 报文路由的时候,最核心的应该是理解网络是如何被设计的!
为什么要子网划分?
举例:张三是一名计算机学院的学生,学号是01123(学号构成 = 学院号2位 + 学号3位)。有一天他在路上捡到了一个钱包,里面装着一个学生证,其他区域都被雨水冲的看不清了,只能看清学号是06321。张三不知道这个学号是哪个学院的,但看前两位,对比自己的知道了肯定不是自己学院的,于是他把这个学号和自己的联系方式(06321 -> 张三的电话)发到了学院群里并@计算机学院学生会主席01110。计算机学院主席知道这个06321的06对应的是机械学院,于是他将这个消息(06321 -> 张三的电话)转发到了全校学院群里并@机械学院学生会主席06120。机械学院主席06120知道这个06321是他们学院的李四,于是他转发消息到机械学院群里并@李四,李四收到了这个消息,拿着电话找到张三拿回了钱包。
张三就是源主机,IP为01123;计算机学院主席是张三内网的路由器,IP为01110;机械学院主席是李四内网的路由器,IP为06120;李四是是目标主机,IP为06321。
学号构成就是网络的设计,即IP的设计;子网划分,可以根据网络号(学院号)淘汰不是一个子网(学院)的主机。
划分学院,带上唯一编号的过程,叫做子网划分。
子网划分原因:未来查找目标主机,先必须查找目标网络,本质可以淘汰其他网络,提高在全网中查找目标主机的效率。(查找本质是一个淘汰过程,淘汰效率高,查找效率高)
网段划分
我电脑的IP从哪里来的?路由器可以分配IP,DHCP协议(应用层协议),路由器有构建子网的功能(路由器至少要配置两套IP)
IP=网络号+主机号
子网划分本质:把32为比特位进行划分,确定网络号有多少位。
结论:IP地址是有用的,是有限的,大家都要抢
谁在抢 -> 每个国家的运营商在抢
为什么要抢 -> 构建国家子网,IP是资源
网段划分方案和CIDR
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却 浪费 了大量地址;
这种粗力度的划分方案,会导致IP地址使用的不充分,造成大量IP地址的浪费。
解决方案:CIDR(Classless Interdomain Routing)(无类别域间路由)
引入了子网掩码的概念,可以对网络号进行精准的划分。将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号。
子网掩码解决的问题:把分类划分的网络IP资源得到充分的利用。
划分子网举例:子网掩码是一个前x位全1,后32-x位全0的数字。
IP = 网络号 + 主机号 -> 主机号为全0:整个IP表示网络号;主机号为全1:广播地址
私有IP和共有IP
RFC 1918规定了组件局域网的私有IP地址:
- 10.*前8位网络号
- 172.16.*到172.31.*,前12位网络号
- 192.168.*,前16位网络号
网络宏观上被分为:公网:内网(子网,局域网) = 1:n
在网络通信的过程中,私有IP不能出现在公网上 -> 为什么? -> 私有IP有多个,无法标识唯一性,回不来。
普通人,直接接触的,根本不是公网,我们直接接触的,都是内网。
运营商角色理解
举例:有一天小王的邻居小李装了网,就和小王说,我家装了网,现在有优惠,建议你也装一个。小王于是决定也装,问小李要到了电话,当天下午工程师就来了,带着路由器,拉着网线,把网络装好了,对小王说:“小王啊,我这有个手机送给你,还有一张手机卡,你要上网的话就往手机卡里面充话费就行了”。此后,小王家就通网了。
路由器本身就有构建子网的能力,给子网内所有主机分配IP的能力!
支付费用的时候,为什么给了运营商?
当小王连着无线lan访问抖音,本质是想抖音服务器发送数据包;过程:经过自家路由器,然后到达运营商公网出入口路由器,发到公网,最终到达。原因:不管怎样,用户的数据都要通过运营商的公网出入口路由器发出(由于子网是运营商建立的,运营商收费类似高速公路收费)
NAT技术理解
每经过一个 内网 路由器,进行,srcip的替换,替换成为当前路由器的WAN口IP(对外的)
内网IP经过路由器WAN口IP替换的技术,叫做NAT。
不同内网IP可能重复 -> 但因为有NAT技术,不影响内网向网络通信(WAN口IP替换,由同一子网内IP不重复)-> NAT解决了网络地址不足的问题(多台主机可以共用一个公网IP,运营商的出入公网IP)
运营商可以控制我们的报文是否转发到公网。
网络欠费,运营商怎么知道?
路由器绑定了手机号号信息,可以查询余额;如果欠费了,运营商的公网出入口路由器不做转发。
如果报文里有敏感信息呢?运营商公网出入口路由器可以对IP地址做判断。
尝试理解公网
纯举例,一个俄罗斯报文A的目标IP是:5.1.16.x,源IP:1.xx.xx.xx流程:
dst:5.1.16.x/20,由俄罗斯公网出入口路由器开始转发,查对应的路由表,拿着目标IP&子网掩码的结果,对比成功对应的5.0.0.0/8网络号,取到了对应的下一跳地址5.0.0.1/8,发送给中国公网出入口路由器5.0.0.1/8。拿到之后,重复上述工作,查到了对应的5.1.0.0/16网络号,得到下一跳5.1.0.1/16,发送给陕西省路由器5.1.0.1/16。再重复查表工作,查到对应的5.1.16.0/20网络号,下一跳为西安市路由器5.1.16.1/20。西安市路由器假定就是最后一个公网路由器了,剩下就只剩内网转发了。
5.1.16.0/20 -> 5.1.0001 0000.0/20
细节1:路由表:对外部,存着网络号,子网掩码,下一跳IP。对内,也存了内部的子网划分具体的网络号,子网掩码,下一跳(WAN对外,LAN对内)
route 查看路由表
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下⼀跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
转发过程举例:转发目的地址192.168.56.3,对应的路由表中,与第二条子网掩码&得到了结果和第二条网络号一致,从eth1发出。如果转发目的地址是200.10.1.2,对应的路由表中都不匹配,那么数据就会走 缺省路由 eth0。
缺省路由说明:
你可以配置很多个缺省路由,但路由器的路由优选过程会确保只有一条最优的被实际用于转发数据。其他条目虽然存在,但处于“非活跃”状态。这种机制是实现网络冗余和负载均衡的基础。
结论1:公网路由器的路由表算法和内网路由器的路由表算法时间复杂度是不同的
IP报文的分片与组装
- 16位标识:相同分片标识相同,不同分片标识不同
- 3位标志:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到). 第⼆位置为1表示进制分片,这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为0, 其他是1. 类似于一个结束标记.
- 13位片偏移:是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 除以 8 得到的. 因此, 除了最后一个报文之外(之前如果都是8的整数倍,最后一片的偏移量也一定是8的整数倍), 其他报文的长度必须是8的整数倍(否则报文就不连续了).
结论2:IP报文可能要进行分片和组装
任何一个分片丢失,都表示该报文整体丢失!
为什么会分片?由于数据链路层MTU(最大传送单元)对于数据大小有限制。
MSS(最大段尺寸):TCP报文最大的不引起IP层分包的字节数。
结论3:网络通信中,如果过多分片,就会增加丢包概率!!!
分片和组装不是主流,被迫为之,为什么?
TCP三次握手通信双方交换MSS,选择最小的那个,尽量不分片。
减少分片的本质,在传输层!
滑动窗口(TCP发送缓冲区的一部分)发送数据给数据分段原因:根据MSS值设定的,尽可能不分片。
如何分片和组装?
1)判断报文是否被分片了
a.根据3位标志中的第三位更多分片(为1代表其他分片,为0),为1代表一定分片了
b.3位标志中第三位更多分片为0,偏移量不为0,代表是分片
2)怎么保证自己把分片收齐了
a.相同的分片聚合在一起(16为标识)b.怎么保证收全了?
收不全 -> 第一片丢;中间丢;最后一片丢(没有更多分片为0的分片)
解决第一片丢和中间丢:
把所有的分片按偏移量进行升序排序。
片偏移+长度 = 下一个片偏移(如果对不上就没收全)