前言
在前面,我们学习了在传输层的TCP和UDP协议,今天将为大家讲解在网络层中的比较常见的IP协议。
前面学的TCP协议,主要是保证了数据的可靠传输,但TCP提供的数据传输的策略,真正负责数据传输的则是在传输层之下的网络层和数据链路层、物理层。
网络层主要负责路径规划,为数据的传输规划好最优路径,而数据链路层则是负责真正意义上的传输数据,例如,网卡,交换机。对于物理层,则是通过双绞线、同轴电缆、光纤等。
什么是IP协议?
IP协议(Internet Protocol,网络互连协议)是互联网协议簇的核心协议之一,主要用于在不同的网络之间进行数据包的路由选择和传输。网络层保证了数据可靠的从一台主机传输到另一台主机的前提。网络层解决的是从主机到主机的问题。
IP协议的协议头格式
- 4位版本:表示该IP协议是哪个版本的,现有能够使用的是IPV4和IPV6.
- 4位首部长度:跟TCP中的4位首位长度是一样的,这里表示IP头部的长度最长为15*4=60字节
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须设置为0)。4位TOS分别表示:最小延时、最小吞吐量、最高可靠性、最小成本,这四者是相互冲突的,只能选择一个。
- 16位总长度(total length):IP数据报整体占多少个字节。
- 16位标识 (id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一片里面的这个id都是相同的。
- 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分段,这时候如果报文长度超过MTU,IP模块就会丢弃报文,第三位表示“更多分片”,如果分片了的话,最后一个分片的位置为1,其他为0,类似于一个结束标记。
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值*8得到的,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
- 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64,每次经过一个路由器,TTL-=1,一直减到0还没到达,那么就丢弃掉,这个字段主要是用于防止出现路由循环
- 8位协议:表示上层协议的类型。用来判断使用的是TCP还是UDP协议,或者是其他的协议。
- 16位校验和:使用CRC进行校验,来鉴别头部是否损坏.
- 32位源地址和32位目标地址:表示发送端和接收端。这两个是IP协议头中最关键的信息。采用点分十进制的形式来表示,分为四组,一组8位。例如1.2.3.4
- **选项字段(不定长,最多40个字节) **
16位总长度(字节数)
16位总长度说明IP数据包最多只能容纳64kb,跟UDP一样可存储的最大长度,那么会不会跟UDP一样出现问题呢?虽然IP能传输的数量最大为64kb,但是IP数据包支持拆包组包操作,IP协议会自动把大的数据包拆除多个IP数据报携带传输,在传输到接收方后再进行组包。
16位标识、3位标志位和13位片偏移
这些被拆分的数据包是通过IP协议头中的16位标识来判断这些数据包时由哪一个数据包拆分的,同一个数据包拆分的IP数据包的16位标识是相同的。
13位片偏移则是用来判断同一个数据包下的IP数据包在组包时所处的位置。
在IP协议头中的三位标志位,其中第一位是保留位,还未使用;第二位是用来标识当前的数据包是否可以拆分,1的话表示该数据包不可以被拆分,0的话表示该数据包可被拆分。第三位是用来表示当前的数据包是否是拆分的数据包中的最后一个数据包,类似于一个结束标志。
8位生存时间
8位生存时间(TTL)表示该数据包可以在网络上的生存时间,单位是次,一般是64.每经过一个路由器,TTL就会-1.(经过交换机不会-1)。当TTL减为0时,在网上传输的数据包就会消失,这个机制可以防止在由于某个数据包的IP地址不存在,而导致数据包一直在网络上传输。
那么有没有可能在数据包到达目的IP之前,TTL就已经减为0了呢?其实是不会的,只要目的IP正确,那么数据包在网络上就可以传输到目的IP。TTL的最大取值可以是255,但推荐使用的是64、128.不知道大家有没有听过“六度空间理论”,六度空间理论认为,你和任何一个陌生人之间所间隔的人不会超过五个,也就是说,最多通过五个中间人你就能够认识任何一个陌生人,这个理论也叫小世界理论。那么对于数据包在网络上传输到目的IP也是这样的,在网络上传输255次一定能过达到对方。
IP地址管理
在IP协议中,IP地址是32位,可以表示最大值为40多亿,这个数据看起来很大,但是对于现在的我们来说,其实是不够用的,世界上的人口已经有73亿多了,而且一个人还不止只有一个IP地址,只要是需要联网的设备,都需要用到IP地址。那么怎么解决IP地址不够用的情况呢?
1.动态分配IP
在这种形式下,如果有一个设备连接到网络时,就会被分配到一个临时的IP地址。当设备断开连接时,该IP地址就会被释放回收,以便后续给其他人使用。简单的来说,就是有设备连接网络时,就给它分配IP地址,断开网络时就把IP地址给回收释放。
但是这个方案治标不治本,没有从根本上解决IP地址不够用的问题。虽然现在还在广泛使用。
2.NAT机制(网络地址转换)
NAT(Network Address Transiation,网络地址转换)是一种在传输层上实现的IP地址转换的技术。在NAT中,路由器通过修改传输数据包中的源IP地址和目的IP地址来实现地址转换。这种转换在不同的网络中常用于解决IP地址冲突、扩大私有网络数量并增强其安全性等问题。简单的来说,NAT其实就是将内网IP转换为公网IP,实现内部网络和外部网络的通信。
通过在路由器上维护一个地址映射表,这个表记录了内部私有IP地址和外部公有IP地址之间的映射关系。当内部网络中的设备需要与外部网络进行通信时,NAT就会将局域网内数据包的IP地址转换成公有IP地址。(若端口号相同,就会在映射时改变映射的端口号来区分不同的)
NAT机制下IP地址分为两类:内网IP(私网IP)和外网(公网IP)。如果一个IP地址是以*10.或者172.16.-172.31.或者192.168.*,那么其就是内网IP,否则就是公网IP。
在不同的局域网中,公网IP是唯一的,但是私网IP是允许重复的。
我们打开cmd.exe输入ipconfig进行查看.
- 同一个局域网内,主机A访问主机B,不会涉及到NAT机制
- 公网上的设备A访问公网上的设备B,也不会涉及到NAT机制
- 一个局域网中的主机A访问另一个局域网的主机B,在NAT机制中是不允许的,
- 局域网内部的主机A访问公网上的设备B,NAT就会生效.
NAT机制简单来说呢,公网IP地址其实就类似学校的菜鸟驿站,学校的每个人(私有IP地址)在填写收货地址的时候,直接填写学校的地址(公网IP)即可,每个人根据自己的收件码就可以取快递,这样就大大提高了快递员的送货效率了,不用一个一个送。
NAT机制是如何工作的
假设我们现在要访问QQ的服务器,那么我们的主机就先构造一个IP数据报,在访问的时候,中间就会经过很多路由器,到达我们的运营商路由器,运营商理由器有一个公网IP,当我们的数据包传输到运营商路由器后,数据报中的私有IP就会转换为公有IP,再去传输到QQ的服务器进行访问。当QQ的服务器接收到数据报后,看到的是公网的IP,而不是私网的IP。
当QQ的服务器接收到IP数据报后,就会做出相应的响应,构造一个数据报,根据目的IP传输回去,当到达运营商路由器后,会进行NAT网络地址转换,再根据私有IP地址返回。
在网络通信的过程中,其实不止有IP地址,还有主机上的端口号,端口号是用来区分同一个主机上不同的应用程序的,在NAT中,就可以用来区分不同主机上的不同程序。
那么如果我此时我和我的朋友同时想要访问QQ的服务器,那么会怎么样呢?如果我们两个此时恰好端口号相同又应该怎么办?
我们想要访问QQ的服务器时,首先我们会在我们的主机上构造一个IP数据报 ,中间经过广域网,到达运营商路由器,在到达运营商路由器之后,路由器的NAT网络地址转换机制就会把IP数据报上的IP地址转换为公网IP地址,接着再去访问QQ的服务器。
NAT机制内部会通过维护一个地址映射表,来保证数据包的正确传输。在IP地址替换时,会记录地址映射关系。
那么当QQ的服务器构造完IP响应数据包后,就会根据传过来的IP数据报中的IP地址和端口号,传输回去。同理的,在经过运营商路由器时,会根据地址映射表来修改IP数据报的IP地址和端口号。传输给对应的主机。
那么如果此时恰好我和朋友的端口号相同怎么办?
此时在NAT机制下,如果有端口号相同,那么NAT机制就将后一个重复的端口号替换成不重复的端口号。来保证数据报的正确传输。
其实两个主机的端口号相同的概率是非常小的,只有1/60000。
NAT机制的优缺点
优点:
- 节省IP地址:NAT机制允许一个公网IP地址对应多个私有IP地址,可以节省IP地址的使用;
- 提高网络性能:NAT机制可以避免IP地址冲突;
- 网络发生变化时,避免重新编址
NAT节省了大量的IP资源。
缺点:
- IP地址转换表的生成和销毁都需要额外的开销;
- 难以进行监测和管理,NAT设备会改变网络传输的源地址。
- 有些应用程序需要用到固定的IP地址或者特定的端口,使用NAT后可能会导致应用程序失效。
虽然NAT机制能够解决IP地址不够的问题,但是没有从根本上解决问题,所以,有了IPV6,IPV6是解决IP地址不够用的根本解决办法。
3.IPV6
IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPV4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。由于IPv4最大的问题在于网络地址资源不足,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍 。
IPv6能表示的字节是16个字节,即可以表示2^128个IP地址。这个数其实是非常大的,比IPv4能表示的IP地址数要多上很多倍。这个数字是非常庞大的,除非人类走出地球,否则肯定是够用的。
为什么国家要大力推进普及IPv6?
目前,在我国IPv6的活跃用户已经达到了7.94亿。在全体网民总数中的比例由2017年初的0.51%提高至72.70%。这样的增长速度是非常惊人的,这主要是与中美贸易争端_百度百科 (baidu.com)有关,IPv4的分配权在米国人手中,虽然负责分配的组织是一个“第三方组织”,但是背后的投资人有美国军方的人,一旦美国人制裁,不给我们中国分配公网IP,那就会对中国的互联网发展带来毁灭性打击。
所以,IPv6的发展就是用来绕开美国人限制中国发展的一个重要手段,虽然我们国家目前IPv6的普及度已经到了70%以上,但是实际上上网的时候,仍然走的是IPv4协议(IPv4和IPv6共存),如果直接切换,还是有风险的,所以只要把IPv6准备好了,就不怕制裁。
网段划分
网段划分也是IP协议中比较重要的一个。IP地址一般会分为两部分:网络号和主机号。网络号是IP地址中用于识别设备所属网络的部分,而主机号则表示该主机在网络总的位置。
注意:
- 同一个局域网内的设备的网络号必须相同,主机号必须不同;
- 两个相邻的局域网的网络号不能相同。
我们看图中,192.168.12就是网络号,而最后的5,7表示的就是主机号。
那么我们如何判断IP地址中哪一部分是网络号,哪一部分是主机号?那这就得需要借助到子网掩码。
子网掩码
子网眼马甲又叫网络编码、地址编码、子网络遮罩,是指明一个 IP地址 的哪些位标识的是 主机 所在的子网,以及哪些位标识的是主机的位掩码。 子网掩码不能单独存在,它必须结合IP地址一起使用。 子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在 局域网上,还是在 广域网上。
子网掩码也是用四个字节来表示的,与IP一样,1个字节(8给比特位)为一组,采用点分十进制。
子网掩码的前半部分必须全为1,后部分必须全为0,不能出现1和0交叉出现的情况。
假设现有一个IP地址为192.168.11.5,子网掩码是255.255.255.0,那就说明192.168.11是网络号,而5是主机号。
下面我们来看一下远古时期的网段划分方式,现在已经很少使用了。
无类域间路由选择(CIRD)
CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间。它可以将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,使它们合并成一条路由从而较少路由表中的路由条目减轻Internet路由器的负担。
CIDR 还使用“斜线记法”,它又称为CIDR记法,即在IP地址后面加上一个斜线“/”,然后写上网络前缀所占的比特数(这个数值对应于三级编址中子网掩码中比特1的个数)。
特殊IP地址
在IP地址中,也有一些特殊的IP地址存在。
- 如果主机号全为0,说明这个IP是网络号,不能分配给任何一个具体的主机。
- 如果主机号全为1,说明这个IP地址是一个广播地址,通过这个IP地址发送的数据报,该局域网内的所有主机都能够接收到数据报,同样,这个IP地址也不能分配给任何一个具体的主机。什么时候可以用到广播IP呢?我们在手机看视频的时候,可能会想要投屏到电视上看,那么在手机视频上其实有一个投屏按钮(TV),当我们点击按钮,就会列出一个设备列表,选择投屏到哪个设备上。这个功能其实就是利用到了广播IP,在点击按钮后,会往对于的广播IP发送一个数据包(UDP),具有投屏功能的设备就会返回响应,告诉自己的IP以及是什么设备,反之,没有投屏功能的就不用返回响应。
- 环回IP:回环地址是一种特殊的IP地址,通常为127.0.0.1或主机名localhost。它允许计算机的软件组件在本地主机上进行网络通信,用于调试、测试网络软件,或在本地计算机上运行服务器软件。回环地址不会被发送到其他计算机或网络,只在本机内部完成通信。这个IP一般用于一些测试工作,可以避免网络干扰等因素。
路由选择
IP地址的路由选择是指互联网协议(IP)在确定数据包在网络传输中的最佳路径的过程。在IP数据包中,存在源IP和目的IP,那么接收到数据包的路由器,就需要决定这个数据包要从哪个接口转发出去,以便数据包能到达目的IP。
但网络是一个非常复杂的环境,我们想要将数据包传输到目的IP,中间隔着很多歌路由器,那么路由器又是怎么知道接下来要往哪里转发呢?
网络中的路由器并不能够知道数据包到达目的IP的全部路线,它只知道和自己相连的路由器的路径,所以在传输的时候,就会类似于问路的方式,从而到达目的IP。
路由选择主要是基于目的IP和路由表来进行的。在路由器内部,存在着一个非常非常重要的数据结构,那就是路由表。
路由表类似于hash表一样,key相当于IP地址(网络号),而value就是对应的网络接口(往哪个方向走)。
当IP地址达到路由器后,就需要进行查表操作,看目的IP是否在表中存在,如果存在,就按照对应的接口继续转发即可。若没有查找到,路由表就会进行一个“默认的表项”(下一跳),往一个更高层级的路由器去,若在跳后依旧没有找到,就继续跳。当找到后,就按照路由表中对应的接口继续转发即可。
路由选择中,其实可以使用多种算法的,例如:
- 最短路径算法:两种常用的最短路径算法是Dijkstra算法和Floyd-Warshall算法。Dijkstra算法通过指定起点,逐步计算最短路径,使用两个数组S和U来记录已求出和未求出最短路径的顶点。Floyd-Warshall算法则通过动态规划计算所有顶点之间的最短路径。
- 距离向量算法:该算法将网络视为一个图,通过记录到达目标节点的距离和下一跳节点的信息,选择距离最短的路径将数据包传输到目标节点。
- 链路状态算法:该算法将网络视为一个图,通过记录每个节点的邻居节点信息和到达目标节点的路径信息,计算每个节点到目标节点的最短路径,选择最短路径将数据包传输到目标节点。
当然,IP协议中还支持多种路由协议,例如静态路由协议和动态路由协议。动态路由协议根据网络拓扑的变化自动更新路由表,而静态路由协议需要手动配置路由表。
以上就是IP协议的所有笔记~
若有不足,欢迎指正~
版权归原作者 小猪同学hy 所有, 如有侵权,请联系我们删除。