IP转发流程

  IP 转发是网络通信中通过中间设备(如路由器或启用了转发功能的主机)将接收到的 IP 数据包根据路由表的指引发送到目标网络的过程。以下是 IP 转发的详细流程及转发过程中各个环节的说明:


IP 转发的流程详解

  1. 数据包到达路由器或主机
    • 链路层:接收端从网卡接收到数据包后,解封装链路层帧,提取 IP 数据包。
    • 检查目的地址:检查 IP 数据包的目标地址,判断是否是本地地址。
      • 如果目标 IP 地址是本地的,交由本地主机的上层协议栈处理。
      • 如果目标地址不是本地地址,进入转发流程。
  2. 查找路由表
    • 使用数据包的目标 IP 地址在设备的路由表中进行匹配。
    • 匹配结果确定:
      • 下一跳地址:转发目标的路由器 IP 地址。
      • 出接口:设备上用于发送数据包的网络接口。
  3. 更新数据包信息
    • TTL 减一
      • 每次转发,IP 数据包的 TTL(Time to Live)字段减一。如果 TTL 减至 0,设备丢弃数据包并向源地址发送 ICMP 超时消息。
    • 重新封装链路层信息
      • 将目标 MAC 地址设置为下一跳设备的 MAC 地址。
  4. 转发数据包
    • 根据路由表的结果,通过指定的出接口,将更新后的数据包发送到下一跳设备。
  5. 重复以上过程,直至数据包到达目标网络
    • 数据包逐跳转发,经过多台路由设备,直到进入目标网络。
    • 当目标 IP 地址属于设备的直连网络时,直接发送到目标主机。

转发过程中的详细说明

1. 接收与检查
  • 网卡接收:设备通过网卡接收链路层帧。
  • 解封装:从链路层帧中提取 IP 数据包。
  • 目的地址检查:对比目标 IP 地址与设备自身的 IP 地址或本地直连子网:
    • 如果匹配,则进入本地处理。
    • 如果不匹配,则继续转发。
2. 路由表匹配
  • 路由表查询:使用最长前缀匹配算法查找目标 IP 地址的最佳匹配。
  • 缺省路由:如果没有更精确的匹配结果,使用缺省路由(如 0.0.0.0/0)转发。
3. 数据包修改
  • TTL 减一:防止数据包在网络中无限循环。
  • 校验和更新:修改后的数据包需要重新计算 IP 校验和,确保传输的完整性。
4. 下一跳与链路层处理
  • ARP 协议查询:获取下一跳设备的 MAC 地址。
  • 链路层封装:封装为链路层帧,设置目标 MAC 地址和源 MAC 地址。
5. 转发与重复
  • 数据包被发送到下一跳设备,该过程在每个路由器或主机上重复,直至到达目标网络。

IP 转发的关键字段

  1. TTL(Time to Live)
    • 每次转发减少 1,用于防止数据包在网络中无限循环。
  2. 目标 IP 地址
    • 决定数据包的传输路径。
  3. IP 头部校验和
    • 在修改 IP 数据包(如更新 TTL)时需要重新计算。

IP 转发示例

假设主机 A(192.168.1.2)向主机 B(10.0.0.5)发送数据包:

  1. 主机 A
    • 检查目标地址不在本地子网,发送数据包到默认网关(路由器)。
  2. 路由器 1
    • 接收数据包,查找路由表,确定下一跳是路由器 2。
    • 更新 TTL 和链路层信息,将数据包发送到路由器 2。
  3. 路由器 2
    • 接收数据包,发现目标 IP 地址在其直连网络中。
    • 更新链路层信息,将数据包直接发送到主机 B。
  4. 主机 B
    • 接收数据包后解封装,交由上层协议栈处理。

常见问题

  1. TTL 超时
    • 数据包在转发过程中 TTL 减为 0,会被丢弃。
  2. 路由表配置错误
    • 如果路由表中缺乏目标地址的匹配,数据包可能被丢弃。
  3. ARP 表不完整
    • 如果下一跳设备的 MAC 地址无法解析,数据包无法发送。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用eclipse构建SpringBoot项目

我这里用eclipse2018版本做演示,大家有需要的可以下载Eclipse Downloads | The Eclipse Foundation 1.打开eclipse,选择存放代码的位置 2.选择 file >> new >> project >> 选择springboot文件下的 spring starter project 2.这里选择N…

uniapp接入BMapGL百度地图

下面代码兼容安卓APP和H5 百度地图官网:控制台 | 百度地图开放平台 应用类别选择《浏览器端》 /utils/map.js 需要设置你自己的key export function myBMapGL1() {return new Promise(function(resolve, reject) {if (typeof window.initMyBMapGL1 function) {r…

绕过CDN寻找真实IP

在新型涉网案件中,我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集,但是现在网站大多都部署了CDN,将资源部署分发到边缘服务器,实现均衡负载,降低网络堵塞,让用户能够更快地访问自…

【计算机网络】网段划分

一、为什么有网段划分 IP地址 网络号(目标网络) 主机号(目标主机) 网络号: 保证相互连接的两个网段具有不同的标识 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号 互联网中的每一台主机,都要隶属于某一个子网 -&…

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件 在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式:页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下&…

基于阿里云服务器部署静态的website

目录 一:创建服务器实例并connect 二:本地文件和服务器share 三:关于IIS服务器的安装预配置 四:设置安全组 五:建站流程 六:关于备案 一:创建服务器实例并connect 创建好的服务器实例在云…

mysql根据日期查询没有的日期也要显示数据

先查询出日期数据(当前日期往前推12个月) select bb.datefrom (select num : num 1,date_format(adddate(date_sub(date_sub(curdate(),interval 12 month),interval 1 month),interval num month), %Y-%m) as datefrom mysql.help_topic,(select num : 0) as twhere addd…

Go语言链接Redis数据库

1.使用go get命令安装go-redis/v8库: 我这里使用的vscode工具安装: go get github.com/go-redis/redis/v82.创建Redis客户端实例 使用以下Go代码连接到Redis服务器并执行命令: package mainimport ("context""fmt"&q…

1-测试go-redis缓存数据

1-测试go-redis缓存数据 1.go-redis缓存数据测试效果 a.测试页面 测试页面:--这里使用 Postman 来做测试 http://127.0.0.1:8000/article/getone/3 http://127.0.0.1:8000/article/getone/4 http://127.0.0.1:8000/article/getone/5b.测试效果 查看终端&#xf…

查看浏览器的请求头

爬虫时用到了请求头,虽然可以用网上公开的,但是还是想了解一下本机浏览器的。以 Edge 为例,其余浏览器通用。 打开浏览器任一网页,按F12打开DevTools;或鼠标右键,选择“检查”。首次打开界面应该显示在网页…

git branch -d 删除分支

Git进行版本控制时,删除分支是常见的操作。特别是当特定的功能开发完成或者分支不再需要时,删除分支可以帮助保持仓库的整洁。删除本地分支和删除远端分支是两个独立的操作。如果需要同时删除本地和远端的分支,需要分别执行以下两个命令。 一…

【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞

漏洞描述 智互联(深圳)科技有限公司SRM智联云采系统针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮助企业实现供应商关系管理和采购线上化、移动化、智能…

[论文阅读] 异常检测 Deep Learning for Anomaly Detection: A Review(三)总结梳理-疑点记录

《深度异常检测综述》总结梳理 目录 一、研究背景与挑战二、深度异常检测方法分类三、实验评估四、结论在这篇文章中,**异常检测的异构性**主要从以下几个方面来理解:如何理解多源数据融合的困难“学习正常性的特征表示”与“用于特征提取的深度学习”在…

linux下i2c开发与框架源码分析

目录 1 概述 2 I2c子系统框架 3 I2C的使用流程 3.1 在驱动里使用 3.2 在应用层使用 3.3 I2ctool的使用 4 为硬件i2c注册一个适配器 5 i2c子系统源码流程分析 5.1 i2c device与driver绑定过程 5.1.1 Driver的注册与处理 5.1.2 Client device的生成 5.2 I2c的发送与接…

学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode

windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置,但是在phpstudy中打开mysql配置文件my.ini后, 通过查找找不到sql_mode或sql-mode, 此时无法在my.ini文件中直接进行修改,可以使用mysql命令进行修改&#…

【大数据学习 | Spark-Core】详解分区个数

RDD默认带有分区的,那么创建完毕rdd以后他的分区数量是多少? 从hdfs读取文件的方式是最正规的方式,我们通过计算原理可以推出blk的个数和分区数量是一致的,本地化计算。 我们可以发现数据的读取使用的是textInputFormat&#xff…

前端常用内容

Style 1. 文本左对齐 style"text-align: left;" 2. 文本居中 style"text-align: center;" 3. 文本右对齐 style"text-align: right;"margin 属性可以设置以下四种类型的外边距: 1. 单一值:为所有四个方向(上、…

免费微调自己的大模型(llama-factory微调llama3.1-8b)

目录 1. 名词/工具解释2. 微调过程3. 总结 本文主要介绍通过llama-factory框架,使用Lora微调方法,微调meta开源的llama3.1-8b模型,平台使用的是趋动云GPU算力资源。 微调已经经过预训练的大模型目的是,通过调整模型参数和不断优化…

pytest日志总结

pytest日志分为两类: 一、终端(控制台)打印的日志 1、指定-s,脚本中print打印出的信息会显示在终端; 2、pytest打印的summary信息,这部分是pytest 的默认输出(例如测试结果PASSED, FAILED, S…

labview关于文件路径的问题

在调用文件或拆分文件的时候经常会用到拆分路径函数和创建路径函数,最常用的也是当前应用程序目录或者是当前VI目录。 这里我们看到应用程序目录和VI目录在同一项目中,应用程序目录更像是根目录,往下拆分成了各个VI的子目录。 接下来我们来拆…