目录
1.IP协议报头结构
2.IP地址相关
注意:此处我们以IPV4为示例
4位版本号:指定IP协议的版本,对于IPv4来说,就是4。
4位头部长度:IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。
8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。 这四者相互冲突,只能选择一个。(这个可以理解成选择一个作为IP协议的特点,类似一些角色的变换形态)
16位总长度:IP数据报整体占多少个字节。
16位标识:唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每 一个片里面的这个id都是相同的。(用于拆包合包时的身份标识,同一个包的标识是一致的)
3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。 第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位 表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
(有关MTU我们会在下文讲解)
13位分片偏移:是分片相对于原始IP报文开始处的偏移。其实就是 在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此, 除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了,这个偏移量越小代表这个包的顺序越前)。
8位生存时间:数据报到达目的地的最大报文跳数。一般是64或者128。每次经过一个路由,TTL就会减一,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
8位协议:表示上层协议的类型。
16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏(报文部分的完整性校验已经由传输层协议校验过了,所以不需要再次校验)。
32位源地址和32位目标地址:表示发送端和接收端。
选项字段(不定长,最多40字节):
注意:此处我们以IPV4为示例
IP地址本质上是一个32位的整数,但由于不方便看,所以我们用三个点将IP地址分成了四个部分(每部分8位,1个字节),每个部分取值0~255。
通过上面的了解,我们可以知道IP地址最大值在2^32-1(大约42亿9千万),而IP地址最初设计时是希望每个主机一个IP,不会重复,但是在互联网飞速发展的今天很明显这是做不到的。
假如一个设备不上网就不分配IP地址,只有上网才会分配对于IP地址。这个做法能够缓解IP地址不够用的问题,但还是治标不治本。
我们的IP地址是被分为两个大类的
1.内网IP(局域网内使用的)
2.外网IP(广域网中使用的IP)
而我们的内网IP有三类:
(1)10.*
(2)172.16.*/172.31.*
(3)192.168.*
除此之外都是外网IP
我们是允许局域网内的内网IP重复的,但是外网IP要保持唯一。所以我们就有了NAT技术。
NAT能够将私有IP对外通信时转为全局IP,也能在返回数据时将全局IP转为私有IP。也就是就是一种将私有IP和全局IP相互转化的技术方法
如上图所示,以 10.0.0.10 的主机(客户端A)与 163.221.120.9 的主机(服务器)进行通信为例讲解 NAT 的工作机制。利用 NAT,途中的 NAT 路由器将发送源地址从 10.0.0.10 转换为全局的 IP 地址(202.244.174.37)再发送数据。反之,当响应数据从 163.221.120.9 发送过来时,目标地址(202.244.174.37)先被转换成私有 IP 地址 10.0.0.10 以后再被转发。
注意:
1.NAT的机制本质就是用一个外网IP代表一大批内网设备
2.NAT 路由器为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来
那我们现在有一个问题,NAT在面对私有网络内的多台机器都要与外部进行通信时,仅仅靠转换 IP 地址的话就受限于是否有足够的全局 IP 地址可供使用 ?
答案是不能的。但是我们可以通过端口复用 NAPT 技术可以解决这个问题。
NAT 有 3 中类型:静态NAT,动态NAT,端口复用NAPT
1. 静态NAT
内部本地地址一对一转换成内部全局地址,相当内部本地的每一台PC都绑定了一个全局地址。一般用于在内网中对外提供服务的服务器2. 动态NAT
在内部本地地址转换的时候,在地址池中选择一个空闲的,没有正在被使用的地址,来进行转换,一般选择的是在地址池定义中排在前面的地址,当数据传输或者访问完成时就会放回地址池中,以供内部本地的其他主机使用,但是,如果这个地址正在被使用的时候,是不能被另外的主机拿来进行地址转换的3. 端口复用NAPT
面对私网内部数量庞大的主机,如果NAT只进行IP地址的简单替换,就会产生一个问题:当有多个内部主机去访问同一个服务器时,从返回的信息不足以区分响应应该转发到哪个内部主机。此时,需要 NAT 设备根据传输层信息或其他上层协议去区分不同的会话,并且可能要对上层协议的标识进行转换,比如 TCP 或 UDP 端口号。这样 NAT 网关就可以将不同的内部连接访问映射到同一公网IP的不同传输层端口,通过这种方式实现公网IP的复用和解用。这种方式也被称为端口转换PAT、NAPT或IP伪装,但更多时候直接被称为NAT,因为它是最典型的一种应用模式。
如下图所示,以私网 10.0.0.10 和 10.0.0.11 的主机与外网 163.221.120.9 的主机进行通信为例讲解 NAPT 的工作机制
主机 163.221.120.9 的端口号是 80,私网中有 2 个客户端 10.0.0.10 和 10.0.0.11 同时进行通信,并且这 2 个客户端的本地端口都是 1025。此时,仅仅转换 IP 地址为全局地址 202.244.174.37 ,会令转换后的数字完全一致。因此,为了区分这 2 个会话,只要将 10.0.0.11 的端口号转换为 1026 就可以解决问题。NAPT 路由器通过生成转换表,就可以正确地转换地址跟端口的组合,使客户端A、B能同时与服务器之间进行通信。
解决IP地址数量不足的问题最直接的方式就是解决问题的根源,我们可以使用IPV6解决IP地址不够的问题。因为IPV6是使用16字节(128)位来表示IP地址的,比IPV4要大了2^96倍,从根源解决问题。
IP地址分为两个部分,网络号和主机号
网络号:标识网段,保证相互连接的两个网段具有不同的标识;
主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;
通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的IP地址都是唯一的。
分类
过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类,如下图所示
不同类IP地址本质上是适应不同类型的网络,比如A类网络数量少,但是主机最大连接数多,使用适用于大型网络。但是由于这种方法存在较多问题,现在已经被CIDR这种划分方式取代了。
前面我们提到现在主流的网络划分方式已经变成了CIDR,而CIDR在划分时就会利用到我们的子网掩码(但是这里不具体讲CIDR,大家可以自行去了解)。CIDR会通过子网掩码来区分哪部分是网络号哪部分是主机号。
子网掩码也是32位整数,类似于IP地址,为了方便被划分成了四个部分。但是他的左边一定是1,右边一定是0(0和1长度不确定)。比如255.255.255.0(这里的1指的是二进制的1,现在已经被转化成八进制数了表示了)。
而被标记为1的部分就表明这部分IP是网络号,0则是端口号(相当于用子网掩码和IP地址做了一次按位与操作(&))。
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所 有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输), 对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通 信。
这个知识点其实不常考,所以我们作为常识简单了解即可。
所谓路由选择就类似于地图寻路差不多。就是对从A发送到B的数据进行路线规划。但是由于这个网络一般很庞大而路由器没有那么多存储空间来保存地址信息,所以每个路由器只能知道他相邻或者相邻的相邻设备的线路怎么走。
那最后怎么让数据正确送达呢?其实就是最原始的方式:问路。经历一系列的问路最终就会逐渐到达目的地。每次问路就相当于一次“路由转发”,每个路由器中记住的位置称为“路由表”,每次“问路”的目的地称为“目的IP”。
路由器会根据目的IP在路由表中匹配,如果匹配到了我们就继续前进,匹配不到就会朝默认方向(路由表中存在一个默认选项)
由于这里我们只是简单了解。所以很多背后的原理我们并没有讲,感兴趣的话可以自行上网学习