【计算机网络】网络层——IP协议

目录

一. 基本概念

二. 协议报文格式

三. 网段划分

1. 第一次划分 

2. CIDR方案

3. 特殊的IP地址

四. IP地址不足

1. 私有IP和公网IP

2. DHCP协议

3. 路由器

4. NAT技术 

内网穿透(NAT穿透)

五. 路由转发 

路由表生成算法

结束语


一. 基本概念

IP指网络互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模,易构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则。IP只为主机提供一种无连接,不可靠,尽力而为的数据包传输服务

TCP协议提供传输控制,IP协议提供传输服务。TCP协议为传输层协议,其保证可靠性和传输效率,而下层的网络层和数据链路层负责数据在网络中的传输。

双方在进行网络通信时,数据并不是从一方的传输层直接发送到另一方的传输层的,而是需要依次向下交付给网络层和数据链路层,然后发送到网络中;对方主机拿到数据后,先需要依次向上交付解包。如下图

数据自顶向下交付,各协议层添加报头的过程叫做封装;报文自底向上,各协议层移除报头的过程叫做解包

  • 网络层的作用就是,将数据从一台主机送到另一台主机,也就是数据的路由

专有名词解释

  • 主机:配有IP地址,但不进行路由控制的设备
  • 路由器:既配有IP地址,又能进行路由控制、
  • 节点:主机和路由器的统称

需要注意的是,现代操作系统的某些特定配置下,也可以使得主机具备一定程度的路由功能。比如支持NAT(网络地址转换),但这并不是主机的主要功能。路由器也可以被称为主机

二. 协议报文格式

  • 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4
  • 4位头部长度(header length):IP头部的长度,基本单位是4字节,也就是length * 4的字节数。比如length = 4,那么报头长度(包括选项)就是4*4=16。4bit表示的最大数字是15,因此IP报头的最大长度是60字节。因为20字节是固定长度,所以选项部分最大为40字节
  • 8位服务类型(Type of service):3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须为0,后续发展补充)。4位TOS分别为最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个,对于ssh/telnet这样的应用程序,最小时延比较重要;对于ftp这样的程序,最大吞吐量比较重要
  • 16位总长度(total length):IP数据报整体占多少字节
  • 16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一片里的标识都是相同的
  • 3位标志字段:第一位保留(现阶段不用,后续发展补充);第二位为1表示禁止分片,此时如果报文长度超过MTU长度,该报文就会被直接丢弃;第三位表示“更多分片”,如果分片,最后一个分片的“更多分片”标志位为0,其他都是1。、
  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处于哪个位置,实际偏移字节数就是这个值 / 8。因此,除了最后一个报文,其他报文的长度必须是8的整数倍(否则报文就不连续了)
  • 8位生存时间(Time of live):数据报到达目的地的最大报文跳数,一般是64。每经过一个路由,TTL - = 1,一直减到0还没到达,那么就丢弃这个报文。该字段主要用来防止出现路由循环
  • 8位协议:表示上层传输层协议类型
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏
  • 32位源地址:发送端,源主机IP地址
  • 32位目的地址:接收端,目的主机IP地址
  • 选项字段:不定长,最多40字节

IP报头在内核中本质是位段类型,给数据封装报头,实际上就是使用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,便完成了IP报文的封装

解包过程需要回答两个问题:

  • IP报头和有效载荷如何分离?
  • 有效载荷如何向上交付?

1. IP报头和有效载荷如何分离

方法与TCP一样。在IP报头中,前20字节是固定长度,其中有4位首部长度,根据首部长度就可以知道报头的长度,再根据16位总长度,将报头和有效载荷分离

2. 有效载荷如何向上交付

基于IP协议的传输层协议不止一种,因此IP封装时,需要记录上层协议类型。报头中的8位协议字段,就记录了上层协议类型

常见的8位协议字段有这些

  • 1:ICMP(Internet Control Message Protocol,互联网控制报文协议)
  • 6:TCP (Transmission Control Protocol,传输控制协议)
  • 17:UDP (User Datagram Protocol,用户数据报协议)
  • 41:IPv6 (Internet Protocol version 6,互联网协议版本 6)
  • 89:OSPF (Open Shortest Path First,开放最短路径优先)
  • 132:SCTP (Stream Control Transmission Protocol,流控制传输协议)
  • 253:使用实验/测试用途的协议
  • 254:保留字段
  • 255:保留字段

分片与组装

传输层给IP层的数据如果较大,IP层还需要对此进行分片,然后依次交付给下层的数据链路层。详细过程可以移步后续博客.......

三. 网段划分

IP地址标识网络中唯一一台主机,端口号标识主机中唯一一个进程。所以IP地址+端口号可以表示网络中唯一一台主机的进程

网络通信的实质是,网络中,两个不同主机的进程的通信

端口号在传输层使用,而IP地址在网络层使用


IP地址分为两部分:网络号和主机号

  • 网络号:保证相互连接的两个网段(局域网)具有不同的标识
  • 主机号:同一网段(局域网),主机之间具有相同的网络号,但必须有不同的主机号

数据在网络传输过程中会遇到一个个的路由器,这些路由器会帮助网络当中的数据进行路由转发,使得网络中的数据慢慢接近目标主机。路由器在帮助数据进行路由转发时,会提取该数据的IP报头当中的目的IP地址,并以此作为数据路由转发的重要依据。

当主机A收到主机B的数据,可能要返回响应或者也要给主机B发送数据,此时双方身份就对掉了,主机B可以根据主机A发送的报文,其中有源IP地址——主机A的IP地址。此时主机B构建的IP报文,源IP是主机B的IP,目的IP是主机A的IP地址

  • 不同的子网(局域网),其实就是把网络号相同的主机放到一起
  • 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中任何一台主机重复

1. 第一次划分 

过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图

  • A类:0.0.0.0 ~ 127.255.255.255
  • B类:128.0.0.0 ~ 191.255.255.255
  • C类:192.0.0.0 ~ 223.255.255.255
  • D类:224.0.0.0 ~ 239.255.255.255
  • E类:240.0.0.0 ~ 247.255.255.255

当要判断一个IP地址属于哪一类时,只需要遍历IP地址的前5个比特位,第几个比特位最先出现0,那么就对应属于哪一类IP地址

主机号越多,代表该网络可容纳的主机数越多

但随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快分配完了,而A类却浪费了大量的地址:

例如,申请一个B类地址,理论上该子网中允许容纳6万5千多台主机

但实际网络架构中,不存在一个子网有这么多主机的情况,因此大量的IP地址都别浪费掉

针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)

2. CIDR方案

在原有的五类网络的基础上继续进行子网划分,需要借用主机号当中的若干位充当网络号

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号
  • 子网掩码也是一个32位的正整数,通常用一串“0”来结尾
  • 每一个子网都有自己的子网掩码
  • 将IP地址和子网掩码进行“按位与”操作,得到的就是网络号
  • 网络号和主机号的划分与这个IP地址是A类,B类还是C类无关

下面举两个例子

因为255的比特位为8个1,即全1。任何数与之按位与都为其本身,所以IP地址的前三位不变。最后一位为0,按位与为0。并且不管最后一位数字怎么变,与子网掩码按位与都为0。所以该子网范围为140.252.20.0 ~ 140.252.20.255 

240的比特位为1111 0000,即按位与后会保留最后一位的前4个比特位。68的比特位为0100 0100,与240按位与后保留前四位:0100 0000——64

因为最后一位的后4个比特位为主机号,所以最多有16台主机,即从140.252.20.64 ~ 140.252.20.79

可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围

此时一个网络就被更细粒度的划分成一个个更小的子网,通过不断地子网划分,子网中IP地址对应的主机号就越来越短,因此子网中可用的IP地址的个数也越来越少,这就避免了IP地址被浪费的情况

需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的内部再继续进行子网划分

因此一个数据在路由器转发时——路由,随着数据不断路由进入更小的子网,其网络号的位数是不断变化的,准确涞水其网络号的位数在不断增加,这就意味着IP地址中的主机号位数不断减少,子网规模不断变小。最终当数据路由到达目的主机所在网络时,就可以在该网络中找到对应的目的主机


IP地址和子网掩码还有一种更简洁的表示方法:例如140.252.20.68/24 

这表示该主机的IP为140.252.20.68,子网掩码的高24位为1,也就是255.255.255.0

补充:运营商

运营商其实就是中国电信,移动,联通等等

  • 实际网络通信的基础设施建设都是运营商完成的,我们访问服务器并不是直接发送给对应的服务器的,而是需要经过运营商建设的各种基站和各种路由器, 才能最终送达到对应的服务器
  • 我们交网费,其实也就是购买入网许可。当我们成功输入联网密码,运营商的路由器会检查是否欠费,没有则正常路由,欠费则不进行数据转发,因此无法上网

也就是说,用户上网的数据首先必须经过运营商相关的网络设备,然后才能发送到互联网公司对应的服务器。网段划分,子网划分等工作都是运营商做的

3. 特殊的IP地址

并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就具有特殊用途

  • 将IP地址中的主机号全部设为0,就称为网络号,代表这个局域网。比如192.168.0.0
  • 将IP地址中的主机号全设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。比如192.168.255.255
  • 127.*的IP地址用于本地环回(loop back)测试,通常是127.0.0.1

主机号全0和全1一般不被主机使用,所以一个子网(局域网)的主机数最多为2^{n}-2,n为主机号位数。例如192.168.2.0。该子网的主机号为最后一位,有8bits,即主机数最多为2^{8}-2


本地环回

本地环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络当中,相当于本地环回不会讲数据写到网卡上

本地环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常

本地环回的基本原理:

  • 当数据到达IP层需要继续向下交付时,如果是环回程序,那么IP输出函数会将该数据放到IP输入队列中,然后再由IP输入函数读取上去
  • 而IP输入函数将数据读取上去的本应该是链路层交付的数据,因此该数据后续就会被当作从网络中读取上的数据看待,各层协议会对该数据依次进行解包和分用
  • 如果不是环回程序,那么接下来就会判断该数据对应的目的IP是否为广播或多播地址,或者目的IP地址是否与本主机的IP地址相同,如果是则也会将数据放入到IP输入队列当中,等IP输入函数将其读走
  • 只有判断程序不是环回程序,并且也不是广播或多播,或发给本主机的数据后,才会用ARP协议(后续将)获取该数据的目的主机的MAC地址(数据链路层)并进行后续数据发送的操作

loopback设备:

四. IP地址不足

IP地址(IPv4)是一个4字节,32位的正整数,因此最多表示的主机数为2^{32},将近43亿个。又因为IP地址唯一标识网络中的一台主机,所以要想网络通信,就必须有IP地址。

但全球人口已经有超70亿,更何况不仅电脑,手机等设备,只要是需要上网的,都需要IP地址。由此可见,32位IP地址是远远不够的

因此才提出CIDR的方案,对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费。

CIDR虽然一定程度上缓解了IP地址不够用的问题,减少了IP地址的浪费,但IP地址的绝对上线并没有增加,即能表示的主机数没有增加。

为了,人们提出了以下几种方式:

  • DHCP协议:动态分配IP地址。只给介入网络的设备分配IP地址,因此同一个MAC地址(数据链路层)的设备,每次接入互联网中,得到的IP地址不一定相同,避免了IP地址强绑定与某一台设备。MAC地址是一个48位的地址,每一个网卡至少配备一个MAC地址。后续数据链路层再详细讲解
  • NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效的避免来自网络外部的攻击,隐藏并保护网络内部的计算机
  • IPv6:IPv6用16字节,128bits来表示IP地址,从根本上缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级,两者是互不相干的两个协议,彼此并不兼容。目前IPv6在公网还没有普及,但在我国的内网内,基本都已经支持IPv6

1. 私有IP和公网IP

如果一个组织内部组建局域网,IP只用于局域网内部的通信,而不直接练到Internet上,理论上,使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。

  • 10.0.0.0 :前8位是网络号,共16,777,216个地址
  • 172.16.0.0  ~ 172.31.255.255 :前12位为网络号,共1,048,576个地址
  • 192.168.0.0 :前16位为网络号,共65,536个地址

包含在这个范围内的,都称为私有IP,只在子网(局域网)是使用,其余被称为公网IP(或全局IP)

在Linux中,可以使用ifconfig查看网络信息,第一段的etho代表这台主机的网络接口,第二段的lo(loop)代表本地环回。可以看到,私有IP为10.0.12.11

 在Windows下,可以先Win+r,输入cmd打开命令行控制器,使用ipconfig命令查看网络信息

 可以看到已经支持IPv6协议


2. DHCP协议

手动管理IP地址是非常麻烦的,当子网中新增主机时需要给其分配IP地址,当子网当中有主机断开网络时,又需要将其IP地址回收,便于后续给新增主机分配

  • 因此,对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)协议
  • DHCP通常被应用在大型的局域网中,其主要作用就是集中管理地址,分配IP地址,使网络环境中的主机动态的获得IP地址,Gateway地址,DNS服务器地址等信息,并能够提高地址的使用率
  • DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器

举例:

比如家里面的局域网的网络号为:192.168.2.

可用的IP地址就是192.168.2.0 ~ 192.168.2.255;一般规定.0和.255是不用的路由器一般为局域网中的第一台主机,即192.168.2.1

DHCP的作用就是,当你的手机和你的电脑连网时,按顺序分配IP地址,如果早上你的手机先连,那么手机的IP地址为192.168.2.2,电脑为192.168.2.3;中午手机和电脑都断了网,下午电脑比手机先连,那么电脑的IP为192.168.2.2,手机为192.168.2.3。这就是动态地址分配——DHCP

3. 路由器

路由器是连接两个或多个网络的硬件设备,路由器上有两种网络接口,分别是LAN口和WAN口:

  •  LAN口(Local Area Network):表示连接本地网络的端口,主要用于家庭网络中的交换机,集线器或PC相连
  • WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网

我们将LAN口的IP地址叫做LAN口IP,也叫子网IP;将WAN口的IP地址叫做WAN口IP,也叫做外网IP

我们使用的电脑,家用路由器,运营商路由器,广域网以及我们要访问的服务器之间的关系大致如下:

4. NAT技术 

  • 一个路由器可以配置两类IP地址,一个是WAN口IP,一个是LAN口IP
  • 路由器LAN口连接的主机,都从属于当前这个路由器的子网中
  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),即子网的第一个IP。子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了,即两个子网允许出现相同的主机号
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了
  • 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址会成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有公网IP的服务器上,这样的服务器可以在阿里云/腾讯云等等云服务平台购买

路由器在做IP地址替换时,还会将源IP和目的IP的映射关系保存,记录在NAT转换表中。

当局域网内的主机访问公网主机时,通常情况下,局域网出口路由器会将发往公网主机的数据包进行网络地址转换(NAT),将数据包中的源IP地址修改为路由器的公网IP地址,以便公网主机能够正确地返回响应。

在进行 NAT 转换时,路由器会将源 IP 地址替换为它自己的公网 IP 地址,并在其 NAT 转换表中记录转换信息,以便在接收到响应数据包时,能够将目标 IP 地址从公网 IP 地址转换为对应的私有 IP 地址,并将响应数据包发送回相应的局域网主机。

当局域网出口路由器进行网络地址转换(NAT)时,它会在转换表中记录每个转换的信息,包括私有 IP 地址和对应的公网 IP 地址。这样,在接收到公网主机返回的响应数据包时,出口路由器可以根据目标 IP 地址查找转换表,并将目标 IP 地址从公网 IP 地址映射回相应的私有 IP 地址。

具体而言,当出口路由器接收到返回的数据包时,它会检查数据包的目标 IP 地址。然后,它会查询转换表,找到与目标 IP 地址对应的私有 IP 地址。接着,出口路由器会将数据包的目标 IP 地址修改为对应的私有 IP 地址,并将数据包发送到局域网内的相应主机。

内网穿透(NAT穿透)

  •  主机C在局域网A中,主机D在局域网B中,理论上主机C和主机D是不能不跨公网进行通信的,因为一个主机要想将数据发送给另一台主机,就得先知道该主机的IP地址
  • 即便主机C知道了主机D的IP地址,这个IP地址也是私有IP,可能会和局域网A中的主机重复,包括主机C
  • 当和主机C重复时,操作系统会认为是本主机通信,如此甚至不会向外发送;和局域网A的其他主机重复,则会认为是局域网通信,不会经由路由器

所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。

但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透


内网穿透是一种网络技术,内网穿透通常用于实现两个不同局域网之间的通信。当两个局域网之间由于网络隔离或安全限制而无法直接通信时,可以使用内网穿透技术来建立一条安全的通道,使得两个局域网中的设备可以相互访问和通信。

常见的内网穿透技术包括端口映射、反向代理和虚拟专用网络(VPN)等。

  1. 端口映射:通过在路由器或防火墙上设置端口映射规则,将公网上的某个端口映射到私有网络中的设备,从而实现对该设备的访问。

  2. 反向代理:在公网上搭建一个反向代理服务器,当公网用户请求访问时,反向代理服务器会将请求转发到内网中的目标设备上,并将响应返回给公网用户。

  3. 虚拟专用网络(VPN):通过建立加密隧道,将公网用户连接到私有网络中,使得公网用户可以像在内网中一样访问内网设备或服务。

这些技术都可以实现内网穿透,但具体选择哪种方式取决于实际需求和网络环境。需要注意的是,在使用内网穿透技术时应确保网络安全,采取适当的安全措施来保护内网设备和数据的安全性。

五. 路由转发 

 上面说到,路由器是集连多个子网的设备,子网内的主机如果要访问公网的服务器,其数据需要路由器转发到公网。这就是路由转发

数据在路由过程中,实际是一跳一跳的(Hop by Hop)“问路”的过程。所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间

IP数据包的传输过程:

  • 当IP数据包,到达路由器时,路由器会先查看目的IP
  • 路由器决定这个数据包是能够直接发送给目标主机,还是需要发给下一个路由器
  • 依次反复,一直到达目的IP地址
  • 如何判定当前数据包要发送到哪个子网呢?这个依靠每个节点内部维护的路由表

路由器的查找结果可能有以下三种:

  • 路由器经过路由表查询后,得知该数据应该跳到哪一个子网
  • 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
  • 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。

Linux路由表可以使用route命令查看;Windows下使用route PRINT -4

route PRINT -4

route命令

  • Destination:代表的是目的网络地址
  • Gateway:代表下一跳地址
  • Genmask:代表的是子网掩码
  • Flags:U标志表示此条目有效(可以禁用某些条目);G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络是与本机接口直接相连的网络,不必经由路由器转发
  • Iface:代表的是发送接口

当一个数据包从源设备发送出去时,它首先会通过源设备的网卡发送到本地网段。然后,根据目标 IP 地址,源设备的操作系统会查找路由表来确定下一跳的路由器。路由表中记录了网络的目的地址和相应的下一跳路由器。根据目的地址,源设备会将数据包发送给下一跳路由器。

下一跳路由器接收到数据包后,会根据自己的路由表,依次与子网掩码Genmask进行按位与操作,然后结果与子网掩码对应的目的网络地址Destination进行对比,如果匹配则将数据发送到这个子网,通过对应的发送接口Iface发出。这个过程会一直持续,直到数据包到达目标设备所在的网络,并被目标设备接收。如果没有匹配的子网,就会发送到默认路由——default,其对应的FlagsUG

路由转发过程中,路由器会根据目标地址进行决策,选择最佳路径来转发数据包。路由器之间通过路由协议来交换路由信息,更新各自的路由表,以保证网络中的路由信息能够得到更新和同步。

通过路由转发机制,网络中的数据包可以在不同的网络之间进行传输,实现了跨网络的通信和互联互通。


举例

假设某主机上的网络接口配置和路由表如下:

  •  这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络

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

  • 跟第一行的子网掩码做与运算得到 192.168.56.0,与第一行的目的网络地址不符
  • 再跟第二行的子网掩码做与运算 得到192.168.56.0,与目的网络地址相同,因此从eth1接口发送出去;
  • 由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发送到目的主机,不需要经由路由器转发

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

  • 依次和路由表前几项进行对比,发现都不匹配
  • 按缺省路由条目,从eth0接口发出去,发往192.168.10.1 路由器
  • 由192.168.10.1 路由器根据它的路由表决定下一跳地址

总结

路由器通过使用路由表和路由算法来进行路由转发。下面是一个简化的描述路由器路由转发的过程:

  1. 接收数据包:路由器首先接收到一个数据包,这个数据包通常是从其中一个接口进入路由器的。

  2. 解析目标 IP 地址:路由器检查数据包的目标 IP 地址,以确定下一步的路由决策。

  3. 查找路由表:路由器查询自己的路由表,路由表是存储在路由器内部的一个表格,记录了目标网络地址和相应的出接口之间的映射关系。

  4. 路由决策:根据路由表的信息,路由器选择一个最佳的出接口来转发数据包。这个决策可能基于多种因素,例如目标网络的距离、接口的负载情况或者其他策略。

  5. 封装数据包:路由器将数据包重新封装,更新源和目标的 MAC 地址,并将其发送到下一跳路由器或目标主机。

  6. 转发数据包:路由器将封装好的数据包通过选定的出接口发送出去。这可能涉及到数据链路层的处理,例如将 IP 数据包封装为适当的链路层帧。

  7. 循环直至目标:如果目标主机不在直接连通的网络上,路由器将重复上述过程,将数据包发送到下一跳路由器,直到数据包到达目标主机为止。

总之,路由器使用路由表和路由算法来决定如何转发数据包。它根据目标 IP 地址选择最佳的出接口,并封装数据包并转发到下一跳路由器或目标主机。这个过程在整个网络中重复进行,直到数据包到达目标位置。


路由表生成算法

路由可分为静态路由和动态路由:

  • 静态路由:是指由网络管理员手工配置路由信息。
  • 动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整。

路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。

结束语

本篇博客到此结束,感谢看到此处。
欢迎大家纠错和补充
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224418.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android内存管理机制概览

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、相关概念3.1 垃圾回收3.2 应用内存的分配与回…

Linux与Bash 编程——Linux文件处理命令-L1

目录: linux系统与shell环境准备 Linux系统简介操作系统简史Linux的发行版:Linux与Windows比较:Linux安装安装包下载Linux的访问方式远程登录方式远程登录软件:mobaxterm的使用:使用电脑命令行连接:sshd的…

一篇讲透:箭头函数、普通函数有什么区别

前言 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步! 🍅 个人主页:南木元元 目录 什么是箭头函数 箭头函数和普通函数的区别 更简洁的语法 箭头函数…

10-让Java性能提升的JIT深度剖析

文章目录 JVM的语言无关性解释执行与JITC1、C2与Graal编译器C1编译器C2编译器 分层编译(了解即可)热点代码热点探测方法调用计数器回边计数器 编译优化技术方法内联锁消除标量替换逃逸分析技术逃逸分析的原理逃逸分析 JVM的语言无关性 跨语言(语言无关性&#xff0…

OpenHarmony之内核层解析~

OpenHarmony简介 技术架构 OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的组件…

平衡二叉树的构建(递归

目录 1.概念:2.特点:3.构建方法:4.代码:小结: 1.概念: 平衡二叉树(Balanced Binary Tree),也称为AVL树,是一种二叉树,它满足每个节点的左子树和右…

BDD - Python Behave Runner Script

BDD - Python Behave Runner Script 引言Runner Scriptsubprocess.run 调用 Behave 命令行调用 Behave 提供的 API behave_main 引言 通过终端命令执行 Behave 测试用例,有时 IDE 重启了,还得重新敲一遍命令,很是麻烦,说实话我都…

单例模式(C++实现)

RAII运用 只能在栈上创建对象 只能在堆上创建的对象 单例模式 设计模式 懒汉模式 解决线程安全 优化 饿汉模式 饿汉和懒汉的区别 线程安全与STL与其他锁

Hadoop入门学习笔记——四、MapReduce的框架配置和YARN的部署

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 四、MapReduce的框架配置和YARN的部署4.1. 配置MapReduce…

微擎模块 出现Error: template source ‘common/message’ is not exist!解决方法

今天有会员反馈微课堂分销中心打不开,错误提示模板找不到:Error: template source ‘common/message’ is not exist!,看了下这模板应该微擎框架通用的,进公众号会员管理-会员中心网址居然也打不开,提示一样的错误&…

【hacker送书第11期】Python数据分析从入门到精通

探索数据世界,揭示未来趋势 《Python数据分析从入门到精通》是你掌握Python数据分析的理想选择。本书深入讲解核心工具如pandas、matplotlib和numpy,助您轻松处理和理解复杂数据。 通过matplotlib、seaborn和创新的pyecharts,本书呈现生动直…

5g消息-5G时代短信升级-富媒体智能交互-互联网新入口

在5G时代,运营商和各大手机厂商都在积极推进5G消息的商用,基于短信入口的富媒体消息应用在近两年得到快速发展,并在企业端形成了广泛应用。 作为5G时代的数字原生应用,5G消息支持用户通过文字、图片、音频、视频、位置等富媒体方式…

GIT具体配置步骤详解

GIT配置具体步骤如下 SDK 使用 Repo 工具管理,拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workf…

SpringBoot集成opencc4j实现繁体中文转为简体中文

背景 繁体中文转为简体中文的需求非常常见,特别是在中文语境下的文本处理和翻译应用中。有很多现成的工具和库可以实现这个功能,比如 OpenCC 、 HanLP 等。从网上下载的 MySQL 版诗词数据库中的诗词数据都是繁体字,这里使用 SpringBoot 集成…

Apache Flink 进阶教程(七):网络流控及反压剖析

目录 前言 网络流控的概念与背景 为什么需要网络流控 网络流控的实现:静态限速 网络流控的实现:动态反馈/自动反压 案例一:Storm 反压实现 案例二:Spark Streaming 反压实现 疑问:为什么 Flink(bef…

物联网产品设计,聊聊设备OTA的升级

物联网产品设计部分的OTA设备固件是一个非常重要的部分,能够实现升级用户服务、保障系统安全等功能。 在迅速变化和发展的物联网市场,新的产品需求不断涌现,因此对于智能硬件设备的更新需求就变得空前高涨,设备不再像传统设备一样…

unity HoloLens2开发,使用Vuforia识别实体 触发交互(二)(有dome)

提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、打包到HoloLens二、Vuforia相关1.配置识别框2.制作一个半透明识别框:3.设置如下4.问题 四 HoloLens2 问题总结 前言 我使用的utniy 版本:Unity 2021.3…

产品原型设计软件 Axure RP 9 mac支持多人写作设计

axure rp 9 mac是一款产品原型设计软件,它可以让你在上面任意构建草图、框线图、流程图以及产品模型,还能够注释一些重要地方,axure rp汉化版可支持同时多人写作设计和版本管理控制,这款交互式原型设计工具可以帮助设计者制作出高…

Jenkins自动化构建打包,部署

1.环境准备 上传jdk,maven和tomcat的包,解压到/usr/local下并配置环境变量。 配置jdk [rootserver04 ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH##加载环境变量 [rootserver04 ~]# source /etc/profi…

由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。

问题描述: 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。 在实现向数据库中添加记录时,请求发送无效,参数也未传递到控…