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

news2024/11/24 17:31:55

目录

一. 基本概念

二. 协议报文格式

三. 网段划分

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

结束语

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈springboot整合ganymed-ssh2远程访问linux

环境介绍 技术栈 springbootmybatis-plusmysqlganymed-ssh2 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户…

【leetcode100-019】【矩阵】螺旋矩阵

【题干】 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 【思路】 不难注意到,每进行一次转向,都有一行/列被输出(并失效);既然已经失效,那我…

沉浸式go-cache源码阅读!

大家好,我是豆小匠。 这期来阅读go-cache的源码,了解本地缓存的实现方式,同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件,ca…

比亚迪王朝B级SUV新旗舰起航

12月15日宋L正式投入市场,这也宣告着比亚迪王朝品牌全新的里程碑。作为宋家族中定位稍高的L级车型,宋L本次一共上市推出了4款后驱车型和1款四驱车型。其中后驱车型的电机功率从200kW至380kW不等,续航里程最大可达662公里,满足不同…

消失循环的2023?你都做了什么? | 2023 年度总结

2023年度总结 -- 今年都做了什么事? 前言心态关键词感悟 记录申请软著独立游戏技术成长 共勉 前言 又到了一年一次年度总结的时候了。我们常常感叹时间飞逝,却又没办法让它放慢的脚步。那就将2023写下来,让它在时间的长河中留下一丝记忆。 心…

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别?为什么我应该同时使用ESLint 和Prettier?在使用ESLint 和Prettier 时,有可能出现它们之间的规则冲突吗?我已经在项目中使用了ES…

Redis数据库入门学习(下载与安装、常用命令、在Java中操作Redis)

简介 下载与安装 数据类型 常用命令 1.字符串操作命令 2.哈希操作命令 3.列表操作命令 push是将元素总是插入到第一个 0表示第一个,1表示第二个。-1表示倒数第一个,-2表示倒数第二个。当前命令的意思是第一个到倒数第一个,即就是全部元素 rpo…

设计模式 建造者模式 与 Spring Bean建造者 BeanDefinitionBuilder 源码与应用

建造者模式 定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示主要作用: 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象如何使用: 用户只需要给出指定复杂对象的类型和内容, 建造者模式负责按顺序创建复杂对象…

软件测试工程师简历项目经验怎么写?--9999个已成功入职的软件测试工程师真实简历

简历是我们求职的第一步,也是非常重要的一步。 青云叔叔看过太多简历,最快3秒就淘汰一份简历,因为其实我们每天要收到很多简历进行筛选,那么面试官其实也是会很快进行对简历进行判断的,如果你对简历写的一塌糊涂&…

教师未来前景发展

教师是一个光荣而重要的职业,他们承担着培养下一代的责任和使命。随着社会的不断发展和变化,教师的前景也在不断扩大和改变。本文将探讨教师未来的前景发展,并提供一些思考和建议。 首先,教师的就业前景将继续扩大。随着人口的增长…

基于Kettle和帆软Finereport的血缘解析

一、背景: 用户经常会针对数据存在质量的存疑,反馈数据不准。开发人员排查数据质量问题步骤:首先和业务人员对接了解是哪里数据不准确,要定位是哪张报表,然后查看报表后面数据来源,然后一路排查数仓。往往定…

膛目结舌的代码技巧!一看就是冷暴力~~~~

你见过哪些令你膛目结舌的代码技巧? 代码世界有很多令人大呼小叫的技巧!有的代码像魔术师一样巧妙地隐藏了自己,有的像魔法师一样让你眼花缭乱,还有的像瑜伽大师一样灵活自如。它们让我们惊叹不已,让我们觉得自己仿佛置…

Axios 中的文件上传 File对象的方法

使用 FormData 对象 FormData是一个用于创建表单数据的 API,可用于发送包含文件和其他表单数据的multipart/form-data请求。这是处理文件上传的常用方法。通过FormData对象,可以将文件数据添加到表单中,然后使用 Axios 的post或put方法发送请求 在.env.development 文件中配…

分布式事务TCC补偿机制

文章目录 概述工作流程优缺点优点:缺点: 总结Java 示例代码 概述 TCC(Try-Confirm-Cancel)补偿机制是一种事务处理模式,用于确保分布式系统中的操作成功完成或在失败时进行补偿。TCC将一个事务拆分为三个阶段&#xf…

零基础快速上手HarmonyOS ArkTS开发2---ArkTS开发实践

ArkTS开发实践: 接着上一次零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍继续, 在上一次对于ArkTS的基础知识进行了学习,依照官方的课程计划,还有两个具体的小案例需要来实践实践: 实践出…

基于Go语言的HTTP路由设计与实现

在Go语言的世界里,HTTP路由是一种将HTTP请求映射到相应处理函数的技术。通过路由,我们可以确定当用户发送一个HTTP请求时,应该调用哪个函数来处理该请求。在这个过程中,我们可以使用多种方法来实现路由设计,下面我将以…

leetcode——背包问题汇总

本章来汇总一下leetcode中做过的背包问题,包括0-1背包和完全背包。 背包问题的通常形式为:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。求解将哪些物品装入背包里物品价值总和最大。0-1背包和…

040、全卷积

之——FCN 目录 之——FCN 杂谈 正文 1.FCN 2.实现 杂谈 FCN(Fully Convolutional Network)是一种深度学习网络架构,专门设计用于语义分割任务。传统的深度学习网络如卷积神经网络(CNN)在处理图像时通常用于分类…

学生管理系统 数据库版结果 查询student表中所有学生信息

1.创建school_java数据库 CREATE DATABASE schooljava; USE schooljava; CREATE TABLE student ( id INT(11), name VARCHAR(25), tel INT(11), sex VARCHAR(6) ); DESC student; java代码 package Mysql; import java.sql.Connection; import java.sql.DriverManager; imp…

16-高并发-队列术

队列,在数据结构中是一种线性表,从一端插入数据,然后从另一端删除数据。 在我们的系统中,不是所有的处理都必须实时处理,不是所有的请求都必须实时反馈结果给用户,不是所有的请求都必须100%一次性处理成功…