ip-协议
文章目录
- 1. 网络层
- 2. `ip`协议
- 2.1 `ip`协议格式
- 2.2 网段划分
- 基本概念
- 网段划分的两种方式
- 为什么要网段划分?
- 特殊的IP地址
- IP地址数量不足
- 2.3 私有IP与公网IP
- 2.4 路由
- 3. IP的分片与组装
- 为什么要分片与组装?
- 如何分片?
- 如何组装?
1. 网络层
IP地址是一个32位的整数,再细致一点,它是由若干位网络号 + 主机号构成,IP = 网络号 + 主机号
一台主机发出的报文,经过多重路由,为什么就能到达指定的主机?这是因为报文中填写了目的IP地址,有了IP地址,报文就能到达目的地址
这表明IP真正的意义在于提供了一种"能力":将报文跨网络送至另一台主机的能力
所谓具有某种能力,指的是有很大概率做成某件事,但不一定百分百做成,也就是不一定"可靠",我们需要的是不仅仅具有将报文跨网络送至另一台主机的能力,还要"可靠"的送至,谁提供可靠呢?---- tcp
协议
因此,tcp
协议提供报文传输的策略,ip
协议提供报文传输的能力、具体的执行,两者合作,我们的主机就具有将报文可靠的跨网络送至另一台主机的能力
2. ip
协议
2.1 ip
协议格式
-
如何将报头与有效载荷分离?
同
tcp
类似,ip
协议的报头也有4位首部长度,每1bit位代表4字节,可表示范围[0, 60]字节;减去固定的20字节,就是选项,剩余的就是数据 -
如何分用?
封装时,网络层知道上层是
tcp/udp
向下交付的,在8位协议字段中填入,解包时读取,就得知应该交给上层哪个协议了
其他字段:
- 4位版本:通常是ipv4或者ipv6
- 8位服务类型(TOS):从最小延迟、最大吞吐量、最高可靠性、最小成本中选取一个,报文传输时会根据要求选择不同的路线,一般
telnet/ssh
选择最小延迟,ftp
选择最大吞吐量 - 16位总长度:
ip
协议不仅有4位首部长度,还有自身的总长度字段 - 8位生存时间(TTL):网络是一个相当复杂的结构,难免有时会出现漏洞,报文在传输时可以会路由循环,每当报文经过一个路由,TTL–,如果路由器收到TTL为0的报文,就直接丢弃
我们通常用源端口、目的端口、源IP、目的IP、协议号这样的五元组,来标识一个网络通信
2.2 网段划分
基本概念
IP地址是一种有用且有限的资源,不同国家、组织、地区拿到IP地址后,就需要对它进行合理的划分;因此,我们所见的IP地址都是被精心设计过的
IP地址 = 网络号 + 主机号,处在同一网络的IP主机,它们IP地址的网络号一定相同
路由器是一种设备,通常跨两个网络,也就意味着它最少有两张网卡,也就有两个IP地址
它不仅仅能对报文进行路由,还能构建子网,给每台连接到自身子网中的主机动态分配IP地址(DHCP技术)
网段划分的两种方式
第一种是将IP地址分为5类
不同类别的网段容纳主机数不同,A类容纳的主机数过多,导致大部分可能没有使用,被浪费了
大部分人都申请B类,随着互联网的发展,IP地址又逐渐够用了,因此,这种网段划分的方式不常用了
第二种是CIDR
方案
引入子网掩码,是一个32位的整数,通常前面若干bit位全1,代表网络号,后面全0~全1代表主机号
将IP地址 & 子网掩码 = 网络号
为什么要网段划分?
在学校中,我们的学号也是被划分过的,比如前几位代表院号,后几位代表学号,接下来以一种简化的模型来帮助理解
其中,正方形代表每个院的负责人,它们之间一定处在一个群,且互相知道对方的院号
此时你走在路上,捡到一张学生证,上面的学号是0100 0011,你非常热心,想要归还这张卡给本人,无奈整个学校人太多,总不可能找人一一匹对
于是,你将学号与你们的院号进行按位与,得到0100 0000,由此你能知道,该学生一定不是你们院的,具体是哪个院的,你也不知道,你只能把学生证给你们院的负责人
负责人一定知道每个院的负责人是谁,也知道每个院的院号,根据按位与的结果,判断学生一定是计院的,于是就交给计院的负责人,计院的负责人在它们的计院群通知,于是,学生证也就物归原主了
在整个过程中,每个院就是一台路由器,学生证就是要发送的报文
如果没有对每个院进行合理的划分,我就需要找遍学校里的所有人,才能将学生证物归原主;有了划分之后,只要进行一次按位与操作,就能排除其他所有院,只剩一个院,大大提高了查找的效率
因此,网段划分的真正意义:网段划分后,未来就能提高报文查找到目标主机的效率
特殊的IP地址
- 主机地址全为0,表示网络号,代表整个局域网
- 主机地址全为1,表示广播地址,用于向同一局域网内的所有主机发送报文
IP地址数量不足
随着互联网的发展,目前IP地址的数量早已严重不够用了,虽然使用子网掩码的划分方案(CIDR)缓解了IP地址不足的现状,但并没有提高IP地址的数量上限,不过也出现了解决方案
- 动态IP地址分配(DHCP):路由器能为接入到自身构建子网的主机动态分配IP地址,也就是说不同时间段接入同一局域网的主机IP地址可能相同
- NAT技术
- ipv6
2.3 私有IP与公网IP
想要上网,得先有网,也就是得先组建网络,而组建网络离不开各种网络基础设施的建设:将光纤入户、站台建设等等,所有的这些我们貌似不需要做,我们好像只需要买台路由器就有网络了,这是因为这些工作已经有人帮我们做了
早在几十年前,我们国家政府就开始网络基础设施的建设了,也就有了三大运营商,它们帮我们做好了建好了基础设施;基础设施做好了,家家户户才能上网,各种互联网公司才有了生存的土壤
根据RFC 1918
的规定,组建局域网的IP地址只能是这3种:
- 10.*(前8位是网络号)
- 172.16.* ~ 172.31.*(前12位是网络号)
- 192.168.*(前16位是网络号)
其余的IP地址都是公网IP地址
- 私有IP地址不能出现在公网中
- 不同私网(子网/局域网/内网)中,私有IP地址可以重复
- 虽然存在公网,但我们都必须先接入到指定的私网中
- 我们每个人都处于私网中
网络世界 = 私网 + 公网
每台路由器能构建子网,路由器本身通常是该子网中第一个主机,因此它有一个LAN口IP地址;同时,路由器又在其他路由器构建的子网中,在该子网中,它是一台主机,因此它也有一个WAN口IP地址
假设报文由私网上的一台主机发出,主机一定知道自身的网络号,发现目的地址不是自己处在的网络,将报文交给家用路由器,由于私有IP地址不能出现在公网中,因此会将源IP地址替换为家用路由器的WAN口IP地址
家用路由器查自身路由表,发现没有与之对应的网络号,交给运营商路由器,同时将源IP地址替换为运营商路由器的WAN口IP地址
运营商路由器处于公网中,能直接发送报文到目标主机
上述过程中,源IP地址的替换称为NAT转换,只在进出私网时才会做转换
直接与公网相连的路由器也称为出入口路由器
可以看到,报文都是交给运营商进行转发的,这也是为什么我们手机欠费就没网络的原因,运营商能直接将你的报文丢弃,不做NAT转换和转发
私网我们很好理解,但对于公网,上面只是简单带过,究竟什么是公网呢?下面以一种简化的模型举例
在上述模型中,国家之间的网络、省份之间的网络、市之间的网络、市内各种公司之间的网络就是公网
2.4 路由
每个工作在网络层的设备都有一张路由表,每台主机也不例外,这是云服务器上的路由表
当报文转交给路由器时,路由器会根据路由表来查询报文应该往哪走
上述例子中,一共有3个条目,从下往上看,将报文中的目的IP地址与条目中的genmask
做&运算,如果与destination
相同,则交给gateway
地址的主机
其中flags
如果有G,则表示下一跳的地址是某个路由器的地址(gateway
),如果没有G,则表示目的地址与本机接口相连,直接向Iface
的接口发送报文即可
如果都匹对完了,还是没有,则进行缺省路由,将报文送至上层路由器
3. IP的分片与组装
ip
协议的报头字段中,我们还剩三个字段没讲,它们主要用来进行IP的分片和组装
为什么要分片与组装?
对于传输层,它将数据交给网络层,要求网络层将数据送至对方主机,网络层的确有这个能力,但数据链路层具有MTU的限制,那只好由网络层自己将报文进行分片,到达对方主机再进行组装
需要注意的是,报文被分片后,如果在传输过程中丢失了任意一个分片,则认为整个报文丢失,对方的网络层收到分片后不会将剩余的向上交付,而是等待tcp
超时重传,IP再进行分片
那么问题来了,一个报文分成多片发送,丢包概率高,还是作为一个整体发送,丢包概率高?答案肯定是前者,也就是说分片后,报文的丢包概率更高;因此,IP分片不应该称为主流做法,应当避免分片
这时,网络层就对传输层说了,如果你给我交付的数据过大,我必须得进行分片,这样会导致丢包概率变大,从而你就要超时重传,对双方都是不利的;传输层听完后,细想好像确实如此,于是制定了策略,控制一个报文的大小
,该策略是什么呢?滑动窗口,在很多场景下,我们看到tcp
滑动窗口内的数据都是被分成一块一块的,为什么不合并起来,一并发送呢?原因就是为了减少IP的分片
上面解释了三个问题:为什么要分片?为什么不想分片?如何做到不分片?
如何分片?
-
16位标识:标识IP报文的唯一性,如果报文被分片了,则该报文的每片16位标识都相同
-
3位标志:
第一位保留(保留的意思是当前不用,但不代表之后不会用)
第二位为1表示禁止分片,此时如果报文超过MTU,IP层就会直接丢弃该报文、
第三位表示更多分片,如果报文进行了分片,则最后一片该位为0,其他片该位为1
-
13位偏移量:
如果每分片,为0
如果分片了,则为当前分片的有效载荷在整个报文有效载荷中的偏移量,必须为8的倍数
IP报文的总长度可能16位的,最大可能2^16字节,此时用13位偏移量来表示后面分片的偏移量,是存不下的,因此,13位偏移量真实存的值是偏移量 >> 3,这也是为什么偏移量必须是8的倍数
如果报文长度超过MTU,IP进行分片,每个分片最多1500字节,这里拿总的报文长度为3000字节举例
如何组装?
-
如何判断收到的报文是否分片?
假设报文时分片的,则
于是,如果 (更多分片为0 && 片偏移量为0) ----> 没有分片的报文
更多分片为1 || 片偏移量不为0 ----> 分片报文的其中一片
-
如何判断分片的报文收全了?
将报文按片偏移量升序排序,下个分片中的片偏移量 = 当前报文的片偏移量 + 有效载荷的长度,逐次检查,直到确认有更多分片为0的分片
-
确认收全后,将每个分片中的报头去掉,只留下一个报头,逐次组装起来,交付给上层