目录
1.10 IP协议的另一个重要的功能,路由选择(数据报在IP协议下是如何进行传输的)
前言:
在前面的TCP/UDP 协议的讲解中,我们是主要针对了传输层比较常用的协议进行了讲解,本章将对网络传输五元组中的网络成进行讲解,在网络层这里主流的协议就是IP协议,下文将对IP协议中的报文结构和部分特性进行讲解
1.IP协议报文结构 和 部分特性
在讲解IP报文结构之前我们先看一下IP报文是长啥样的
接下来我将把上图的知识点进行拆解进行讲述
1.1 4位版本号
现在在市面上被大伙使用的版本号就只有两种,一是IPv6,另外一个就是IPv4,至于它们有啥区别,在讲解32位IP地址的时候会进行详细说明,在这先了解一下就欧克克了.
1.2 4位首部长度
设定和 tcp 一样IP 报头可变长的.IP 报头又是带有选项的此处单位也是 4 字节.
1.3 8位服务类型
这个报文属性在之前的传输层协议中,是没有出现过的,在IP报文是第一次出现,8位服务类型主要起到的作用是"模式切换", 至于啥是模式切换,把它换做手机的各种模式就好理解很多了.
比如当你需要进行学习的时候,手机的模式一般都会调为震动模式,当你需要睡觉时手机的模式一般都会调为"勿扰"或者"静音"这两个模式, IP协议的8为服务类型也是如此,但是此处的服务类型只有4种.
1) 最小延迟: 传输一个数据报的时间会尽可能的短
2)最大吞吐量: 一定时间内传输的数据量尽量多
3)最高可靠性: 在传输过程中更不容易触发丢包
4)最小成本: 在传输过程中消耗的硬件资源最低
当然以上4中模式是互斥的,不能组合使用(总不能勿扰模式 和 振动模式一起开吧)
虽然IP协议支持这个机制,但是实际开发中很少会使用到,这些模式一般都是系统级别的开发才会涉及到的,我们看看就欧克克了.
1.4 16位总长度(字节数)
总长度 = IP报头 + 载荷长度 --> TCP报文长度 = IP载荷长度 = 总长度 - IP报头长度,
在TCP协议的报文讲解的时候我们发现TCP的报文结构也有一个 TCP报头长度
通过这个 和 上述算出的TCP报文总长度,就可以去计算出TCP载荷部分长度
TCP载荷长度 = TCP报文总长度 - TCP 报头长度 = IP报文总产度 - IP报头长度 - TCP报头长度.
然后我们不难发现,怎么这个IP协议的总长度只有16位的(换算成正常数据的大小也就是64kb),现在的要传输的数据随随便便就可以超过64kb,IP报文时怎么放的下的,如果时一个IP数据报肯定是难以将一个正常大小的数据进行存放的,但是IP协议自身支持"拆包组包"机制,一个完整的数据如果大小大于64kb的话,IP协议会自动将这个数据报分成多个IP数据报进行传输,然后在传输到接收方的时候又会自动将之前拆分的数据进行重新组合,这样的话在大的数据也是可以在网络层使用IP协议进行传输的.
具体的话大概是如下图所示
这里就会产生新的问题了,网络传输这么复杂,等所有的IP数据报到达对端的时候,对端怎么去区分哪个数据报原本是属于哪条数据的,这个数据报在原本大的数据的顺序是在前面还是在后面,这个问题IP协议通过3个报文结构去解决了.
1.5 16位标识 13位片偏移 3位标志位
这3个结构相互配合就可以让拆包的数据在接收端接收的时候能准确的将多个IP数据报进行组合,那来看一下这3位在""组包"时起到的作用吧
1) 16位标识: 当一个传输层下来的数据进行拆包的时候,来自同一个数据的拆出的多个IP数据报的16位标识是相同的,
2) 13位片偏移: 来自同一个数据报拆分的IP数据报会根据这一段数据在整一个数据中的数据进行片偏移的大小分配,前一个包的片偏移更小,后一个更大,通过片偏移,就可以去分IP数据报的先后顺序
3) 3位标志位: 这3位标志位中其中有一个是没啥用的,还有一位表示的是是否允许拆包,这块已经拆了,所以这一位肯定是1,剩下的一位,表示"结束标记"标识当前的包是否是最后一个.
接下来会使用画图的方式将这3个结构表示出来
这里面的数值都是拍拍脑袋想出来的(随便填的),不要去过多的关注数值的大小,而是数字在这其中意义.
1.6 8位生存时间
单位是 次初始情况下 TTL 会有个数值(32 /64 /128)每次经过一个路由器转发,TTL 就会 - 1减到 0 了 就会被丢弃了,正常来说ttl足以支持数据报到达网络的任意一个位置,如果确实出现0就基本可以认为目标IP不可到达,这里就有点想"六度空间理论"所描述的东西了(你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过6个中间人你就能够认识任何一个陌生人).
1.7 8位协议 和 16位首部校验和
这两位都是比较简单这,就放在一起讲了,8位协议就是去描述在传输层是这个数据是使用了哪个传输层协议(TCP,UDP,等等),16位首部校验和就是老朋友了,其作用跟在传输层的是一样的确保数据到达对端的时候数据是完整无误的.
1.8 32位源IP地址 和 32位目的IP地址(重点)
这两个就是IP协议中最重要的部分了,当前网络上的主机十分多(不是只有少部分人有上网的设备),此时就需要有办法去描述一个主机的具体位置,IP地址就是解决这个问题的关键,所谓的IP地址实际上是一个32位的整数(4字节),是由点十进制表示的,由于按照32位的方式表示,就会使这个数字变得很大,一般都会把IP地址按照点十进制来表示, 点十进制就是是由3个"."去把32位分成4个部分,每个部分就使8位(1字节)
可以打开cmd输入"ipconfig",就可以查看当前主机的IP地址了.
但是如果是使用32位表示全球用户的IP地址的话恐怕是有些困难了,32位(4字节)大概是42亿多,当时全球的人口总量加起来都超过了这个数字,32位表示的数据量是非常有限的,而且地址原则上是不能出现重复的(每个设备的IP地址是不得重复的)
那这里就衍生了一个问题 IP地址不够用咋办?
此处有以下几种解决方法:
1.动态分配IP(DHCP)
一个设备,不会一直需要上网,当这台设备需要上网的时候就给他分配一个IP,不需要的时候就不分配,但是当同时上网的人数增多到一定数量时,32位的IP地址肯定还是不过用的,所以这种方式只能缓解但是不能根治.
2.NAT机制(网络地址转换) --- 理解网络结构的关键
NAT机制把IP地址分成了两个大类
1).内网IP
允许不同局域网的设备内网IP重复,但同一个局域网内的设备,内网IP不能重复,在别的局域网中,也可以使用这样的 IP 地址~~此时,大量的设备可以使用同样的 IP 了(但是是在不同局域网中),此时 IP 不够用问题就得到了很大的改善了,
2).外网IP
如果局域网内部的设备之间进行通信的话肯定是没问题的,但是A局域网中的设备想要和B局域网中的设备进行通信的话,此时就可能会遇到一个问题,我内网IP相同怎么办,此时就有一个简单粗暴的方式解决了这个问题,规则直接禁止了不同局域网内的设备直接通信,此时就需要有一个带有外网IP的设备进行中转(服务器)
3).局域网内部设备区访问一个带有外网IP的设备(天降猛男)
我们平时使用的电脑都是在局域网内部使用,还有一类设备就是服务器,服务器就可以拥有外网IP,内网的设备想要和外网的设备进行通信的时候,就涉及NAT工作过程了.
这里使用QQ服务器发送请求来举例
NAT机制下,意义在于,一个外网IP并不代表一个设配了,而是很多设备.
那当对端要返回响应的时候应该咋办呢?
qq服务器返回的响应也是会先到达电信的路由器此时就会出现一个问题,由于我发送信息的时候到达电信服务器的时候,是把我源IP给更换成了电信路由器的外网IP的,此时我该如何去查询最开始源IP呢,如果是我们遇到这种问题第一时间先到的是记事本,在好的记性都不如把数据给写下来.
对于NAT设备(路由器)来说,在触发NAT的时候(一开始我发送的数据经过电信路由器将内网IP替换的时候),会维护一个映射表,这个映射表就相当于一个记事本,它会将触发NAT时的 源IP 和 外网IP给记录下来.
就像是这样(实际的我也不知道)
此时NAT设备通过查表,就知道了,要把目的IP在替换回来,这个时候电信路由器和我自己的电脑之间还是局域网内部通信,此时就可以很容易的可以完成通信了(真实的情况,是我的电脑的数据经过比特路由器,会进行 NAT, 经过电信光猫,又有 NAT,经过电信路由器.又有 NAT.(每次经历 路由器转发,都“可能”会触发 NAT 机制)).
当前的互联网世界,就是通过NAT构建起来的,但是NAT有几个缺点很明显:
1.效率不高
2.非常繁琐
3.不方便直接访问局域网内的设备
而且NAT机制并没有从根本上解决IP地址不够用的问题,但是但是NAT有个有一个最大的优点支撑着它区成为互联网的构建者 ---- 这一优点就是 NAT是一个"纯软件实现"的方案.
3.IPv6
IPv6才是从根本上去解决地址不够的问题,现在我们主要使用的是IPv4.
IPv4是4个字节,32位表示IP地址;而IPv6是16字节,128位表示IP地址的,我们知道IPv4的大小是42亿多,那IPv6就是4个42亿相乘,这个数字十分恐怖,数字大到足以支撑我们为地球上每一粒沙子都分配一个IP地址.
这里就有一个疑惑了,那为啥不是IPv6构建起的互联网呢,那当然IPv4和IPv6都是硬件设别,而且IPv4和IPv6是不兼容的,想要升级IPv6,就需要去升级你的路由器(简单点的说就是氪金),一般来说我氪金了设备上机能加强我的上网体验那肯定是没问题的,但是问题就出在这了,你从IPv4升级到IPv6并不会提高你任何的使用体验而且升级也是需要不少米的,如果换做是你你会去升级吗?
所以IPv6的普及不是很广,相比之下,NAT方案,只需要路由器开发商开发出新版本的软件(路由器固件),升级软件,即可直接支持(成本非常低).
1.9围绕IP地址还有其他点
IP地址是分为前后两个部分,一般来说一个IP地址前三部分就是网络号,而且同一个局域网内的网络号都是一样的.
所以就会出现以下几个性质:
1.同一个局域网中设备的网络号必须相同,主机号必须不同
2.两个相邻的局域网,网络号必须不同
哪任何去区分一个IP地址,哪个部分是网络号?哪个部分是主机号呢?
此时就需要通过子网掩码开进行区别了,子网掩码也是4个字节的,但是子网掩码左侧必须是连续的1,右侧必须是连续的0,1和0不能穿插1的范围就描述了ip地址的对应的哪些位是网络号.
子网掩码也是可以通过cmd输入ipconfig可查询的到的,将这些数字转换成二进制之后,就会得到连续的24个1和8个0,这就表示了前24个比特位是来描述网络号的,后面8个比特位是来描述主机号的,家用的一般都是255.255.255.0
特殊IP地址
1.
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网; 不能给具体的设备分配这个IP,将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
此处的广播,才传输层上只能使用UDP,而不能使用TCP(TCP无法针对广播地址进行三场握手,建立连接操作)
2.
127.*的IP地址用于本机环回 (loop back) 测试,通常是127.0.0.1(本机和本机进行通信的时候就可以使用这个IP地址)
1.10 IP协议的另一个重要的功能,路由选择(数据报在IP协议下是如何进行传输的)
在高德地图上,如果你搜一个目的地,就能够规划处几条路线.地图软件路径规划,是站在全局的角度,地图服务商这边能够知道整个的城市道路情况,交通情况做出一个“最优解"
但是路由器,无法做到理解全貌 只能认识部分网络环境(路由器能够知道和它相邻的一些设备的情况)在这个前提下,进行路由转发,就只能“摸着石头过河”,走一步算一步,这里给出的路径 也不一定是最优解,只能说是“较优解,
上述的过程就相当于一个数据包传输的过程,每个路由器内部都有一个数据结构"路由表",数据报到达路由器的时候,就需要查询路由表(问路)
1)如果查到了,就可以直接按照这个方向继续转发,数据报就能到达(一般是查不到的)
2)如果没有查到,路由器就会给一个默认的方向(下一跳地址),沿着默认的方向走(往往是走到了上级路由器这里)
总结:
本章简单描述了在网络层一个重要的协议(IP协议),IP协议中的IP地址传输的过程发挥着很大的作用,其传输过程中涉及到的NAT机制也是构建互联网的重要部分(需要重点去理解一下),IP协议中的"拆包组包"机制 和 三个内部结构也是很成功的将一个大的数据传输到对端,以上都是在我们后面学习中很重要的知识点,如果发现在哪有叙述错误的话,可以在评论区进行补充,蟹蟹啦.