IP层(网络层)相关协议
前言
这周大概也就这一篇文章吧,已经月底了,什么时候才能找到实习呀(悲)!
网络层
网络层在TCP/IP协议中的位于第三层。在TCP/IP协议中网络层可以进行网络连接的建立和终止以及IP地址的寻找等功能,因为在网络层中IP协议是最重要的协议,所以我们一般又把网络层叫做”IP层”,当然了,网络层除了IP协议,自然也有其他协议,例如ICMP协议,ARP协议,RARP协议等等,这里就主要讲一下IP协议、ICMP协议和ARP协议吧
IP地址
在去了解IP协议之前,我们得先需要知道什么是IP地址
IP地址是指互联网协议地址,又称为网络协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址(不是真实的),以此来屏蔽物理地址(MAC地址)的差异
IPv4地址是一个32位的二进制数(4个字节),通常被分割为4个8位二进制数,IP 地址在计算机是以二进制的方式处理的
而人类为了方便记忆采用了点分十进制的标记方式,也就是将32位IP地址以每8位为组,共分为4组,每组以「.」隔开,再将每组转换成十进制
所以,IP地址最多有2^32=4294967296,大约是43亿,也就是说可以有43亿台计算机联入互联网中
但实际上,IP地址并不是根据主机数来分配的,而是根据网卡来分配的,而一个网卡其实可以分配多个IP地址,而一台路由器或者服务器往往有着2个以上的网卡,也就是说他们一般有2个以上的IP地址
IP地址分类
一开始,IP地址还是很富足的,所以科学家们根据网络号+主机号对IP地址进行了一个分类
分别为A类,B类,C类,D类,E类
它们每个类对应的IP地址范围
如何计算最大主机数
想要计算最大主机数,我们必须知道,IP地址被分成网络号+主机号,所以,要根据IP地址分类来计算,例如
B类地址,在B类地址中我们知道,网络号为前16个字节,最前面两个字节必须为10,所以剩下16位就是主机号,所以理论上来说,B类地址最多可以有2^16,但实际上我们还需要减2,所以实际上就只有(2^16-2)个主机
为什么要减2呢?
这是因为有两个特殊的IP地址,是不允许作为某一个主机的IP地址的,分别就是:主机号全为0和主机号全为1的两个IP地址,就拿B类地址来说,xxx.xxx.0.0和xxx.xxx.255.255就是这中特殊的地址
一般来说:
主机号全为1的IP地址一般是用于广播的IP地址,是指某个网络下的所有主机
主机号全为0的IP地址用来指定某个网络
所以再给某一网络的主机分配IP地址的时候,这两个特殊地址是不会分配的
广播地址的作用
广播地址用于在同一个链路中相互连接的主机之间发送数据包
广播地址分为本地广播和直接广播
- 本地广播: 在本网络内广播的叫做本地广播。例如网络地址为 192.168.0.0/24 的情况下,广播地址是 192.168.0.255 。因为这个广播地址的 IP 包会被路由器屏蔽,所以不会到达 192.168.0.0/24 以外的其他链路上
- 直接广播: 在不同网络之间的广播叫做直接广播。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包。收到这个包的路由器,将数据转发给192.168.1.0/24,从而使得所有 192.168.1.1~192.168.1.254 的主机都能收到这个包(
由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发
)
什么是D、E类地址
因为D、E类地址是没有主机号的,所以不可用于当作主机的IP地址
D类地址一般用于多播
E类地址是预留的分类,暂时没用
多播
多播和广播不同,多播用于将包发送给特定组内的所有主机,多播有时候也叫做组播
举个例子,当我们在上课的时候,老师喊“上课,起立”的时候,我们整个班级所有人都会起立,而这就是广播,是给全班所有人听的,当老师喊“第一排坐下”的时候,只有第一排坐下了,其他人还是站着的,而这就是多播,是给指定某一特定的人群听的
由于广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播(组播)
多播使用的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。
从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类
- 224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能在局域网中,路由器是不会进行转发的
- 224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于Internet上
- 239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效
这样分类有优点,也有缺点
优点
不管是路由器还是主机解析到一个 IP 地址时候,我们判断其 IP 地址的首位是否为 0,为0则为A类地址,那么就能很快的找出网络地址和主机地址,其他类同理,如果第一位为1,就判断第二位是否为0,是就为B类地址,以此类推
所以,这种分类地址的优点就是简单明了、选路(基于网络地址)简单
缺点
缺点一:
同一网络下没有地址层次,比如一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、开发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能,所以这就缺少地址的灵活性
缺点二:
这样分类与现实不匹配
C类地址最大容纳的主机也才254个,其实是很少了,一个稍微大点的网吧都不够
B类地址最大容纳的主机有2^16-2个,将近6万个,这就又太多了,6万多台机器放到一个网络下面,恐怕也就BAT这种大厂能做到了吧
在这种分类方法下,实际上是由公用IP地址和私用IP地址之分的
平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址和我学校的可以是一样的
就像每个小区都有自己的楼编号和门牌号,你小区家可以叫 1 栋 101 号,我小区家也可以叫 1 栋 101,没有任何问题。但一旦出了小区,就需要带上中山路 666 号(公网 IP 地址),是国家统一分配的,不能两个小区都叫中山路 666
所以,公有 IP 地址是有个组织统一分配的,假设你要开一个博客网站,那么你就需要去申请购买一个公有 IP,这样全世界的人才能访问。并且公有 IP 地址基本上要在整个互联网范围内保持唯一
CIDR无分类地址
为了解决IP地址分类的缺点,后面科学家们就提出了CIDR无分类地址这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号
而这要如何区分网络号和主机号呢?
科学家们是这样做的,将IP地址表示为(a.b.c.d/x),其中,x表示前x位为网络号,范围为0~32,这就使得IP地址更加灵活,例如下面
上图中的子网掩码也是用来划分网络号和主机号的另外一种方式,掩码的意思就是掩盖掉主机号,剩余的就是网络号
只要将子网掩码和IP地址相与一下,得到的结果就是网络号
知道了IP地址的分类方法,有没有想过科学家为什么要将IP地址分为网络号+主机号呢?
为什么要分网络号和主机号
因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机
路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内
在上面我们知道子网掩码可以划分网络号和主机号,但其实还可以用来划分子网,当然了,这就要用到IP地址中的地址分类了子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址
大概是这样
- 未做子网划分的 ip 地址:网络地址+主机地址
- 做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)
我们以C类地址为例,将C类地址进行子网划分,假设IP地址为192.168.1.0,子网掩码为255.255.255.192
C 类地址中前24位是网络号,最后8位是主机号,根据子网掩码可知从8位主机号中借用2位作为子网号
所以子网就有四个,分别为00,01,10,11
IP地址与路由控制
IP地址的网络地址这一部分是用于进行路由控制路由控制表中记录着网络地址与下一步应该发送至路由器的地址,在主机和路由器上都会有各自的路由器控制表
当我们发送IP数据包的时候,会先检查IP数据包中的首部中的目标地址,然后在路由控制表中查找该目标地址对应的下一跳的地址,也就是下一次IP数据包的转发应该给哪个路由器或者说是主机(我们在网络中发送数据的时候是不可能一次性直接到目标主机,而是需要数据包在网络中进行跳转)
主机 A 要发送一个IP包,其源地址是 10.1.1.30 和目标地址是 10.1.2.10,由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 的网络地址匹配的条目,于是把数据包转发到默认路由(路由器1)(一般为0.0.0.0)
路由器1收到IP包后,也在路由器1的路由表匹配与目标地址相同的网络地址记录,发现匹配到了,于是就把 IP 数据包转发到了 10.1.0.2 这台路由器2
路由器2收到后,同样对比自身的路由表,发现匹配到了,于是把IP包从路由器2的 10.1.2.1 这个接口出去,最终经过交换机把 IP 数据包转发到了目标主机
如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配
环回地址
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址
计算机使用一个特殊的IP地址127.0.0.1作为环回地址,与该地址具有相同意义的是一个叫做localhost的主机名
使用这个 IP 或主机名时,数据包不会流向网络
介绍完了IP地址,接下来看看IP协议吧
IP协议
IP协议是为计算机网络相互连接进行通信而设计地协议,在因特网上,它是能使连接到网上的所有计算机网络实现相互通信的一套规则
,规定了计算机在因特网上进行通信时应当遵守的规则。
IP协议实际上是一套由软件程序组成的协议软件,它把各种不同的帧(不同的厂家生产的网络系统和设备所传输的数据的基本单位的不同)统一转化位IP数据报格式,这种转换时因特网的一个最重要的特点,使得所有各种机器都能在因特网上相互通信,即具有”开放性”的特点。因此,IP协议也可以叫做因特网协议
IP首部
首部详解
IP数据包首部固定长度为20字节,不包括可变长度(最大40字节)
- 版本号: 4位,用于标识IP协议版本,IPv4是0100,IPv6是0110,也就是二进制下的4和6
- 首部长度: 4位,用于标识首部的长度,单位为4字节,所以首部长度最大值为:(2^4 - 1) * 4 = 60字节,但一般只推荐使用20字节的固定长度,类似于TCP协议头部的首部长度字段
- 区分服务: 8位,用于标识IP包的优先级,但现在并未使用
- 总长度: 标识IP数据报(包含数据)的总长度,最大为:2^16 -1 = 65535字节
- 标识: 16位,用于标识IP数据报,如果因为数据链路层帧数据段长度限制(也就是MTU,支持的最大传输单元),IP数据报需要进行分片发送,则每个分片的IP数据报标识都是一致的
- 标志: 3位,但目前只有2位有意义,最低位为MF,MF=1代表后面还有分片的数据报,MF=0代表当前数据报已是最后的数据报;次低位为DF,DF=1代表不能分片,DF=0代表可以分片
- 片位移: 13位,代表某个分片在原始数据中的相对位置
- 生存时间: 8位,以前代表IP数据报最大的生存时间,现在标识IP数据报可以经过的路由器数
- 协议: 8位,代表上层传输层协议的类型,1代表ICMP,2代表IGMP,6代表TCP,17代表UDP
- 首部检验和: 16位,用于验证数据完整性,和TCP的检验和首部字段功能一样
- 源IP地址: 32位,代表数据包是从哪个IP地址对应的主机上发出的
- 目的IP地址: 32位,代表该数据包最后应该到哪个IP地址对应的主机上
其实IP协议我感觉没什么好讲的,最主要的是一些与IP协议相关的重要且常见的技术
IP协议相关的技术
DNS
点击下面按钮观看哦,这个之前写过的
DNSARP
在传输一个IP数据报的时候,确定了源IP地址和目标IP地址后,就会通过主机路由表确定 IP 数据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道下一跳的MAC地址
由于主机的路由表中可以找到下一条的 IP 地址,所以可以通过ARP协议,求得下一跳的 MAC 地址
ARP如何知道对方的MAC地址?
ARP 是借助ARP 请求与ARP 响应两种类型的包确定 MAC 地址的
主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址
当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机
操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来(也就是保存在ARP缓存表中),以便下次直接从缓存中找到对应 IP 地址的 MAC 地址
不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除
RARP
和ARP刚好相反,它是已知 MAC 地址求 IP 地址,例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到
通常这需要架设一台RARP服务器,在这个服务器上注册设备的MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:
- 该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息
- RARP 服务器接到这个消息后返回「MAC地址为 XXXX 的设备,IP地址为 XXXX」的信息给这个设备
最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址
DHCP
我们的电脑通常都是通过DHCP动态获取IP地址,大大省去了配 IP 信息繁琐的过程
我们来看看一台新的电脑练到互联网上的时候要如何知道自己的IP地址先说明一点,DHCP 客户端进程监听的是 68 端口号,DHCP 服务端进程监听的是 67 端口号
过程:
- 客户端首先发起DHCP发现报文(DHCP DISCOVER)的IP数据报,由于客户端没有IP地址,也不知道DHCP服务器的地址,所以使用的是UDP广播通信,其使用的广播目的地址是255.255.255.255(端口 67) 并且使用 **0.0.0.0(端口 68)**作为源 IP 地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备
- 互联网上所有的DHCP服务器都会收到这个报文,用DHCP提供报文(DHCP OFFER)向客户端做出响应。该报文仍然使用IP广播地址255.255.255.255(目的IP地址),源IP地址就是自己的IP地址,该报文信息携带服务器提供可租约的IP地址、子网掩码、默认网关、DNS服务器以及IP地址租用期,注意,每个DHCP都会发送一个报文
- 客户端收到一个或多个服务器的DHCP提供报文后,从中选择一个服务器,并向选中的服务器发送**DHCP请求报文(DHCP REQUEST)**进行响应,回显配置的参数
- 最后,服务端用DHCP ACK报文对 DHCP 请求报文进行响应,应答所要求的参数
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址
如果租约的DHCP IP地址快过期后,客户端会向服务器发送 DHCP 请求报文:
服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延长租期
服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就要停止使用租约的 IP 地址
整个过程中,都是使用UDP广播通信
DHCP中继代理
因为路由器不会转发广播报文,所以UDP广播报文不会被不同网络下的DHCP接收到,而为了解决这个问题,DHCP中继代理就出现了
有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一进行管理- DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器
- 服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包转发给 DHCP 客户端
因此,DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址
ICMP
因为IP协议并不是一个可靠的协议,它不保证数据能够被送达,虽然IP头部有检验和的字段,但这只能保证数据不被更改,但不能保证数据不会再传输过程中丢失,所以,保证数据送达的工作应该由其他模块来实现,其中一个重要的模块就是TCMP协议(互联网控制报文协议)
ICMP头部
ICMP 报文是封装在 IP 包里面
其中类型有以下几种
ICMP协议功能
ICMP 主要的功能包括:确认IP包是否成功送达目标地址、报告发送过程中IP包被废弃的原因和改善网络设置等
在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知
如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功
ICMP 的这种通知消息会使用 IP 进行发送
因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因
ICMP类型
TCMP报文大致分为两类:查询报文和差错报文
查询报文的用途:
- ping查询
- 子网掩码查询
- 时间戳查询
差错报文的用途:在数据传送过程发生错误时会产生差错报文
查询报文的类型
- 0和8:回送消息,回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,ping 命令就是利用这个消息实现的可以向对端主机发送**回送请求**的消息(ICMP Echo Request Message,类型 8),也可以接收对端主机发回来的**回送应答**消息(ICMP Echo Reply Message,类型 0)相比原生的 ICMP,这里多了两个字段:
- 标识符:用以区分是哪个应用程序发 ICMP 包,比如用进程 PID 作为标识符
- 序号:序列号从 0 开始,每发送一次新的回送请求就会加 1, 可以用来确认网络包是否有丢失
在选项数据中,ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短
TCMP的应用之一—ping
举个例子来看看ping是如何工作的吧
同个子网下的主机 A 和 主机 B,主机 A 执行ping 主机 B 后
ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包,其中ICMP数据包内包含多个字段,最重要的两个为:
第一个是类型,对于回送请求消息而言该字段为 8
另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包
每发出一个请求数据包,序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间然后,由ICMP协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址,协议字段设置为 1 表示是 ICMP 协议,在加上一些其他控制信息,构建一个 IP 数据包
接下来就是在数据链路层加入MAC头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址是 IP 层传过来的目的IP地址对应的 MAC 地址,源地址则是本机的 MAC 地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去
主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。
接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0,序号为接收到的请求数据包中的序号,然后再发送出去给主机 A
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。
此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟
当然,在不同网段的传输还涉及了路由器之间的跳转,网关之间的转发,但是这对ICMP报文来讲没有任何影响,而这就是ping的整个过程
结语
最近一直在关于ChatGPT的视频,不得不感慨可能我要见证一个新的时代的发生了,有可能会被叫做第四次工业革命呢,不知道对我国的影响是如何的,AI真的很强,搞得我对AI也有兴趣了,历史的潮流中,我们只能做到不要淹死在里面,未来会怎么样,尽请期待吧
- 标题: IP层(网络层)相关协议
- 作者: 这题超纲了
- 创建于: 2023-03-29 13:14:30
- 更新于: 2023-06-23 14:47:35
- 链接: https://qx-gg.github.io/2023/03/29/blog15/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。