网络层主管地址管理与路由选择。而IP协议就是网络层中一个非常重要的协议。
它的作用就是在复杂的网络环境中确定一个合适的路径。
IP协议头格式
![](https://i-blog.csdnimg.cn/blog_migrate/7b65ec1f8e2c74996e0af9f5ced6b963.png)
4位版本号(version)
指定IP协议的版本,目前只有两个版本:IP v4和IP v6.对于IP v4来说,这个值就是4.
4位首部长度(header length)
IP头部的长度是多少个32bit,也就是说length*4个字节数,4bit表示的最大数值是15,所以IP头部的最大长度是15*4=60字节。
8位服务类型(Type Of Service)
3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须设置为0)。
4位TOS字段分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能从中选取一个。相当于是根据需求切换形态,同一时刻只能取其中一种形态。
对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
16位总长度(total length)
IP数据报整体占了多少字节。(单个IP数据报最大长度不超过64k)
16位标识(id)
唯一标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
![](https://i-blog.csdnimg.cn/blog_migrate/fa3e9d2c0248c41bcdaa74572028c46e.png)
如果整个IP数据报太长了,IP协议就会把这个大包拆分成多个小包,保证每个包都不超过64k。
拆分成多个包,但是只有一个TCP报头。对于IP数据报来说,根本不关心载荷中是什么东西,只是单纯的对数据进行了切分处理。
如何区分多个IP包是从同一个数据拆分出来的?
使用16位标识,多个被拆分出的IP数据报的16位标识的值是相同的。然后通过13位片偏移来描述这些小包谁先谁后。
3位标志字段
第一位保留(保留的意思是现在暂时不用,但是说不定之后会用到)
第二位为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示“更多分片”,如果分片了的话,最后一个分片置为1,其他是0.类似于一个结束标志。
13位分片偏移
是分片相对于原始IP报文开始处的偏移,其实就是表示当前分片在原报文中处在哪个位置。如果出现先发的包后到的情况, 也能确定目前包在原报文中的位置, 保证组包后数据的顺序不被打乱。
实际偏移的字节数是这个值*8得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
8位生存空间
数据报到达目的地的最大报文跳数。一般是64。表示一个IP数据报还能在网络上存在多久,单位不是时间,而是转发次数。IP数据报被发送的时候,会有一个初识的TTL(常见的如128/64),IP数据报每经过了一个路由器,TTL就会-1.如果TTL减到了0还没到达,此时收到这个包的路由器就会把这个包抛弃。
这个字段主要用来防止出现路由循环(正常的IP数据报都会在既定的TTL内到达)。
8位协议
表示上层协议的类型(TCP/UDP)。
16位首部检验和
使用CRC进行校验,来鉴别头部是否损坏。只鉴别IP头部是否损坏,剩下的载荷有自己的检验和部分。
32位源IP地址和32位目的IP地址
表示发送端和接收端。
源IP表示发送人地址,目的IP表示收件人地址。
对于IP v4来说,一个IP地址本质上是32位的整数,通常会使用“点分十进制”,这样的方式来表示IP地址。点分十进制的三个点将32位整数分为4个部分,每个部分1个字节,每个部分的取值就是0~255。
给每一个设备都分配一个IP地址这个问题如何解决?
1.动态分配IP地址
让每个设备连上网的时候才有IP,不联网时就没有IP(这个IP可以给别人用啦!)
不能从根本上解决这个问题(设备未减少,IP地址未增加),治标不治本。
2.NAT机制
存在极限,端口号的极限个数为65535
让多个设备共有同一个外网IP。
NAT机制把网络分为了内网(局域网)和外网(广域网)。
要求外网IP必须表示唯一的设备,同时内网中的若干设备可以共用同一个外网IP。
结论:
对于一个外网IP,可以在互联网的任意位置都能访问到。
对于一个内网IP,只能在当前局域网内部访问到。局域网1的设备不能使用内网IP访问局域网2的设备。
内网IP可以重复出现,只有在当前局域网内才是唯一的。
若两个链接的IP地址来自于“同一个局域网”(源IP地址相同),此时要分别看他们的端口号。
NAT不光会对IP调整成外网IP,同时也会对端口进行调整,如果端口不一样就算了,如果一样,就会调整成不同的端口。同时NAT会记录这个映射关系,保证服务器返回的数据,再按照这个映射关系给还原回去。
3.IP v6
从根本解决了问题!!!
IP v6在报头中使用了一个更长的字段来表示IP地址。
IP v6:16个字节,128位。2^128.
IP v4:4个字节,32位。2^32.
真正从根本上解决了IP地址不够用的问题。
![](https://i-blog.csdnimg.cn/blog_migrate/75ecc0ef1404021445f55f8f565f5fb5.png)
IP v6和IP v4是不兼容的。对于一个设备要支持IP v4和IP v6是两个截然不同的机制。
推荐视频:https://www.bilibili.com/video/BV1i14y157YV/?spm_id_from=333.880.my_history.page.click