IP网络协议

目录

1.引言

2.IPv4

[2.1 IP地址和子网掩码](#2.1 IP地址和子网掩码)

[2.2 IP首部字段](#2.2 IP首部字段)

3.ARP地址解析协议

4.路由器的路由原理

5.网络层转发数据包的过程

6.IP地址和MAC地址

7.结语


1.引言

IP协议(Internet Protocol),网络层协议,它的核心使命是尽最大努力将数据包从源主机准确的送到目的主机。它和应用层的HTTP协议一样,都是无连接的,也就是说在发送IP数据报前,不需要建立连接。除此之外,IP协议是不可靠的。它不保证IP数据报的按序到达和完整性,而是选择把这些脏活累活交给传输层的TCP来完成,美其名曰协议栈要协同工作,如果我IP协议都把活干完了,你TCP的KPI怎么办,年终奖还要不要了?为了将数据包准确的发送到目的主机,IP协议兢兢业业,先是定义IP地址,又是定义IP首部,还为数据包在网络上的传输立下汗马功劳......劳模实至名归了。

2.IPv4

IPv4和IPv6是IP协议的两大主流版本,现在属于IPv4,未来属于IPv6。IPv4面临IP地址耗尽的问题,这是推动IPv6发展的最根本原因,不过目前仍然是IPv4主导。

2.1 IP地址和子网掩码

IP = 网络号 + 主机号

IP地址本质上是32为的二进制,但是为了让我们能够更方便的进行读和写,每隔8为二进制插入一个小数点,然后用十进制表示,这就是点分十进制表示法,例如192.168.37.128。

但是仅仅写成192.168.37.128这种格式,我们是分辨不出来它的网络号和主机号的,于是在书写时,还要在后面标注网络号的位数,例如192.168.37.128/24。24表示网络号的位数为24位,所以我们很容易看出网络号为192.168.37.0,主机号为128。

我们人的读写和识别是没问题了,但是机器它看不懂斜杠是什么意思啊。于是就引入了子网掩码,它的作用就是为了让机器(比如路由器)能够识别出IP地址的网络号。斜杠后面是n,那么32位子网掩码中的前n位就为1,剩下的32 - n位为0。

以上面的IP地址为例,斜杠后是24,表示子网掩码中的前24位为1,后8位为0。

将IP地址:192.168.37.128转成二进制表示后得到:

IP地址: 11000000.10101000.00100101.10000000

子网掩码:11111111.11111111.11111111.00000000

进行AND运算,就可以快速得到该IP地址的网络号,如果两个IP地址的网络号相同,那么这两个IP地址标识的主机在同一局域网上

几个特殊的IP地址:

  1. 0.0.0.0:任意网络的任意主机。
  2. 127.0.0.1:本地回环地址。
  3. 广播地址:网络号不变,主机位全部置1。例如192.168.37.128/24的广播地址为192.168.37.255。

2.2 IP首部字段

  1. 版本:占4位,通讯双方使用的版本必须一致。
  2. 首部长度:占4位,可以表示的最大十进制数是15,但是它的单位是4字节。也就是说首部的最大长度为15 * 4 = 60字节,又因为IP数据报首部固定20字节,所以IP数据报的长度在[20, 60](闭区间)。当IP数据报的长度不是4的整数倍时,就必须利用填充字段来填充,使它正好是4的整数倍。
  3. 区分服务:这个字段很少会用到,这里忽略了。
  4. 总长度:总长度 = 首部长度 + 数据长度。占16位,那么最大可以表示2^16 - 1 = 65535字节,但是IP数据报通常不会那么长。因为在网络层的下面,即数据链路层,它规定了数据帧中的数据字段最大长度------最大传输单元MTU。最常用的以太网中,MTU的值是1500字节。如果IP数据报的长度过长,超过了MTU,那么网络层会进行分片,然后再向下交付给数据链路层。
  5. 标识:占16位,本质上是一个计数器。每产生一个数据报,计数器就加1,然后将这个值赋给IP数据报的标识字段。如果IP数据报的长度超过了MTU,需要分片,那么这个标识将被复制到这些分片数据报的标识字段,接收方根据标识字段就可以知道哪些IP数据报是一组的,然后就可以进行组装。
  6. 标志:占3位,最低位MF如果等于1,说明后面还有分片数据报;如果MF等于0,说明这个数据报是最后一个分片数据报。中间位DF(Don't Fragment),意思是不能分片,只有当DF等于0时才可以分片。
  7. 片偏移:占13位。标识的是,分片IP数据报在原数据报中的相对位置,以原数据报的数据字段的起点作为基准。这样,接收方在接收到分片数据报时,通过上面的标识字段可以知道哪些数据报是一组的,通过片偏移字段,可以知道这些分片数据报在原来数据报中的相对位置,然后才可以按顺序拼接。
  8. 生存时间:占8位,英文表示为TTL(Time To Live),标识的是数据报在网络中的寿命,防止数据报在网络中无限兜圈子。它的意思是数据报在网络中最多可以经过多少个路由器。路由器在对报文进行转发前,会先将它的TTL减1,如果减1之后发现为0,那么将会把这个报文丢弃,不为0才会进行转发。这个字段标识的实际上是跳数,但是它的名字却跟时间有关,那是因为之前采用的是时间限制,不是跳数限制。
  9. 协议:占8位,表明这个数据报携带的数据是使用哪种类型的,TCP还是UDP,以便于让目的主机的网络层知道要将这个报文交给哪个协议进行处理。
  10. 首部检验和:占16位,只检查数据报的首部,不包括数据部分。数据包每经过一个路由器,都要重新计算首部校验和,不检验数据部分可以减少计算量。如果校验失败,那么路由器将会丢弃这个数据报。
  11. 源地址:发送方的IP地址,标识这个数据报从哪来。
  12. 目的地址:接收方的IP地址,标识这个数据报要到哪去。

3.ARP地址解析协议

ARP地址解析协议的作用是通过IP地址找到它对应的MAC地址,因为在同一个局域网内,是靠MAC地址来进行数据报转发的。

这里解释一下MAC地址是什么,MAC地址就是硬件地址或者物理地址,每一个独立的网络接口都有它自己的MAC地址。

ARP地址解析协议的工作原理:

每一台主机都有一个ARP高速缓存,里面保存的是本局域网内各个主机和路由器的IP地址到MAC地址的映射表。当IP层的数据报向下交付给数据链路层后,数据链路层需要将这个数据报封装成MAC帧,其中MAC帧的头部是下一跳的MAC地址,这个MAC地址是在网络传输的过程中是不断变化的,因为下一跳主机不同,自然MAC地址也不同。

于是,主机向所在的局域网进行广播发送ARP请求,内容是:"我的IP地址是209.0.0.5,MAC地址是 00-00-C0-15-AD-18。我想知道IP地址为209.0.0.6的主机的MAC地址。"

同一个局域网内的所有主机都会收到这个ARP请求,如果IP地址与ARP所请求的IP地址不一致,那么将忽略这个请求,置之不理。如果IP地址与ARP所请求的IP地址一致,那么该主机将会收下这个ARP请求,并进行响应,将自己的MAC地址告诉请求方。在未来,也许主机B也会给主机A发送消息,也需要直到主机A的MAC地址,为了将来需要的时候省事,主机B除了给A进行响应外,还将主机A的IP地址和MAC地址的映射保存到自己的ARP高速缓存中。

发起ARP请求时,是广播,发送给局域网内的所有主机,但是在进行响应时,是单播,点对点通信,直接发送给对应主机。还需注意的一点是,ARP的工作范围是在同一个局域网内,如果一台主机在N1局域网内,另一台主机在N2局域网内,即使其中任意一台主机发起ARP请求,也不会得到响应,因为ARP地址解析协议不能跨局域网。

4.路由器的路由原理

在路由器内部,维护了一张很重要的表------路由表,它决定了数据包下一跳该去哪。路由表中的条目要么是人为写进去,要么是路由器和相邻路由器之间频繁交换信息形成的。

下面讲原理:

路由器收到MAC帧以后,会先检查帧尾部的**FCS(循环冗余校验)。**如果校验错误,则直接丢弃这个MAC帧;如果校验正确,路由器的数据链路层将会剥离MAC帧的头部和尾部,剥离后得到的就是一个IP数据报,然后将这个数据报交付给上层的网路层处理。

在网络层,路由器也会做一些基础的校验,比如IP数据报的首部校验,如果校验失败,那么将直接丢弃这个数据报。校验成功后,路由器会提取出目的IP,看看这个数据报它到底是要发给谁。然后遍历路由表,每遍历一行,就通过这一行的子网掩码和目的IP进行按位与运算,得到目的IP的网络号。如果计算出来的网络号正好和遍历到的路由表条目中的目的网络地址一致,而且匹配的长度是最长的,那么就将这个数据报发送到这个条目对应的下一跳地址上。

举个例子:

|----------------|------------|
| 目的网络前缀 | 下一跳 |
| 128.1.2.0/24 | R1路由器的IP地址 |
| 128.1.2.128/26 | R2路由器的IP地址 |

目的 IP 是128.1.2.132。

第一个条目,128.1.2.0/24,对应的子网掩码为255.255.255.0(通过网络号的位数得知),按位与上目的IP,得到128.1.2.0,匹配。

第二个条目:128.1.2.128/26,对应的子网掩码为255.255.255.192,按位与上目的IP,得到128.1.2.128,也匹配。

这时候,因为 26 位前缀比 24 位更长,匹配更精确,所以数据包的下一跳是R2路由器。

找到了下一跳IP地址后,就准备进行转发。

路由器将IP数据报的TTL减1,然后重新计算IP的首部校验和,完成后交付给下层的数据链路层。

这时候,路由器会查看自己的ARP高速缓存,看看是否存在R2路由器的IP地址到R2路由器MAC地址的映射关系,如果没有,那么将发起ARP请求拿到下一跳的MAC地址,重新封装IP数据报,将下一跳的MAC地址填入MAC帧的首部。

最后,路由器将这个MAC帧进行转发。

5.网络层转发数据包的过程

上图中,三个局域网通过2台路由器连接起来。现在的任务是,源主机H1(128.1.2.193/26)要将报文发送到目的主机H2(128.1.2.132/26)上。

我们直接从IP层(也就是网络层)开始,IP层添加完首部后,将封装好的IP数据报向下交付给数据链路层。然后,数据链路层将数据报封装成MAC帧,在MAC帧的首部填入MAC地址。最后将MAC帧交付给下层,因为源主机H1和目的主机H2不在同一局域网内,不能直接交付,所以只能发送给路由器R1进行转发。路由器R1收到数据包后,查找自己的路由表,发现自己和目的主机H2在一个局域网内,可以通过MAC地址直接交付。

6.IP地址和MAC地址

IP地址和MAC地址的协同,总的来说,在局域网内看MAC地址,出了局域网看IP地址。

MAC地址负责的是点到点的数据传输,决定数据包在本局域网内,要交给谁。IP地址负责端到端的路径规划,决定数据包从源主机到目的主机的大方向。

即然网络链路上的MAC帧最终是通过MAC地址找到目的主机的,为什么还使用两套地址(IP地址和MAC地址)?

  1. TCP/IP协议栈分层解耦,每一层只需要完成自己的功能。网络层需要解决跨网段通信的问题,所以它需要和数据链路层无关的IP地址,来支持路由协议动态规划路径。数据链路层需要解决在同一链路内的物理寻址问题,所以需要与硬件绑定的MAC地址,来适配不同的链路类型。
  2. 路由器无法基于MAC地址来转发数据包,如果要基于MAC地址来转发数据包的话,需要存储全球所有主机的MAC地址,这不现实。
  3. IP地址也无法替代MAC地址,因为数据在物理链路上传输时,网卡只认得MAC地址。

7.结语

IP协议还是很庞大的,先到这吧!


相关推荐
军哥系统集成号9 小时前
2026网络安全法修订落地:企业六类法定强制评估合规指南(附协同实施路径)
网络·安全·web安全
RisunJan9 小时前
Linux命令-ipcrm命令(删除Linux系统中的进程间通信(IPC)资源)
linux·运维·服务器
还在忙碌的吴小二9 小时前
XXL-RPC 框架使用手册
网络·网络协议·rpc
老兵发新帖9 小时前
ubuntu服务器配置私钥登录
linux·服务器·ubuntu
vortex59 小时前
Linux 用户组查询命令详解
linux·运维·服务器
九成宫9 小时前
计算机网络期末复习——第3章:运输层 Part One
网络·笔记·计算机网络·软件工程
触想工业平板电脑一体机9 小时前
【触想智能】工业触控一体机在船舶海运设备上应用的特点和具体场景分析
android·网络·计算机外设·电脑·智能电视
nvd119 小时前
Cookie 技术深度剖析与实战指南
网络
christine-rr9 小时前
linux常用命令(9)——查看系统与硬件信息
linux·运维·服务器·网络·后端