文章目录
- 1. 特殊的IP地址
- 2. IP地址的数量限制
- 3. 私有IP地址和公网IP地址
- 私有IP为什么不能出现在公网上?
- 解决方案——NAT技术的使用
- 4. 路由
- 5. IP分片问题
- 为什么要进行切片?
- 如何做的分片和组装?
- 16位标识
- 3位标志
- 13位片偏移
- 例子
- 细节问题
- 如何区分不同的片?
- 如何知道分片了?
- 如何判断是开头报文 中间报文 结尾报文?
- 如何保证把分片收全了?
- 结论
- 6. 自己做一次分片
1. 特殊的IP地址
将IP地址中的主机全部设为0,就成为网络号,代表整个局域网
将IP地址中的主机全部设为1,就成为广播地址,用于给同一个链路中相互连接的所有主机发送数据包
127.* 的IP地址 用于本机环回,通常是127.0.0.1
2. IP地址的数量限制
IP地址 是一个 4字节32位的正整数,共有2^32个IP地址
TCP/IP协议规定,每一个主机都需要IP地址
而由于特殊的IP地址的存在,数量不足43亿
为了解决IP地址不足的问题,有三种方案
方案一:动态分配IP地址
使用的是 DHCP 技术(子网是由路由器划分好的,局域网的所有主机的IP地址,都是从路由器中申请的)
假设在你家里面,手机连接上热点,当断开热点时,相当于在路由器层面上被回收了
(用的时候就给你,不用就回收)
方案二:NAT技术(后面会讲)
方案三:IPV6
IPV6 用16字节 128比特位来表示一个IP地址,但目前来没有普及
3. 私有IP地址和公网IP地址
IRFC 1918规定 用于组建局域网的私有IP地址
I10.* 前8位是网络号
I172.16. 到172.31. 前12位是网络号
192.168.* 前16位是网络号
包含这个范围中的,都成为 私有IP,其余都称为 全局IP(公网IP)
私有IP为什么不能出现在公网上?
家里的路由器是可以通过私有IP,去构建子网的
由于每个家用路由器都可以构建相同的子网,所以私有IP是可以重复存在的
src作为源IP地址,dst作为目的IP地址
想要从当前主机 发送到公网上
由于当前主机 并不认识 目的IP地址是谁 ,所以就会向上交付给 家用路由器
由于家用路由器 既属于你的设备,又属于运营商的设备,所以有两个IP
子网IP 又可称为 LAN口IP 表示 你家里的设备
WAN口IP 表示 运营商的设备
发现目的IP122…3 是一个 公网IP,所以就将其继续向上交付 运营商路由器
运营商路由器 继续向上交付 交给对应的 主机
服务器收到报文请求,做出响应 构建response 向下交付时,是没办法向下交付的
源IP地址(src) 是私有IP地址
子网中的私有IP地址是可以重复存在的,所以私有IP不能出现在公网上
解决方案——NAT技术的使用
从200的主机 交付给家用路由器, 家用路由器发现其目的地址是公网IP,则继续向上交付
在交付之前,需将 LAN 口 IP(子网IP) 转换成 WAN 口 IP
再次将LAN口 IP(子网IP) 替换成 WAN口 IP
主机收到报文后,构建响应,形成响应报文,就可以返回
由于目的IP地址(dst) 不是私有IP,所以可以向下交付了
将源IP在内网环境下不断被替换的技术 称为 NAT (地址转化)技术
4. 路由
假设 你坐火车 去上海同济大学报道,当下火车时,发现东西丢了,幸好身上还藏有20块钱
此时根本不知道在哪里,只知道在火车站,并不清楚 同济大学在哪里
所以只好找个大爷 问路,询问同济大学怎么走
在现实中可能大爷并不知道,或者直接拒绝回答你的问题
若在网络环境中,存在一个路由器也不知道这个报文去哪里,但它即便不知道,也会想办法帮助你
按照网络的情况,大爷虽然没去过,但是大概知道在那个路上,所以给你说了一个路线到附近
到了附近,你又不认识路了,又问了一个大爷,询问同济大学怎么走,最后到达同济大学
所以问别人路,一定要告诉别人你去哪里
结论:
1. 当一个报文到了某个路由器内部,询问路由器时,首先要告诉路由器自己要去哪里,所以IP报头中包含目的IP
2. 大爷思考路线时,并给出结果 相当于 查找路由表
3. 碰到大爷知道下一站该怎么走,或者 碰到 大爷并不知道怎么走,但不会拒绝你,会给你介绍知道路的人相当于 路由器并不知道你去哪里,但确定你当前不是要在 现在的网络里
4. 当到达同济大学保安处时,询问同济大学保安怎么走,大爷告诉你这里就是
相当于 到达目标子网的入口路由器处
实际上并不是去同济大学,而是去同济大学的11号宿舍楼找辅导员,但问路时,并不会问同济大学的11号宿舍楼在哪里
在路上时,只需问同济大学在哪里即可
当到达同济大学时,才会去问同济大学的11号宿舍楼怎么走
相当于 问路口路由器 要去的目标主机在哪里
整个报文转发的过程:
先根据路上网络进行路上转发,到了目标网络的路口路由器处,再根据目标主机进行交付
5. IP分片问题
为什么要进行切片?
数据链路层规定 所发出去的单个帧的有效载荷不能超过MTU(最大传送单元 1500字节)
IP报文送多大并不是由 IP说了算,真正由报文多少是由TCP决定的
若TCP给IP一个较大报文,而在数据链路层 又不给转,因为大小超过1500字节
所以IP只能 进行分片
分片只能由当前IP来做,组装也只能由对方的IP来做
因为分片的信息只有ip协议知道
如何做的分片和组装?
16位标识
所以IP报头 存在 16位标识
16位标识就是 16位整数,保证自己和其他的保文不重复
3位标志
3位标志 共有3个比特位
第一位 为保留位 这个位不用,后面需要的使用再用
第二位
若为1 表示禁止分片,若报文长度超过MTU,则IP模块会丢弃报文
若为0 表示 允许分片
第三位 表示更多分片
若分片了,则最后一个分片置为0,其他为1
(看不懂下面有例子进行理解)
13位片偏移
若不分片,对应的报文 在原始报文中 起始偏移量为0
例子
将一个字节为4500的报文,分片成三个1500字节的保文
所以三个1500字节的报文 16位标识相同,设置为1234
三位标志,若后面有报文就设为1,若后面没有保文 就设为0
第一个报文的片偏移为0,第二个报文的片偏移为1500,第三个报文的片偏移为3000
细节问题
如何区分不同的片?
假设为数据的接收方,不断收报文
若有两种客户端发送报文,第一种客户端的报文可能进行分片,第二种客户端的报文也可能进行分片,两者可能糅在一起
报文中携带源IP,可以通过源IP 区分不同的客户端的能力
如何知道分片了?
1. 只要片偏移不是0(说明分片过了),提取对应的标识
2. 若片偏移为0,再看更多分片为1(说明还有分片),则一定分片了
如何判断是开头报文 中间报文 结尾报文?
若更多分片为1,片偏移为0, 则为开头报文
若更多分片为1,片偏移不为0, 则为中间报文
若更多分片为0,片偏移不为0 ,则为 结尾报文
若更多分片为0,片偏移为0,则为独立报文
如何保证把分片收全了?
即如何保证 开始报文 中间报文 结尾报文 没有丢
若 开始报文或者结尾报文丢失,通过上述判断条件即可得知
通过偏移量 进行排序,每一个偏移量之间的差值应该是相同的,若差值不同,则中间报文丢失了
结论
1. 网络中分片,尽量让它成为少数情况
2. 为什么不太建议网络分片?
当IP进行切片时,丢失一部分,导致报文丢失
所以无论是TCP或者UDP,当IP丢失报文时,就真的丢了
但TCP可以进行超时重传,传给IP一份新的报文
而UDP什么都不干
过多的分片,容易增加丢包率
由数据链路层定制规则,数据不能超过1500字节
当来自TCP的报文数据过大时,IP会进行分片,但分片会导致增加丢包率
可IP也没办法,IP只是用来执行命令的
所以一切问题出在TCP上面
只有TCP每次将数据发送小一点,才能减少丢包率
所以滑动窗口的发送区域的报文 拆成多个报文 向下交付给IP
3. 怎么做到分片减少?
所以 TCP协议,尽量发送数据不要过大
MTU(最大传送单元 1500字节)
IP标准报头为20字节,有效载荷为1480
TCP标准报头为20字节,有效载荷为1460
把TCP传送的1460 这样的数字 称为 MSS (最大段尺寸)
TCP发送的报文数据 不要超过1460
6. 自己做一次分片
假设 一个已经被封装的IP报文 为3000字节
分片后,每一片都是IP报文,所以都要携带报头
所以应该分为3片
首先将前1500个字节作为开始报文,即 20+1480
其有效载荷为1480 ,没有超过1500
可以看作切片的第一片
将IP报文剩余的1500字节 拆分出 一个 20字节,在1480 前面重新加入一个 20字节的报头(未来要去掉)
可以看作切片的第二片
此时只剩下 20字节,在其前面重新加入一个 20字节的报头(未来要去掉)
可以看作切片的第三片