【网络层】之IP协议

网络层之IP协议

网络层的作用

IP协议是网络层的一种典型协议,只要弄清楚了IP协议的作用,那么网络层的作用也一目了然了。

  • IP协议的功能是:主机定位路由选择

它的功能的实现离不开IP地址,IP地址就是点分10进制的字符串,每一个十进制都对应8位二进制,实际上网络中IP地址是32位的整数,但是日常使用这么大的数不太方便,所以在主机端都转为字符串形式给用户,用户使用的也是点分十进制的字符串IP地址。

  • 主机定位 :指的是主机A可以通过对方主机的IP找到它,并把信息交付给它。一般都是客户端先访问服务器,服务器的IP地址都是固定的,晓为人知的。

  • 路由选择:指的是主机A->主机B上有很多路由器,它们如何知道应该将报文转发给哪个局域网,这是由目的IP地址决定的。

IP地址不足的问题

现在大部分国家使用的IP地址都是IPv4地址,我们下面介绍的也是IPv4地址的协议,它一共有32位,对应2^32(42亿)个IP地址,但是不是所有IP地址都是有用的,有一些要用于特殊用途(本地测试),全球那么多网民,IP早就不够了,所以我们需要使用其它的方法来解决这一问题。

这还不包括那些物联网设备,那些设备如果想联网也需要占用IP地址。

私网IP和公网IP

私网IP地址是指子网中的IP地址,私网IP地址专用于局域网(子网),而我们通常说的公网是指的互联网,这个大网是由全世界的大大小小的局域网组成的,如果某一个小的局域网想要接入公网中,它就必须有一个公网IP,公网IP和私网IP是分开的,A、B、C类地址中存在私有IP地址。

为什么要这么设计,大家都用公网IP不就行了吗,理想很丰满,现实很骨感,归根结底还是为了解决IP地址不足的问题。

  • 子网IP在不同的局域网中是可以重复的,通过外部的公网IP转发报文即可,这在一定程度上解决了IP地址不足的问题,但这样的效率是很慢的。
  • 但公网IP是绝对不能重复的,它一定是整个互联网中唯一的。

网段划分

传统的网段划分的方法

每一个IP地址=网络地址+主机地址。这个是什么意思我们介绍完下面的几类地址再谈:

A类地址

  • 地址范围 :A类地址的第一个八位字节(即前8位)表示网络部分,剩下的三个八位字节(即后24位)用于主机地址。因此,A类地址的范围是从0.0.0.0127.255.255.255,但实际可用的A类地址从1.0.0.0开始至126.255.255.255结束(127.x.x.x被保留用于回环测试)。
  • 默认子网掩码255.0.0.0/8
  • 特点:
    • 支持大量主机(每个A类网络理论上可以支持2^24−2个主机地址,大约1670万个),适合大型组织使用。
    • 只有少数的A类网络存在,因为它们消耗了大量的地址空间。

B类地址:

  • 地址范围 :B类地址的前两个八位字节表示网络部分,后两个八位字节用于主机地址。B类地址的范围是从128.0.0.0191.255.255.255
  • 默认子网掩码255.255.0.0/16
  • 特点:
    • 每个B类网络理论上可以支持2^16−2个主机地址,大约65534个,适合中型规模的网络。
    • 相比于A类地址,B类地址提供了更多的网络数量,但每个网络内的主机数相对较少。

C类地址

  • 地址范围 :C类地址的前三个八位字节(即前24位)用于表示网络部分,最后一个八位字节(后8位)用于主机地址。因此,C类地址的范围是从192.0.0.0223.255.255.255
  • 默认子网掩码255.255.255.0/24
  • 特点
    • 每个C类网络理论上可以支持2^8−2=254个主机地址,适用于小型网络。
    • 提供了大量的网络数量,但每个网络内的主机数相对较少。

D类地址

  • 地址范围 :D类地址的范围是从224.0.0.0239.255.255.255
  • 用途:D类地址主要用于多播(Multicast)。多播是一种允许一个发送者同时向多个接收者发送数据的技术,不同于单播(Unicast)和广播(Broadcast)。
  • 特点:
    • 不区分网络部分和主机部分,因为它们不用于一对一或一对所有的通信模式。
    • 常见的应用包括视频会议、在线直播等需要一对多传输的服务。

E类地址

  • 地址范围 :E类地址的范围是从240.0.0.0255.255.255.255
  • 用途 :E类地址被保留用于实验和研究,并未公开分配或广泛使用。实际上,这个范围内的很多地址都是不可用的,例如255.255.255.255通常用于本地网络的广播地址。
  • 特点:
    • 并不适合普通用户的使用,主要用于未来的扩展或者特殊的研究目的。

然而,随着网络的发展,这种网段划分的局限性很快就体现出来了,因为A类地址的网络号为8,所以A地址很快就被划分完了,但是一个A类地址所构建的子网里有2^24-2台主机,这么大的子网上肯定不存在的,所以就造成了很多IP地址的浪费。

而对于B类网络来说,它的网络号有2^16个,所以B类网络申请的人最多,所以就造成了B类地址严重不足。

CIDR网段划分

因为传统的将IP地址分为5类网段划分的局限性很快就体现出来了,IP地址很快就被用完了,所以急需一种新的方案来解决IP地址不足的问题,CIDR这一新的划分方法,就是为了解决这一问题提出的。

它的核心在于一下几个点:

  1. IP地址分成私网IP和公网IP,公网IP和私网IP是不能重复的。

    图\]-\>公网`IP`以及常见的私网`IP`。

    下图是子网掩码举例子:

路由器的角色

路由器主要负责,转发报文+路由选择

路由器还可以组织网络,它具有组网的作用,我们家用路由器,就可以组织网络,并给这个子网中的主机分配IP地址,分配IP地址现在通常都是DHCP算法,自动就给主机分配IP了,当然主机也可以选择手动自己配置IP地址。

理解运营商的角色

为什么我们每天在刷抖音、逛淘宝时,明明访问的是抖音、淘宝的服务,为什么却要把流量费交给运营商呢?

因为整个网络世界都是运营商精心设计的,没有它们我们就无法访问网络,就像高速公路要交过路费一样

在网络中每一个终端设备,我们将其称之为主机,主机不管是联WIFI还是使用流量访问某抖或者某淘的服务器,都避不开运营商路由器对报文的转发与路由,因为整个网络世界就是它们构建起来的。公网IP不能重复,但是内网中的IP地址是可以重复的。通过路由器可以将内网中的数据一层层的转发,直到转发到相应公网中的服务器。

我们都知道,我们服务器与客户端在进行通信时,首先客户端访问服务器,那客户端是的主机是处于一个局域网中,IP是一个私有地址,服务器应该如何返回报文呢?这一切的一切都得益于NAT技术的转换,NAT技术本篇博客不做介绍。

子网划分的过程

了解了CIDR网段划分,我们来介绍一下世界这个庞大的互联网是如何被精心设计出来的(只介绍大致轮廓,真实情况只有运营商才能知道):

  • 首先国家与国家之间,我们分配网络号为8位就够了,因为整个世界有独立主权的国家有197个,8位网络号一共可以有256个网络号,代表256个大的子网,每个子网都需要一个的路由器,来帮忙转发报文,因为不同子网间的主机想要,必须需要路由器进行转发,所以一个路由器必须有两个口,一个口接内网(LAN口),另一个口接外部网络。
  • 接下来以中国为例继续划分,中国有34个省,我们对于省与省间的局域网,分配6个网络号就行了。这些省与省之间也需要路由器来作为节点,组织一个省间的局域网,使用路由器是因为下面还需要组网。
  • 然后对于省下面的市,我们继续分配5个网络号,用于组织市之间的局域网,然后往下就不再划分公网IP了,而是使用内网的形式来组织网络,因为再继续划分IP地址就不足了。内网与公网之间使用NAT技术进行通信。

用图来表示就是这样:

假设此时我们有一个报文,要从浙江省A市的公网IP3.8.32.2/19的运营商所在的子网下的终端A发往公网IP3.16.64.3/19下的云服务器。大致过程如下:

  1. 首先报文会被交给家用路由器,家用路由器查路由表,通过目的IP&子网掩码求出网络号,再求出自己的网络号,发现目的IP所在的网络号并不属于该路由器的网络,于是默认路由,家用路由器将报文交给运营商路由器。
  2. 运营商路由器重复刚刚家用路由器的动作,该报文的目的IP也不属于运营商路由器所构建的子网中。
  3. 那它是否属于运营商路由器所在的公网子网中呢?将运营商路由器的公网IP&255.255.224.0得到该运营商路由器对应的网络号3.8.32.0,而目的IP3.16.64.3&255.255.224.0得到3.16.64.0显然两者并不相等,于是该运营商路由器继续默认路由,将报文交付给A市的路由器。
  4. A市的路由器在拿到报文后,将3.16.64.2&255.255.252.0,结果为3.16.0.0,而当前的子网的网络号为3.8.0.0所以该报文不在当前的子网中,继续默认路由,将报文交给省路由器。
  5. 省路由器所在的子网网络号为8位,将3.16.64.2&255.0.0.0得到3.0.0.0与当前子网的网络号相等,所以判断,该报文一定需要交付给某一个路由器,由于它们在一个局域网中,所以我们查找路由表,应该将报文交给山东省的省路由器。
  6. 山东省的省路由器在查路由表之后,发现该报文属于B市,于是继续将报文发往B市。
  7. B市的市路由器继续查路由表,最终找到该目的IP,并将报文交给该服务器。

至于报文如何返回,这就与我们的NAT技术有关了,今天这篇博客不会介绍。

路由表

路由表是由路由器维护的,但是通常每台主机的内核🀄️也维护的有一张路由表。因为路由表的存在我们才能不断的转发报文,因为路由表维护了这个局域网的所有主机IP地址信息,它还维护了上级路由表的信息,一般是默认路由中存储。

我们可以使用下面指令来查看主机中维护的路由表的信息:

  1. 对于Linux系统(Ubuntu)来说:

    c 复制代码
    route
    route -n #-n选项表示全部以数字形式显示

我们主要看route -n所显示的结果:

  • 标志位介绍:
    • U:表示该路由有效。
    • HHhost,中文意思是主机。表示该路由的目的地址是主机,而非一个网络。
    • G:表示该路由的目的地址是一个路由器。
  • Destination:这个表示此行路由条目的目的地址。
  • Gateway:此行路由条目的下一条地址。
  • Ref:Ref(Reference Count,引用计数)这一列显示的是特定路由被引用的次数。这个值通常表示有多少活动连接或进程正在使用这条路由。实际上该列已经使用的很少了,所以经常为0,可以理解为废弃了。
  • Metric:在路由表中,这一列所代表的值是一个度量值,用于路由选择。Metric值可以基于多种因素计算得出,如带宽、跳数(经过的路由器数量)、延迟等,具体取决于网络协议和配置。一般来讲,如果路由表中存在多条到达目的IP的路径,系统会选择Metric低的那条路径。
  • GenMask:子网掩码不过多介绍,通常通过它来判断我们要去的目的IP与该条路径的目的IP在不在同一个子网中。
  • Use Iface :在路由表中,Iface列表示的是"接口"(Interface),指的是将要使用的网络接口来发送对应目的地的数据包。这个字段指定了通过哪个网络接口(如eth0、wlan0等)去往指定的目的地。
  1. 对于windows系统,你可以使用如下指令:

    c 复制代码
    route print

    选项:

例如route -4

这里的跃点数理解为Linux内核路由表中的Ref即可。

转发过程例 1: 如果要发送的数据包的目的地址是192.168.244.3

  • 第一行是默认路由,我们先跳过,如果最终路由表中没有相应的目的网络所在的子网,我们就默认路由。

  • 与第二行目的网络的子网掩码相与,得到192.0.0.0,与第二行的目的网络地址不符。

  • 与第三行的目的网络的子网掩码相与得到192.168.244.3,与第三行的目的网络地址也不符。

  • 直到计算到第倒数第13行,目的网络地址为192.168.244.0/24

    与其在同一个网络,所以我们可以将报文从相应网络接口发送出去。

IP协议介绍

IP协议的格式如下,我们一一介绍:

  1. 4位版本 :标识你使用的IP协议是IPv4还是IPv6
  2. 4位首部长度 :和TCP协议中的手表长度一样也有基本单位,基本单位为四字节,存储IP报文报头的长度(包括选项)。
  3. 16位总长度 :存储整个IP报文的长度。
  4. 8位生存时间 :TTL的主要作用是限制数据包在网络中的存活时间或经过的路由器跳数,以防止数据包在网络中无限循环。因为路由器在网络中是可能出现bug的,因为它的工作离不开软件的支持,我们只能容忍bug,而不能消灭bug,因为这个项目足够大,肯定会出现bug,那如果某一个路由器出现换路,路由算法就可能让这个报文一直在这个环中传输,久而久之可能发生网络拥塞(造成损失)。限制报文的生存时间,就可以有效的防止这种情况的发生。
  5. 8位协议 :标识传输层是TCP协议还是UDP协议。
  6. 16位首部检验和 :检验IP报文的头部的数据传输中是否发生了错误。
  7. 32位源IP地址 :标识本机的IP地址,这也是我们在socket编程中bindIP地址。
  8. 32位目的IP地址 :标识目的主机的IP地址。

还有中间的4字节的字段,与IP分片相关(数据链路层mtu限制了数据链路层有效载荷的大小),如果传输层给网络层的报文太大,就必须进行IP分片,否则报文将被直接丢弃,即使TCP协议对其有所控制(通过三次握手协商大小),但是UDP协议是没有这些机制的(完全依赖与应用层)。IP分片的情况属于少数,今天这篇博客,我们就不谈这部分了。

所谓的IP协议,体现在Linux的kernel,不就是用相应的数据结构来描述的嘛?双方操作系统都需要有这个一模一样的数据结构:

hdrheadr的缩写。

报文如何分离、交付

如何分离 :通过16位总长度和4位首部长度,我们可以分离IP报文的报头和有效载荷。

知道了分离,封装就是它的逆过程,很好理解,不再赘述。

如何交付 :通过8位协议,我们可以知道应该交给上层的传输层的UDP协议还是TCP协议。

相关推荐
七夜zippoe3 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥3 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
会员源码网3 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
米羊1214 小时前
已有安全措施确认(上)
大数据·网络
Fcy6484 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满4 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
主机哥哥5 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
ManThink Technology5 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
珠海西格电力科技6 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
QT.qtqtqtqtqt6 小时前
未授权访问漏洞
网络·安全·web安全