IP协议和路由转发

文章目录

  • IP协议
    • IP报头
    • 网段划分
      • 特殊的IP
      • 私有IP和公有IP
    • IP分片
  • 路由

IP协议

IP协议提供了一种能力,将数据报从A主机送到B主机,TCP可以保证可靠性,所以TCP/IP协议可以将数据可靠的从A主机送到B主机。

IP报头

在这里插入图片描述
4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4。
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。

标识标志片偏移是为了解决IP分片问题使用的。

8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。

8位协议: 表示上层协议的类型

选项字段最多也是40字节和TCP一样。

IP协议如何进行报头和有效载荷的分离?
4位的首部长度,单位也是4字节,和TCP报头中的4位首部长度是一样的。IP还有16位的总长度 = 报头长度 + 有效载荷。

IP协议如何分用?
32位源地址和32位目标地址: 表示发送端和接收端的IP地址。

网段划分

我们的网络不是凭空产生的,而是有人为我们专门设计的,我们生活中的大部分网络基础设施的建设都是运营商帮我们做的,网络世界是被精心设计过得,如同OS一样。

IP地址一般分为两部分,一部分为网路号,一部分为主机号,所以IP地址 = 网络号 + 主机号。

网络号: 保证相互连接的两个网段具有不同的标识。
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同。

但是,手动管理子网内的IP, 是一个相当麻烦的事情.,因此有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便,一般路由器都有这个服务。

通常情况下,网络划分为五类:
在这里插入图片描述
但是这种划分方案的局限性是很大的,假设申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多,但是在现实中一个子网能用到这么多主机的情况并不多,因此很多的IP地址就会被浪费。针对这个情况,又引入了一个子网掩码的概念,子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号,这样通过子网掩码就可以很好的提高IP地址的使用率。
在这里插入图片描述

在这里插入图片描述
IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围。IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0。

网段划分是什么?
网段划分可以将一个较大的IP地址空间分割成多个较小的、独立的网络段,也就是子网。可以利用子网掩码进行划分,划分可以提高网络的安全性、性能、可管理性和可扩展性。通过合理的网段划分,可以构建更加高效、稳定和安全的网络环境。

特殊的IP

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

私有IP和公有IP

RFC 1918规定了用于组建局域网的私有IP地址。

  1. 10.*,前8位是网络号,共16,777,216个地址
  2. 172.16.到172.31.,前12位是网络号,共1,048,576个地址
  3. 192.168.*,前16位是网络号,共65,536个地址

在这个范围内的都是私有IP,其他的都是公网IP,私有IP对应的就是内网,公网IP对应的就是公网。

一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP),路由器LAN口连接的主机, 都从属于当前这个路由器的子网中,不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了,每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了,子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT。

在这里插入图片描述
从图中可以看到,源IP地址在路由出内网之前源IP是一直在变化的,因为内网IP无法再公网上进行路由。而且如果不变化的话,服务器收到后会存在很多这个ip的主机,不知道回应应该发给谁,所以这样可以保证回应最起码发送给自己和公网连的那个路由器上。
任何一个内网路由器,在转发报文时,都需要将源IP(端口)转化为路由器的WAN口IP。这就是NAT。

真实的网络情况 = 公网 + 私网(家用网络和运营商私网)构建的网络拓扑结构。

IP分片

因为数据链路层对报文是有大小要求的,因此如果IP报文太大,就需要对报文进行分片,分片一定是不好的,因为分片会提高报文丢失的概率,一个报文分成多片,如果丢失一片就算这个报文丢失,所以分片应该成为网络通信中的小概率事件。
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制。以太网帧中的数据长度规定最小46字节,最大1500字节。
在这里插入图片描述
那么如果做到尽量不分片呢?
所以TCP在发送报文时,不能只按照对方的接受能力,直接发送一个大报文,必须根据自己的分片可能性,设置自己数据段的大小。这个数据段的大小一般为1460,成为MSS最大段尺寸。TCP在建立连接的过程中, 通信双方会进行MSS协商。

因为分片,所以IP报头的标识标志片偏移才有了意义,因为分片后的IP报文,都需要IP报头,用来让接收方进行组装。

16位标识:唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。
3为标志:第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1. 类似于一个结束标记.
16位片偏移:是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。

  1. 可以通过报文的相同的标识来收集报文片段。
  2. 可以通过3为标志的最后一位和片偏移来确定是否是分片报文,只有两个都为0才不是分片报文,其他情况都是分片报文。
  3. 我们可以确认收到开头也可以确认收到结尾,中间的通过片偏移来确定是否连续就可以判断是否把报文收齐了。

路由

每一个局域网都会存在自己专属的和局域网的网络号,而路由的过程就是不断的比对网络号进行路由,路由到局域网在根据主机号找到对应的主机,所以IP就提供了将数据包从A主机送到B主机的能力。

路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程.
在这里插入图片描述

  1. 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  2. 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
  3. 依次反复, 一直到达目标IP地址

所以整个网络传输的过程可以看成是一个局域网一个局域网之间的传输。

如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个路由器内部维护一个路由表;
路由表可以使用route命令查看。
如果目的IP命中了路由表, 就直接转发即可;
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。网关就是下一跳的地址。
在这里插入图片描述
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

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

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

相关文章

Java 面试 | Redis

目录 1. 在项目中缓存是如何使用的?2. 为啥在项目中要用缓存?3. 缓存如果使用不当会造成什么后果?4. redis 和 memcached 有什么区别?5. redis 的线程模型是什么?6. 为什么单线程的 redis 比多线程的 memcached 效率要…

android13禁用某个usb设备

总纲 android13 rom 开发总纲说明 目录 1.前言 2.触摸设备查看 3.功能修改 3.1 禁用usb触摸 3.2 禁用usb键盘 3.3 禁用usb遥感 4.查看生效与否 5.彩蛋 1.前言 用户想要禁止使用某些usb设备,需要系统不能使用相关的usb设备,例如usb触摸屏,usb键盘,usb遥感等等usb…

Unity:PC包直接查看Log日志

PC端会输出Log日志,位置在: C:\Users\用户名\AppData\LocalLow\公司名\项目名 在这里可以找到类似的文件: 打开便可以看到打印。

C++ 设计模式(五)——状态模式

状态模式 序言理解源码 序言 设计模式只是一个抽象的设计模式方法,并不是一个固定使用的搭配,就算是普通switch语句,Map,乃至状态机都是状态模式的其中一种实现方法 状态模式看起来好像和策略模式差不多,主要是其的侧…

10道JVM经典面试题

1、 JVM中,new出来的对象是在哪个区? 2、 说说类加载有哪些步骤? 3、 JMM是什么? 4、 说说JVM内存结构? 5、 MinorGC和FullGC有什么区别? 6、 什么是STW? 7、 什么情况下会发生堆/栈溢出&#xff1f…

来参与“向日葵杯”全国教育仿真技术大赛~

可点击进行了解:“向日葵杯”全国教育仿真技术大赛 (sunmooc.cn) 本次大赛共分为四个赛道:自主命题赛道、教育知识图谱设计赛道、FPGA硬件扑克牌对抗赛道、EasyAR元宇宙空间设计赛道。 参赛对象 : 具有正式学籍的在校研究生,本科…

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…

【Mysql】Docker下Mysql8数据备份与恢复

[TOC] 【Mysql】Docker下Mysql8数据备份与恢复 1 创建Mysql容器 格式 docker run -d --name容器名称 -p 宿主端口号:3306 -e MYSQL_ROOT_PASSWORDmysql密码 -e MYSQL_PASSWORDmysql密码 -e TZAsia/Shanghai -v 宿主目录-数据:/var/lib/mysql -v 宿主目录-备份数据:/back…

信息收集Part3-资产监控

Github监控 便于收集整理最新exp或poc 便于发现相关测试目标的资产 各种子域名查询 DNS,备案,证书 全球节点请求cdn 枚举爆破或解析子域名对应 便于发现管理员相关的注册信息 通过Server酱接口接收漏洞信息 https://sct.ftqq.com/ https://github.com/easych…

国内品牌推广全攻略:策略用对,成功翻倍!

在国内,推广品牌的常用策略多种多样,这些策略旨在提高品牌的知名度、美誉度和市场份额。 以下是一些常用的推广品牌策略: 码字不易,如果回答对您有所帮助,请不吝给一个三连哦! 1. 社交媒体营销 策略说明…

计算机网络基础:3.DNS服务器、域名分类

一、DNS服务器 DNS服务器在网络中的作用类似于餐厅中的“顾客座位对照表”,它帮助前台(路由器)将顾客(用户)的请求转发到正确的餐桌(目标设备)。 (1)概念与原理 DNS的基本概念 DNS&…

攻防世界 re新手模式

Reversing-x64Elf-100 64位ida打开 看if语句,根据i的不同,选择不同的数组,后面的2*i/3选择数组中的某一个元素,我们输入的是a1 直接逆向得到就行 二维字符数组写法:前一个是代表有几个字符串,后一个是每…

深入浅出WebRTC—LossBasedBweV2

WebRTC 同时使用基于丢包的带宽估计算法和基于延迟的带宽估计算法那,能够实现更加全面和准确的带宽评估和控制。基于丢包的带宽估计算法主要依据网络中的丢包情况来动态调整带宽估计,以适应网络状况的变化。本文主要讲解最新 LossBasedBweV2 的实现。 1…

linux操作系统之线程

1.线程概念 线程是一个轻量级进程,每一个线程都属于一个进程 进程是操作系统资源分配的最小单位,而线程是CPU任务调度的最小单位 线程是一个任务执行的过程,包括创建,调度,消亡 创建:线程空间位于进程空间,进程中的线程,栈区独立,并共享进程中的数据区,文本区,堆区 调度:宏观…

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

【JavaScript】箭头函数

具体讲解 之前写 this 的指向时就提到过箭头函数,但是由于其比较复杂,还是单独开一篇来讲箭头函数。 箭头函数,箭头函数不能作为构造函数,没有原型 prototype,不能 new。 在箭头函数中,this 关键字指向的是…

刷机维修进阶教程-----何谓“tee损坏” 指纹丢失 掉帧 传感器失效?详细修复步骤教程

TEE损坏指的是安卓机型中Key Attestation密钥认证所依赖的可信应用中的证书库被破坏了。然后拒绝为指纹密匙认证提供服务。加密的密匙由TEE负责管理。tee损坏只影响当前机型的密匙认证。不影响加密。通俗的理解。如果你机型维修或者刷机或者解锁或者格机 全檫除分区等等后有异常…

vue3 + ts 报错:Parsing error: Unexpected token : eslint

报错:Parsing error: Unexpected token : eslint 解决: 在 .eslintrc.json 文件中加入 "parser": "babel/eslint-parser"配置 “parser”: “babel/eslint-parser” 告诉 ESLint 在检查代码之前,先使用 Babel 的解析器…

Chapter17 表面着色器——Shader入门精要学习

Chapter17 表面着色器 一、编译指令1.表面函数2.光照函数3.其他可选参数 二、两个结构体1.Input 结构体:数据来源2.SurfaceOutput 三、Unity背后做了什么四、表面着色器的缺点 一、编译指令 作用:指明该表面着色器的 表面函数 和 光照函数,并…

Google Chrome 浏览器在链接上点右键的快捷键

如今,越来越多的软件都懒得设个快捷键,就算设置了连个下划线也懒得加了。 谷歌浏览器右键 > 链接另存为... 和 复制链接地址 的快捷键 (如图)