小王学习录
- 今日摘录
- IP数据报
- 数据报首部
- IPv4的局限及解决方法
- 地址管理
- 路由选择
- 扩展:NAT和NAPT的结合使用
今日摘录
关山难越,谁悲失路之人。萍水相逢,尽是他乡之客。
网络层的职责是地址管理
和路由选择
,在网络层中最重要的协议是ip协议
。下面先介绍一下ip数据报,再聊地址管理和路由选择。
IP数据报
先看看IP数据报结构:
数据报首部
4位版本
:IPv4或IPv6。(中国IPv6是一项伟大的创举)4位首部长度
:与TCP报头一样,单位为4个字节
8位服务类型
:实际有效位为4位,其余有3位优先权
字段,一位保留位
。这四位有效位只能有一位值为1,代表了ip协议的四种形态,分别是最小延迟、最大吞吐量、最高可靠性、最小成本
。16位总长度
:报头+数据。单位为字节
,意味着一个ip数据报最大为64kb
,如果大于64kb,在网络层会自动拆分
和组装
。拆分和组装时要依靠下一行字段。16位标识
:用于标识不同的传输层报文,一个报文拆分成多个ip数据报,来自同一报文的标识值相同。3位标志
:用于标识当前数据报是否为所属报文的最后一个数据报。13位片偏移
:用于给属于同一报文的数据报排序,保证接收方组装数据报时是有序
的。8位生存时间(TTL)
:数据报在网络传输过程中的最大生存时间,注意这里的时间单位
并不是秒和毫秒,而是经过路由器的个数
,准确来说是向每一个路由器寻址的次数
(每经过一个路由器进行一次寻址)。每个TTL都有一个初始值
,不同操作系统的TTL值不同(32,64),每经过一个路由器TTL值减一,当TTL值为0时,认为目的ip地址不存在
,将数据报丢弃
。- 8位协议:用于标识上层,即传输层的协议(TCP或UDP)。
16位首部校验和
:这个校验和只是首部
的校验和,因为载荷的校验和在传输层进行计算(TCP和UDP的校验和字段)。32位源ip
:ip数据报发送方的ip地址。在计算机中用32位二进制标识,平时表示时将32位分成4份,对每一份用点分十进制表示。32位目的ip地址
:ip数据报接收方的ip地址。选项字段
:与TCP的选项字段一样,长度不定。
IPv4的局限及解决方法
在IPv4体系中,ip地址用32位二进制表示,这就意味着IPv4能为全球体统的ip地址数最多有42亿九千万个。每一个能上网的设备都需要一个ip地址,随着互联网的蓬勃发展,能上网的设备种类越来越多。PC、移动手机、服务器、路由器乃至于万物联网,42亿九千万这个数量已经不足以为全球的上网设备提供ip地址了。
为了解决这个问题,有了三个解决方法,实际上前两个只是缓解,第三个才是从根本上解决了IP地址不够用的问题。
-
- 动态分配ip地址
当有一个设备要上网时就给这个设备分配一个ip地址,这个设备不上网时,这个ip地址就分配给其它要上网的设备。
这只是提高了ip地址的利用率,并没有从根本上解决问题。
- 动态分配ip地址
-
- NAT地址转换
NAT地址转换实质上是实现了用一个ip地址同时代表多个设备。
- NAT地址转换
在NAT中,将ip地址分为私网ip(内网ip)和公网ip(外网ip)。
私有ip有10.* 、 172.16.* - 172.31.* 、 192.168.* 。剩下的地址都是公网ip。
在不同的局域网中,私网ip可以重复使用。但公网ip只能有一个。
当一个私网ip要访问公网ip时,经过NAT设备(路由器)进行地址转换之后,就会将私网ip映射成一个公网ip,同一个内网中的设备映射的公网ip是相同的。多个同一内网的ip去访问同一个服务器(外网ip)时,在服务器方显示的源ip都是同一个,即该子网中设备映射的公网ip。看以下图解:
当公网ip收到内网ip的访问时,虽然无法得知访问者的内网ip是多少,但是知道了访问者的公网ip和端口号,将响应发送给访问者的公网ip,公网ip的路由器会根据端口号来区分具体响应的是哪个主机,从而完成通信。
公网ip在没有收到内网ip的访问时,是无法直接与内网ip进行通信的。这是因为如果内网ip不访问公网ip,公网ip就不知道内网ip的端口号,也就无法与内网ip建立通信。同理两个局域网内的内网ip也无法直接通信。
NAT地址转换可以有效缓解ip地址不够用的问题,但是带来的副作用是使得网络环境更加复杂。
-
- IPv6
IPv6从根本上
解决了ip地址的数量问题
。
IPv4用32位表示,可表示的ip地址有42亿九千万个。
IPv6用128
位表示,位数提高为原来的4倍,可表示的ip地址个数是42亿九千万的四次方
。这个数量可以给地球上的每一粒沙子都分配一个ip地址了。
我国一直走在IPv6研究的最前方
,目前IPv6的普及程度是全球普及率最高
的。大家可以查看以下自己的路由器配置是否开启了IPv6。当开启IPv6之后,网速不会变得更快,信息不会变得更多,唯一不同的是你在互联网世界所踩的每一寸土地,都将属于我们自己,历史的债将在IPv6还清
。
- IPv6
地址管理
为了方便进行地址管理(组网),将ip地址分为了网络号和主机号
网络号
:保证相连的两个网段有不同的标识
主机号
:用于区分同一网段中的不同主机。同一网段中的网络号相同,主机号不同。如果同一网段中有两个设备主机号相同,那么这两个设备中势必有一个不能上网。
那么问题来了,一个ip地址的哪几位是网络号,哪几位是主机号呢?这需要靠子网掩码来进行区分,以我的ip地址为例:
看下图:
子网掩码的左半部分全为1,右半部分全为0,子网掩码为1的位数就是网络号的位数。以我的ip地址为例的话就是网络号为10.138
。
- 如果将一个ip地址中的主机位全设为0,就成为了
网络号
,代表这个局域网
。- 如果将一个ip地址中断主机位全设为1,就成了
广播地址
,可以为局域网内的所有设备发送数据。结合UDP的知识,我们知道如果向10.138.255.255发送UDP报文,则整个局域网内的所有设备都可以收到。127.*
的ip地址用于本机环回测试,通常是127.0.0.1。通常
将主机号为1的地址设为默认网关
,这个可以自由配置
。
路由选择
在每一个路由器中都有一个路由表
,在路由表中保存了周围设备的信息,当ip数据报经过一个路由器时,都会查看路由器的路由表,根据自己的目标ip看一下自己的下一站应该去哪个ip。如果路由表中有下一站信息
,就会直接顺着路由走,如果没有会顺着路由表的默认路由
走。每查看一次路由表就会使TTL
值减一。如果TTL值减为0了,说明目的ip不存在,永远找不到,就会丢弃这个ip数据报。
以上简单介绍了路由选择的过程,实际上的路由选择过程十分复杂,涉及到路由表的配置,更新等一系列问题。
扩展:NAT和NAPT的结合使用
通过上面对NAT的介绍我们知道NAT可以将内部网络的私有ip地址映射为公共ip地址,而NAPT
在此基础上进一步处理端口号
。
具体的处理过程是:将TCP
和UDP
(注意NAPT只能对TCP和UDP的端口号进行转换)的源端口号
修改为一个临时的未被占用的端口,并在映射表中记录这个映射关系
。当外部网络的响应返回时,NAPT会根据映射表将目标端口号恢复
到原始的内部设备的端口号,然后将数据报传递给相应的设备
。这种方式允许多个内部设备共享
一个公共ip地址,通过端口号
的不同来区分它们的通信流量。
总而言之,NAT和NAPT结合使用来实现私有网络地址到公有地址的映射。