关于IP协议,这里只会介绍两点,①.地址管理,使用IP协议,标识网络上某个设备的位置。②.路由选择,在两个通信的节点之间,规划出一个合理的路径。
(一).地址管理
关于地址管理,我们还是先介绍一下IP协议的报文格式。

1.4位版本
"4位版本",事实上只有两个选项**"IPv4"** 和**"IPv6"**。IPv6是近几年才多起来的。下面主要介绍IPv4
2.4位首部长度
IP协议的4位首部长度和TCP的首部长度一样,也是变长的,单位也是4个字节。如果里面的值是"0xF",那么转为十进制就是15,15*4=60
3.8位服务类型(TOS)
"8位服务类型(TOS)"事实上,就决定了IP协议的工作方式 。事实上,这8位服务类型只有4位起作用,有3位已经废弃了,还有1位是一个保留字段,必须置为0。 剩下的那四位分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。IP协议可以切换工作状态,如果切换为"最小延时",则会保证主机A到主机B的数据包会以最短的时间到达,剩下的以此类推.......事实上,这四位也有api可以用来设置。
4.16位总长度(字节数)
16位总长度表示了IP数据包的总长度,即报头+载荷的长度。
16个字节,意味着就是64KB,如果传输的数据超过了64kb,那么IP协议该如何处理?
IP协议内置了**"拆包"** 和**"组包"**的功能。例如,IP数据包携带了一个比较大的TCP数据包,那么IP协议就会自动拆成多个,通过多个IP数据包共同传输一个TCP数据包。
5."16位标识"和"3位标志"和"13位片偏移"
这三个属性,保证了"拆包"和"组包"的正确性
"16位标识",用于标识哪几个IP数据包是一组的。因为在拆包的时候,会把拆出来的多个包,设置为相同的标识。组包的时候,会把相同标识的数据报组合到一起
"3位标志",事实上只有两位有效。其中一个标志位,表示是否触发了"拆包"操作;还有一个标志位,表示当前包是否是最后一个。
"13位片偏移",描述的组包的先后顺序。偏移小的放前面,偏移大的放后面。
6.8位生存时间(TTL)
"8位生存时间(TTL)"是一个IP数据包,能够在网阔上传输的最大时间。单位是"次数"。IP数据包每次经过一个路由器转发一次,TTL的值就-1,TTL如果减到0,就说明该数据包到不了,则会就会被丢弃掉。

上图是我访问百度服务器的图片。对于TTL来说,初始值是64,中间经过了13次路由器的转发就到达了百度的服务器。
如果地址是对的,路由器经过了64次转发,是否会没有到达对方的服务器?
事实上,可能性不大。一方面是因为,TTL可以设置为更大的值

当我访问"必应"的服务器的时候,这时候,TTL就初始设置成了128,然后通过14次的路由器转发就到达了必应的服务器
另一方面,在网络中,有一个"六度空间"这样的理论,表示"两个设备之间,不需要那么多次转发,就会到达对端"。这个意思就是,每个路由器虽然只认识和它相邻的设备,但是路由器是可以发动它的朋友,甚至朋友的朋友,来找目的IP的。
7.8位协议
"8位协议",用于表示传输层使用的哪种协议。在分用的时候,IP协议会解析IP数据包,此时就会拿到载荷,然后交给上层处理。上层是传输层,此时就要明确,使用的是TCP协议进行传输的还是UDP协议进行传输的,毕竟报头都不一样,如果不明确,则会造成数据的传输错误。此时这"8位协议"就能起到区分的效果。
事实上,每一层都有区分表示。传输层=>应用层,是靠端口号来进行区分的;网络层=>传输层,是靠8位协议来进行区分的;数据链路层=>网络层,也是有一个类似的协议编号的,这个后面再介绍
8.16位首部校验和
IP协议的"校验和"与TCP/UDP的校验和不同,IP协议的校验和只需要针对"首部"进行校验就可以了,载荷部分有TCP/UDP自行校验
9."32位源IP地址"和"32位目的IP地址"
(1).基础概念
"源IP地址"和"目的IP地址"是IP协议最关键的部分。IP地址本质上是通过32位整数来表示的,由于32位整数不方便于都,所以通常会把IP写作**"点分十进制"** 的表示方式,用三个点分出四个部分 。每一部分是8个bit位,1个字节 。范围是0~255。例如,192.168.100.24,这就是一个IP地址。
(2).IP地址不够用的解决方案
随着互联网的发展,32位IP地址,只能表示42亿9千万个不同的IP,在当前社会,IP地址其实早就不够用了,那么该如何解决?
Ⅰ.动态分配IP
如果上网,则分配IP,如果不上网,则不分配IP。这个办法,只能有所缓解,不能从根本上解决问题。
Ⅱ.NAT机制,进行网络地址转换
NAT机制,是当前网络世界的最主要的方式。
事实上,我们的IP地址具体分为两大类,一个是**"公网IP"** ,一个是**"私网IP"** 。公网IP是唯一的,私网IP是在不同的局域网中,可以重复的。对于私网IP,范围为"10.*","172.16.*~172.31.*","192.168.*"的,都是私网IP。
NAT机制,就是可以用一个外网IP对应一系列的内网IP的设备,即一个设备有一个独立的局域网IP(可以重复),但是多个设备公用一个外网IP(不允许重复)
例如,我现在学校里,连的学校的局域网,我电脑的私网IP地址为192.168.100.200,那么另一个局域网中也可能有IP地址为"192.168.100.200"的这个设备,这个只是私网IP,可以重复,但是在学校的局域网中,只有我一个有这个192.168.100.200这个IP。对于公网IP,我这个学校的局域网都是使用的同一个公网IP
在NAT的背景下,网络通信是如何进行的?
①.同一个局域网下,设备A访问设备B
由于在同一个局域网中,IP地址本身不允许重复,所以通信就不会受任何的影响,此时NAT就不会起作用
②.公网设备A访问公网设备B
由于公网地址不重复,所以通信不受任何影响,此时NAT也不起作用
③.不同局域网,设备A访问设备B
这个是不允许的
④.局域网设备A访问公网设备B
此时就会发生NAT网络地址映射
通过一个图来看

此时,当三个设备都需要去访问BD的服务器的时候,就会出现下图

当BD服务器接收到请求的时候,就需要解析请求,然后返回响应,此时就会出现下图

此时,由于运营商路由器收到的三个数据包的目的IP都一样,运营商是如何区分哪个数据包是哪个设备的?
事实上,运营商服务器在进行NAT地址映射的时候,其内部有一个类似于"哈希表"的结构,将替换前的ip地址和端口号,与替换后的ip地址和端口号都记录了下来

类似于这样的结构,此时运营商路由器就可以区分出来了
可能这时候会有人问了,对于客户端的端口号,不是操作系统随机分配的吗?那么两个设备的客户端的端口号,是否能够分配到一样的端口号?
事实上,这是有可能的,但是概率微乎其微。如果真的遇到,事实上也是可以解决的

路由器进行NAT地址映射的时候,端口号是可以随意进行修改的。端口号可以用来区分同一个主机上的不同程序,也可以用来区分不同主机上的不同程序
④.公网设备A尝试访问局域网设备B
事实上,这也是不允许的。但是可以在电脑上搭一个能让外网访问的服务器,只不过需要一点特殊的手段。例如,内网穿透,通过VPN(虚拟私人网络)。这些手段都不和NAT冲突,本质上都是借用其他的带有公网IP的设备进行转发
下面通过一个图来理解"内网穿透"

总结:对于NAT机制来说,本来一个设备一个公网IP不够用,然后通过NAT机制,若干个设备共用一个公网IP就够用了
Ⅲ.使用IPv6
IPv6,是解决地址不够用的最终方案。
IPv4是使用4个字节作为IP地址,而IPv6是使用16个字节作为IP地址,16个字节,就是128个bit位,即 2^128=2^32 * 2^32 * 2^32 * 2^32 ,号称 "给地球上每一粒沙子都分配一个IPv6地址都绰绰有余"。但是也是有弊端的,因为IPv6和IPv4并不兼容,升级IPv6就需要更换路由器,但是网速没有提高,所以IPv6的普及程度还是比较低的。
Ⅳ.IP地址的其他使用规则
这里,主要介绍网段划分
通常,我们会将一个IP地址分为两个部分,前半部分称为"网络号",后半部分称为"主机号"

同时规定,**同一个局域网中,网络号必须相同,主机号必须不同。两个相邻的局域网中,网络号必须不同,主机号无限制。**通过一个图来看

此时,这三个设备都是连到路由器上的,所以都可以上网

此时,又连上一个设备4,我们发现,虽然连到了一个路由器上, 但是设备4并不和主路由处于同一个局域网,也就是说,他俩的网络地址不同,所以设备4无法进行上网

如果,设备2和设备3处于同一个局域网,同时两个设备的IP地址相同,那么就会导致两台设备都无法进行上网

此时,处于两个局域网,这两个局域网就相当于是"相邻"的局域网,这两个局域网之间,不能有一样的网络号
路由器为什么会有两个地址?
这是因为,在路由器的背面,有WAN口和LAN口,WAN口代表着一个地址,LAN口代表着一个地址。路由器的两个IP是在不同的局域网中的。路由器的功能就相当于把两点局域网连接到了一起。

光猫是什么?
光猫,也成为调制解调器。在有宽带之前,都是通过电话线进行上网的。电话线传输的是模拟信号,而网线传输的是数字信号,此时就要进行信号之间的转换。那么光猫的作用就是进行信号的转换。
关于IP地址,哪些位是网络号,哪些位是主机号,都是可以进行配置的。

此时,有一个属性叫做,"子网掩码",子网掩码也是一个32位的整数,左半部分都是1,右半部分都是0,不会出现01交错的情况。1的部分就表示了哪些bit位是网络号。家用网络中,一般都是255.255.255.0,也可以简写做 192.168.100.98 / 24 ,这个24 就表示有24位的网络位
Ⅴ.特殊的IP地址
①.将IP地址中的主机地址全部设置为0,就称为网络号,代表这个局域网。例如,192.168.100.0,这个就是一个网络地址,局域网中,不能直接把主机号设置成0
②.将IP地址中的主机地址全部设置成1,就称为广播地址。用于给同一个链路中相互连接的所有主机发送数据包。例如,192.168.100.255,这个地址就是一个广播地址,往广播地址上发送数据包,就会被转发给局域网中的所有设备。这和手机投屏类似,当在手机上点击手机投屏之后,就会弹出一个下拉列表,里面就包含了所有能够投屏的设备,这个过程就是通过"广播地址"来实现的。手机和电视要在同一个局域网下,当点击之后,手机会往广播地址发送一个请求,表示"那个设备能够进行投屏"
③.127.* 的IP地址用于本机环回测试,通常是127.0.0.1。无论本机真实的IP是多少,都可以写作127.0.0.1作为代表
④.[习惯用法] 主机号为1的IP,在IP协议中只是普通IP,在实际组网中,通常使用这个IP作为网关IP。网关,就是网络的入口/出口。在家庭网络中,网关一般就是路由器,在大型企业中,网关通常是单独的物理设备。例如,192.168.100.1,这个就是网关地址
(二).路由选择
在传输数据的过程中,通过IP协议,进行数据转发。这个转发过程,是极其复杂的,在这里,只讨论简化的模型。数据转发的过程,可以简单地理解为问路的方式,启发式/探索式转发
任何一个路由器都无法存储所有的网络信息,但是每个路哟求,是可以知道附近的网络情况(至少知道他和谁相连)。当数据到达某个路由器的时候,就会匹配这个路由器的"路由表 ",路由表就记录了这个路由器周围的设备的IP是什么,以及会记录每个设备要通过哪个口转发过去 。此时就会出现两种情况,情况1:目的IP刚好匹配到了路由表中的记录,那么直接按照当前的对应的IP转发过去就行了;情况2:如果没有匹配到,路由表会有一个特殊的表项**"下一跳"**指向的设备,即 上一级路由器所在的位置

只要没有匹配到路由表,则就会一直往上跳。越往上的路由器,涵盖的范围就越大

上图就是一个路由表