当前位置: 首页 > news >正文

【计算机网络】网络层——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地址,并以此作为数据路由转发的重要依据。

当主机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算法等。

结束语

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

相关文章:

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

目录 一. 基本概念 二. 协议报文格式 三. 网段划分 1. 第一次划分 2. CIDR方案 3. 特殊的IP地址 四. IP地址不足 1. 私有IP和公网IP 2. DHCP协议 3. 路由器 4. NAT技术 内网穿透(NAT穿透) 五. 路由转发 路由表生成算法 结束语 一. 基本概念 IP指网络互连协议…...

《钢结构设计标准》中抗震性能化设计的概念

文章目录 0. 背景1. 前言2. 什么是抗震性能化设计3. 我国规范是如何实现性能化设计的4. 从能量角度理解性能化设计05. 《钢结构设计标准》抗震性能化设计的思路06. 《钢结构设计标准》抗震性能化设计的步骤 0. 背景 关于抗震性能化设计,之前一直理解的很模糊&#…...

【算法】【动规】回文串系列问题

文章目录 跳转汇总链接3.1 回文子串3.2 最长回文子串3.3 分割回文串 IV3.4 分割回文串II(hard) 跳转汇总链接 👉🔗动态规划算法汇总链接 3.1 回文子串 🔗题目链接 给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。 …...

4-Docker命令之docker logs

1.docker logs介绍 docker logs命令是用来获取docker容器的日志 2.docker logs用法 docker logs [参数] CONTAINER [root@centos79 ~]# docker logs --helpUsage: docker logs [OPTIONS] CONTAINERFetch the logs of a containerAliases:docker container logs, docker lo…...

svelte基础语法学习

官网文档地址&#xff1a;绑定 / Each 块绑定 • Svelte 教程 | Svelte 中文网 1、样式 一般情况下父子组件内样式隔离、同级组件间样式隔离 2、页面布局 <style>P{color: red;} </stye><script> // 类似data let name ‘jiang’ let countVal 0 let s…...

Node.js教程-mysql模块

概述 在Node.js中&#xff0c;mysql模块是实现MySQL协议的JavaScript客户端工具。Node.js程序通过与MySQL建立链接&#xff0c;然后可对数据进行增、删、改、查等操作。 安装 由于mysql模块不是Node.js内置模块&#xff0c;需手动安装 npm i mysql注意&#xff1a;若MySQL服…...

网络通信协议

WebSocket通信 WebSocket是一种基于TCP的网络通信协议&#xff0c;提供了浏览器和服务器之间的全双工通信&#xff08;full-duplex&#xff09;能力。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff…...

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…...

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC&#xff0c;同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&am…...

【5G PHY】NR参考信号功率和小区总传输功率的计算

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

k8s学习 — 各知识点快捷入口

k8s学习 — 各知识点快捷入口 k8s学习 — 第一章 核心概念 k8s学习 — 第一章 核心概念 命名空间 实践&#xff1a; k8s学习 — &#xff08;实践&#xff09;第二章 搭建k8s集群k8s学习 — &#xff08;实践&#xff09;第三章 深入Podk8s学习 — &#xff08;实践&#xff0…...

【Python】Python 批量转换PDF到Excel

PDF是面向展示和打印使用的&#xff0c;并未考虑编辑使用&#xff0c;所以缺少了很多编辑属性且非常难修改PDF里面的数据。当您需要分析或修改PDF文档数据时&#xff0c;可以将PDF保存为Excel工作簿&#xff0c;实现轻松编辑数据的需求。PDF转Excel&#xff0c;技术关键就是提取…...

Python并行计算和分布式任务全面指南

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python并行计算和分布式任务全面指南。全文2900字&#xff0c;阅读大约8分钟 并发编程是现代软件开发中不可或缺的一部分&#xff0c;它允许程序同时执行多个任务&#xff0…...

微信小程序promise封装

一. 在utils文件夹内创建一个request.js 写以下封装的 wx.request() 方法 const baseURL https:// 域名 ; //公用总路径地址 export const request (params) > { //暴露出去一个函数&#xff0c;并且接收一个外部传入的参数let dataObj params.data || {}; //…...

hash长度扩展攻击

作为一个信息安全的人&#xff0c;打各个学校的CTF比赛是比较重要的&#xff01; 最近一个朋友发了道题目过来&#xff0c;发现有道题目比较有意思&#xff0c;这里跟大家分享下 这串代码的大致意思是&#xff1a; 这段代码首先引入了一个名为"flag.php"的文件&am…...

设计模式--命令模式

实验16&#xff1a;命令模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解命令模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用命令模式解决实际问题。 [实验任务]&#xff1a;多次撤销和重复的命令模式 某系…...

单例模式的七种写法

为什么使用单例&#xff1f; 避免重复创建对象,节省内存,方便管理;一般我们在工具类中频繁使用单例模式; 1.饿汉式(静态常量)-[可用] /*** 饿汉式(静态常量)*/ public class Singleton1 {private static final Singleton1 INSTANCE new Singleton1();private Singleton1(){}…...

ElasticSearch入门介绍和实战

目录 1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; 1.2 ElasticSearch与Lucene的关系 1.3 哪些公司在使用Elasticsearch 1.4 ES vs Solr比较 1.4.1 ES vs Solr 检索速度 2. Lucene全文检索框架 2.1 什么是全文检索 2.2 分词原理之倒排索引…...

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…...

AUTOSAR从入门到精通-车载以太网(四)

目录 前言 原理 车载以太网发展历史 为何选择车载以太网...

MySQL报错:1054 - Unknown column ‘xx‘ in ‘field list的解决方法

我在操作MySQL遇到1054报错&#xff0c;报错内容&#xff1a;1054 - Unknown column Cindy in field list&#xff0c;下面演示解决方法&#xff0c;非常简单。 根据箭头指示&#xff0c;Cindy对应的应该是VARCHAR文本数字类型&#xff0c;字符串要用引号&#xff0c;所以解决方…...

【Android 13】使用Android Studio调试系统应用之Settings移植(四):40+个依赖子模块之ActionBarShadow

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、子模块AS移植3.1 AS创建目标3.2 创建ActionBarShadow(1)使用VS Code打开org_settings/SettingsLib目录(2)ActionBarShadow的Manifest.xml(3)ActionBarShadow的An…...

nosql-redis整合测试

nosql-redis整合测试 1、创建项目并导入redis2、配置redis3、写测试类4、在redis中创建key5、访问80826、在集成测试中测试方法 1、创建项目并导入redis 2、配置redis 3、写测试类 4、在redis中创建key 5、访问8082 6、在集成测试中测试方法 package com.example.boot3.redis;…...

智能化中的控制与自动化中的控制不同

智能化中的控制相对于自动化中的控制更加灵活、智能、综合和学习能力强。智能化控制系统能够根据实际情况进行自主决策和优化&#xff0c;适用范围更广&#xff0c;效果更好。 首先&#xff0c;智能化控制系统能够根据外部环境的变化和实时数据的反馈来自主调整和优化控制策略&…...

java练习题之多态练习

1&#xff1a;关于多态描述错误的是(D) A. 父类型的引用指向不同的子类对象 B. 用引用调用方法&#xff0c;只能调用引用中声明的方法 C. 如果子类覆盖了父类中方法&#xff0c;则调用子类覆盖后的方法 D. 子类对象类型会随着引用类型的改变而改变 2&#xff1a;class Supe…...

[原创][R语言]股票分析实战[4]:周级别涨幅趋势的相关性

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...

esp32使用lvgl,给图片取模显示图片

使用LVGL官方工具。 https://lvgl.io/tools/imageconverter 上传图片&#xff0c;如果想要透明效果&#xff0c;那么选择 输出格式C array&#xff0c;点击Convert进行转换。 下载.c文件放置到工程下使用即可。...

R语言使用scitb包10分钟快速绘制论文基线表

scitb包目前进行了升级到1.7版本了&#xff0c;我做了一个操作视频&#xff0c;如何快速绘制基线表。 scitb包绘制基线表 可以配套看下我的关于scitb包文章理解一下 scitb包1.6版本发布&#xff0c;一个为制作专业统计表格而生的R包...

类和对象

1 类定义&#xff1a; class ChecksumAccumulator {// class definition goes here } 你就能创建 ChecksumAccumulator 对象&#xff1a;new CheckSumAccumulator 注&#xff1a;1scala类中成员默认是public类型&#xff0c;若设为私有属性则必须加private关键字。在scala中是…...

Py之tensorflow-addons:tensorflow-addons的简介、安装、使用方法之详细攻略

Py之tensorflow-addons&#xff1a;tensorflow-addons的简介、安装、使用方法之详细攻略 目录 tensorflow-addons的简介 tensorflow-addons的安装 tensorflow-addons的使用方法 1、使用 TensorFlow Addons 中的功能&#xff1a; tensorflow-addons的简介 TensorFlow Addon…...

STM32G4x FLASH 读写配置结构体(LL库下使用)

主要工作就是把HAL的超时用LL库延时替代&#xff0c;保留了中断擦写模式、轮询等待擦写&#xff0c;我已经验证了部分。 笔者用的芯片为STM32G473CBT6 128KB Flash&#xff0c;开环环境为CUBEMXMDK5.32&#xff0c;因为G4已经没有标准库了&#xff0c;笔者还是习惯使用标准库的…...

【AI提示词人物篇】创新艺术未来,让科技改变想象空间

AI 绘画学习难度和练习技巧 学习绘画的技巧 学习能难度&#xff1a; 外貌特征&#xff1a;AI需要学习识别和理解各种外貌特征&#xff0c;如发型、肤色、眼睛颜色等。这可能需要大量的训练数据和复杂的模型架构。 镜头提示&#xff1a;AI需要学习理解不同镜头提示的含义&…...

登录shell与非登录shell、交互式与非交互式shell的知识点详细总结

一、登录shell与非登录shell 1.登录shell定义&#xff1a;指的是当用户登录系统时所取的那个shell&#xff0c;登录shell属于交互式shell。 登陆shell通常指的是&#xff1a;用户通过输入用户名/密码&#xff08;或证书认证&#xff09;后启动的shell.例如&#xff1a; 当时…...

【教学类-42-02】20231224 X-Y 之间加法题判断题2.0(按2:8比例抽取正确题和错误题)

作品展示&#xff1a; 0-5&#xff1a; 21题&#xff0c;正确21题&#xff0c;错误21题42题 。小于44格子&#xff0c;都写上&#xff0c;哪怕输入2:8&#xff0c;实际也是5:5 0-10 66题&#xff0c;正确66题&#xff0c;错误66题132题 大于44格子&#xff0c;正确66题抽取44*…...

轻量Http客户端工具VSCode和IDEA

文章目录 前言Visual Studio Code 的插件 REST Client编写第一个案例进阶&#xff0c;设置变量进阶&#xff0c;设置Token IntelliJ IDEA 的 HTTP请求构建http脚本HTTP的环境配置结果值暂存 前言 作为一个WEB工程师&#xff0c;在日常的使用过程中&#xff0c;HTTP请求是必不可…...

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作&#xff08;大数据处理&#xff09;主要是.split和re.findall和glob.glob运用。 读取文件的路径&#xff08;为了获得文件内容&#xff09;和提取文件路径中感兴趣的东西(标签) 1&#xff0c;“glob.glob”用于读取文件路径 2&#xff0c;“.…...

Rust 生命周期

Rust 第17节 生命周期 先看一段错误代码 /* //一段错误的代码 // Rust 编译时会报错&#xff1b; */let r;{let x 5;r &x;}println!("{}",r);Rust 在编译时使用 借用检查器&#xff0c; 比较作用域来检查所有的借用是否合法&#xff1b; 很明显&#xff1b;r…...

【论文解读】CNN-Based Fast HEVC Quantization Parameter Mode Decision

时间&#xff1a;2019 年 级别&#xff1a;SCI 机构&#xff1a;南京信息工程大学 摘要 随着多媒体呈现技术、图像采集技术和互联网行业的发展&#xff0c;远程通信的方式已经从以前的书信、音频转变为现在的音频/视频。和 视频在工作、学习和娱乐中的比例不断提高&#xff0…...

在Linux上安装CLion

本教程将指导你如何在Linux系统上安装CLion&#xff0c;下载地址为&#xff1a;https://download.jetbrains.com.cn/cpp/CLion-2022.3.3.tar.gz。以下是详细的安装步骤&#xff1a; 步骤1&#xff1a;下载CLion 首先&#xff0c;你需要使用wget命令从提供的URL下载CLion的tar…...

R语言贝叶斯网络模型、INLA下的贝叶斯回归、R语言现代贝叶斯统计学方法、R语言混合效应(多水平/层次/嵌套)模型

目录 ㈠ 基于R语言的贝叶斯网络模型的实践技术应用 ㈡ R语言贝叶斯方法在生态环境领域中的高阶技术应用 ㈢ 基于R语言贝叶斯进阶:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析 ㈣ 基于R语言的现代贝叶斯统计学方法&#xff08;贝叶斯参数估…...

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多…...

Oracle 学习(1)

Oracle简介 Oracle是殷墟&#xff08;yīn Xu&#xff09;出土的甲骨文&#xff08;oracle bone inscriptions&#xff09;的英文翻译的第一个单词&#xff0c;在英语里是“神谕”的意思。Oracle公司成立于1977年&#xff0c;总部位于美国加州&#xff0c;是世界领先的信息管…...

华为HCIA认证H12-811题库新增

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…...

Nginx Unit 1.27.0 发布

目录 介绍 更新内容 将 HTTP 请求重定向到 HTTPS 为纯路径 URI 提供可配置的文件名 完整的更新日志 其他 平台更新 介绍 Nginx Unit 是一个动态应用服务器&#xff0c;能够与 Nginx Plus 和 Nginx 开源版并行或独立运行。Nginx Unit 支持 RESTful JSON API&#xff0c;…...

【影像组学入门百问】#32—#34

#32-影像组学研究过程中&#xff0c;图像重采样参 数怎么选择&#xff1f; 在影像组学研究过程中&#xff0c;选择合适的图像重采样参数对于保证分析质量和准确性至关重要。以下是在选择图像重采样参数时需要考虑的一些建议&#xff1a; 1.目标分辨率&#xff1a;首先&#…...

YOLOv5代码解析——yolo.py

yolo.py的主要功能是构建模型。 1、最主要的函数是parse_model&#xff0c;用于解析yaml文件&#xff0c;并根据解析的结果搭建网络。这个函数的注释如下&#xff1a; def parse_model(d, ch): # model_dict, input_channels(3)"""解析模型文件&#xff0c;并…...

4种feature classification在代码的实现上是怎么样的?Linear / MLP / CNN / Attention-Based Heads

具体的分类效果可以看&#xff1a;【Arxiv 2023】Diffusion Models Beat GANs on Image Classification 1、线性分类器 (Linear, A) 使用一个简单的线性层&#xff0c;通常与一个激活函数结合使用。 import torch.nn as nnclass LinearClassifier(nn.Module):def __init__(se…...

最新Unity DOTS Physics物理引擎碰撞事件处理

最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎&#xff0c;今天我们给大家分享和介绍一下这个物理引擎的碰撞事件处理以及核心相关概念。 Unity.Physics物理引擎的主要流程与Pipeline Unity.Physics物理引擎做仿真迭代计算的时候主要通过以下步骤来…...

springboot集成websocket全全全!!!

一、界面展示 二、前置了解 1.什么是websocket WebSocket是一种在单个TCP连接上进行全双工通信的持久化协议。 全双工协议就是客户端可以给我们服务器发数据 服务器也可以主动给客户端发数据。 2.为什么有了http协议 还要websocket 协议 http协议是一种无状态&#xff0c;非…...

SpringMVC:整合 SSM 中篇

文章目录 SpringMVC - 04整合 SSM 中篇一、优化二、总结三、说明注意&#xff1a; SpringMVC - 04 整合 SSM 中篇 一、优化 在 spring-dao.xml 中配置 dao 接口扫描&#xff0c;可以动态地实现 dao 接口注入到 Spring 容器中。 优化前&#xff1a;手动创建 SqlSessionTempl…...