前言
IP协议是网络层协议,应用层希望让数据可靠的从A主机到B主机,就设计出了传输层策略TCP协议。而实际上,网络从A网络到B网络不仅依赖于传输层可靠的策略,还依赖于跨网络传输数据的能力。这个跨网络的能力就IP协议。
数据从A主机要到达B主机,大概率会先经过路由器F、路由器C等等的转发。为什么不能直接到达B主机呢?本文将会介绍。
本文重点
本文详细介绍IP层协议的报头,网段划分,IP分片与合并,以及运营商在网络中扮演中还要的角色。
前提知识:
- IP地址是被分成:网络号+主机号。
- 运营商:在网络中起到重要作用:如建设基站、划分网段、连接网络等。
- 一个路由器下连接的设备都是在同一个子网中。
IP协议结构
见一见IP报头的字段
对于一个协议,最先应该关心俩个问题
有效载荷和报头如何分离?
先读取前20字节,获取4位首部长度和16位总长度。4位首部长度的范围是【0,15】*4=【0,60】。获取到首部长度后,总长度减去掉首部长度就是有效载荷。
如何向上交付?
根据8位协议类型,选择上层交给什么协议
介绍报文字段
- 4位版本:目前主要是IPv4和IPv6。IPv6是128位表示IP地址。
- 4位首部长度:范围是【0,15】*4,因为首部最少是20字节,故首部长度的范围是【20,60】。
- 8位服务类型:类似TCP的6位标志位。决定了IP报文转发时候的策略。常见的:最小延迟、最大吞吐、最高可靠、最小成本。比如说最小延迟,那在转发的时候,优先转发,不排队。
- 16位总字节长度:总大是64KB。标志着IP协议报文的总大小,所以不会产生粘包问题。但是由于下一层协议归定报文的最大长度,所以一般而言IP报文最大长度是1500。
- 8位生存时间:涉及到网络的拓扑结构。如果在网络中路由器A发到B,B发到C,最后再转到A,那么报文就会在路由器中一直存在,浪费资源。所以设置TTL:报文最大生存跳数,经过指定跳数后就会自动丢弃。
- 8位协议:在IP协议上层,可能是TCP协议,UDP协议,甚至直接交给应用层。所以双方的上层协议要对等,在将数据交到给IP层时候,就应该填充协议类型。
- 16位首部校验和:使用CRC进行校验, 来鉴别头部是否损坏。。
目前先对IP协议字段有个大体的认识,在第二行中剩余的三个字段还没有讲述。在后文中将会详细介绍。
下面来介绍了一下网段划分。
网段划分
围绕三个话题:网段划分是什么?为什么?怎么划分?
共识:
IP地址标记唯一的主机,IP地址可以划分:
网络号+主机号。
引入路由器
路由器的功能是负责组建子网,并负责报文转发。
例如在一个家庭内,家庭成员的设备都可以接入路由器中,路由器会为每个设备都配一个该局域网内独一无二的IP地址。
同时子网内设备的请求会通过路由器转发到运营商中。
但是IP地址只有32位,最多就42亿,人们就将IP地址按照网络号+主机号划分成五类地址。
分为A\B\C\D\E五类网络。A类网络中可以用的主机数最多,E类可用主机数最少。
- A类 0.0.0.0到127.255.255.255
- B类 128.0.0.0到191.255.255.255
- C类 192.0.0.0到223.255.255.255
- D类 224.0.0.0到239.255.255.255
- E类 240.0.0.0到247.255.255.255
但是很快的,这样的划分并不能解决需求,人们普遍申请A类网络,A类网络已经申请得差不多了。同时这个划分也有缺点,就是如果当前局域网中不需要那么多的主机数,多出来的主机数就被浪费掉了。
所以子网掩码被人们使用
子网掩码
- 子网掩码是一串32位以0结尾的序列
- IP地址与子网掩码进行按位与之后得到的就是子网掩码
子网掩码的例子
特殊的IP地址
0.0.0.0 :代表这个局域网
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
F.F.F.F:设为全 1 表示这个广播。给局域网内所有连接的主机发。
私有IP地址和公网IP地址
地址又分为公网和私网
公网和私网是不重叠的,公网是大部分的,标志唯一的主机。
而私网会在不同的局域网中发生重叠。
私网的范围
- 192.168.*
- 172.16 ---172.31.*
- 10.*
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP) 路由器既要组建内网同时也要将报文转发到公网上,所有路由器存在俩个地址,一个对内,一个对外。对内的子网LANIP,对外的叫WAN口IP。
处于俩个局域网中的主机是无法直接通信的,因为无法知道对方的地址。
如果局域网中的主机想访问外网。由于外网是存在固定的IP。所以是可以访问的。
具体的访问过程:依次将源IP替换为WAN口IP,达到广域网,广域网将IP报文交出去。这种技术叫做NAT技术
子网内的IP地址是不可冲突的,不同子网内的主机地址可能会相同。
真实的网络:公网+私网
子网是可以连接公网的,一定程度上,缓解了IP地址的数量问题。
模拟网段划分
报文想要发到公网上,就必须先知道公网上的IP地址,然后将IP报头中的源IP不断替换为WAN口地址,直到连接到公网上。同时NAT会为每一次替换保存,如果报文需要园路返回也是能做到。
路由
路由就是将IP报文转发。
会先查看主机的路由表,并且将IP地址&这一跳的子网掩码
如果相同就转发出去,不同继续匹配下一个路由器,最后转发到默认路由器中。
通过route命令查看路由表
另外:路由器之间会交换路由表,互相知道、互相学习。
最后剩一个话题:报头的第二行关于分片的问题。
分片与组装
为什么要分片?
因为数据链路层规定IP报文最长为1500字节。MTU:最大传输单位
分片的影响
但是分片是不好的,因为分片将丢包的概率提升了。
所以希望传输层一次性不要发太多的报文。这就是TCP层分段发数据的原因 MSS:最大段尺寸
如果实在超过了1500字节,那么就要考虑分片与组装
16位标识:属于同一个分片的报文,分片标识是一样的
3位标志:只关心最后一个 ,如果被分片了且不是最后一个分片 ,最后一位就是 1
13位片偏移:相对于原始报文的位置 *8
一个共识
所有的分片报文都会被填充IP报头
模拟分片
这份报文长度为3000?要分为几片?
三片 。因为要对每一份分片都填充报头数据。
怎么知道分片了?
分片标志中的更多分片是1 为0就查看片偏移。
如何组合?
a.开头的分片:更多分片是1,偏移量是0。
b.结尾的分片:更多分片是0,片偏移最大。
c.中间的分片:同一个标识,按照片偏移排序。
IP协议基本的知识就是这些。IP协议提高一种跨网络将数据包转发的能力,同时介绍了网段划分。现在的网络是私网+公网组合而成的,对于NAT技术,知识还不完善,下文继续讲解。