IP协议1.0

news/2024/9/23 22:35:19/

基本概念:

• 主机: 配有IP地址, 但是不进⾏路由控制的设备;
• 路由器: 即配有IP地址, ⼜能进⾏路由控制;
• 节点: 主机和路由器的统称;

IP协议的报头
在这里插入图片描述

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.

4位头部⻓度(header length): IP头部的⻓度是多少个32bit, 也就是 length * 4 的字节数. 4bit表⽰最 ⼤的数字是15, 因此IP头部最⼤⻓度是60字节.
8位服务类型(Type Of Service): 3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置为 0). 4位TOS分别表⽰: 最⼩延时(传输过程中消耗时间最短), 最⼤吞吐量(单位时间内传输数据尽可能多), 最⾼可靠性(降低丢包的概率), 最⼩成本(比较减小系统开销). 这四者相互冲突, 只能选择⼀个.对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最⼤吞吐量⽐较重要.
16位总⻓度(total length): IP数据报整体占多少个字节.
16位标识(id)(用来区分那些数据报要进行合并): 唯⼀的标识主机发送的报⽂. 如果IP报⽂在数据链路层被分⽚了, 那么每⼀个⽚⾥⾯的 这个id都是相同的.
3位标志字段: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1表 ⽰禁⽌分⽚, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表⽰"更多分⽚", 如果分⽚ 了的话, 最后⼀个分⽚置为1, 其他是0. 类似于⼀个结束标记. (第二位是结束标记,当前包就是最后一个需要组包的部分。第三位表述该数据是否触发了拆包效果)
3位分⽚偏移(framegament offset)(若干数据报拼接的先后顺序): 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当前 分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此,除了最后⼀个报⽂之 外, 其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).
8位⽣存时间(Time To Live, TTL): 数据报到达⽬的地的最⼤报⽂跳数. ⼀般是64. 每次经过⼀个路 由, TTL -= 1, ⼀直减到0还没到达, 那么就丢弃了.这个字段主要是⽤来防⽌出现路由循环
8位协议: 表⽰上层协议的类型 >
16位头部校验和: 使⽤CRC进⾏校验, 来鉴别头部是否损坏.
32位源地址和32位⽬标地址: 表⽰发送端和接收端.
选项字段(不定⻓, 最多40字节): 略

IP地址不够用怎么办?
方案一:动态分布IP地址(上网就分配,不上网就不分配)
方案二:NAT机制(网络地址映射``)
首先把IP地址分为两大类

1.私网IP:10.* 172.16-172.31.* 192.168.*
2.公网IP

引入上述私网IP,那么怎么通信呢?

1.同一个局域网内部,设备之间通信
由于同一个局域网内部的IP不能重复,所以此时这些设备都能进行正常的相互交互
2.广域网与广域网之间的通信
由于公网IP的唯一性,所以也可以进行交互
3.局域网1中的设备A尝试连接局域网2中的设备B
不能进行交互
4.局域网设备尝试连接广域网的设备
这个过程通过NAT机制就能进行访问
5.广域网的设备尝试连接局域网的设备
不能进行交互

那么具体内网访问外网IP是怎么实现的呢
在这里插入图片描述

网段划分

IP地址分为两个部分, ⽹络号和主机号

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

不同的⼦⽹其实就是把⽹络号相同的主机放到⼀起.
如果在⼦⽹中新增⼀台主机, 则这台主机的⽹络号和这个⼦⽹的⽹络号⼀致,但是主机号必须不能和⼦⽹中的其他主机重复. 通过合理设置主机号和⽹络号, 就可以保证在相互连接的⽹络中, 每台主机的IP地址都不相同.

那么问题来了, ⼿动管理子网内的IP, 是⼀个相当麻烦的事情.
• 有⼀种技术叫做DHCP, 能够⾃动的给⼦⽹内新增主机节点分配IP地址, 避免了⼿动管理IP的不便.
• ⼀般的路由器都带有DHCP功能. 因此路由器也可以看做⼀个DHCP服务器.

子网掩码

过去曾经提出⼀种划分⽹络号和主机号的⽅案, 把所有IP 地址分为五类, 如下图所⽰。
在这里插入图片描述

随着Internet的⻜速发展,这种划分⽅案的局限性很快显现出来,⼤多数组织都申请B类⽹络地址, 导致B类地址很快就分配完了, ⽽A类却浪费了⼤量地址;
• 例如, 申请了⼀个B类地址, 理论上⼀个⼦⽹内能允许6万5千多个主机. A类地址的⼦⽹内的主机数更多.
• 然⽽实际⽹络架设中, 不会存在⼀个⼦⽹内有这么多的情况. 因此⼤量的IP地址都被浪费掉了.
针对这种情况提出了新的划分⽅案, 称为CIDR(Classless Interdomain Routing):
• 引⼊⼀个额外的⼦⽹掩码(subnet mask)来区分⽹络号和主机号;
• ⼦⽹掩码也是⼀个32位的正整数. 通常⽤⼀串 “0” 来结尾;
• 将IP地址和⼦⽹掩码进⾏ “按位与” 操作, 得到的结果就是⽹络号;
• ⽹络号和主机号的划分与这个IP地址是A类、B类还是C类⽆关;

在这里插入图片描述

• ⼀个路由器可以配置两个IP地址, ⼀个是WAN⼝IP, ⼀个是LAN⼝IP(⼦⽹IP). • 路由器LAN⼝连接的主机, 都从属于当前这个路由器的⼦⽹中.
• 不同的路由器, ⼦⽹IP其实都是⼀样的(通常都是192.168.1.1).⼦⽹内的主机IP地址不能重复. 但是⼦ ⽹之间的IP地址就可以重复了.
• 每⼀个家⽤路由器, 其实⼜作为运营商路由器的⼦⽹中的⼀个节点.这样的运营商路由器可能会有很 多级, 最外层的运营商路由器, WAN⼝IP就是⼀个公⽹IP了.
• ⼦⽹内的主机需要和外⽹进⾏通信时,路由器将IP⾸部中的IP地址进⾏替换(替换成WAN⼝IP), 这样 逐级替换, 最终数据包中的IP地址成为⼀个公⽹IP 这种技术称为NAT(Network Address Translation,⽹络地址转换)
• 如果希望我们⾃⼰实现的服务器程序,能够在公⽹上被访问到, 就需要把程序部署在⼀台具有外⽹IP 的服务器上. 这样的服务器可以在阿⾥云/腾讯云上进⾏购买.

路由选择

在复杂的⽹络结构中, 找出⼀条通往终点的路线;路由的过程, 是⼀跳⼀跳(Hop by Hop) “问路” 的过程.
所谓 “⼀跳” 就是数据链路层中的⼀个区间. 具体在以太⽹中指从源MAC地址到⽬的MAC地址之间的帧传输区间.
IP数据包的传输过程也和问路⼀样.

• 当IP数据包, 到达路由器时, 路由器会先查看⽬的IP;
• 路由器决定这个数据包是能直接发送给⽬标主机, 还是需要发送给下⼀个路由器;
• 依次反复, ⼀直到达⽬标IP地址;
那么如何判定当前这个数据包该发送到哪⾥呢? 这个就依靠每个节点(主机和路由器的统称)内部维护⼀个路由表;

• 路由表可以使⽤route命令查看
• 如果⽬的IP命中了路由表, 就直接转发即可;
• 路由表中的最后⼀⾏,主要由下⼀跳地址和发送接⼝两部分组成,当⽬的地址与路由表中其它⾏都不匹配时,就按缺省路由条⽬规定的接⼝发送到下⼀跳地址。
假设某主机上的⽹络接⼝配置和路由表如下:
在这里插入图片描述

• 这台主机有两个⽹络接⼝,⼀个⽹络接⼝连到192.168.10.0/24⽹络,另⼀个⽹络接⼝连到192.168.56.0/24⽹络;
• 路由表的Destination是⽬的⽹络地址,Genmask是⼦⽹掩码,Gateway是下⼀跳地址,Iface是发送接⼝,Flags中的U标志表⽰此条⽬有效(可以禁⽤某些 条⽬),G标志表⽰此条⽬的下⼀跳地址是某个路由器的地址,没有G标志的条⽬表⽰⽬的⽹络地址是与本机接⼝直接相连的⽹络,不必经路由器转发;转发过程例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路由器根据它的路由表决定下⼀跳地址;

路由表生成算法

路由表可以由⽹络管理员⼿动维护(静态路由), 也可以通过⼀些算法⾃动⽣成(动态路由). 例如距离向量算法, LS算法, Dijkstra算法等.

DNS(domain name system)域名解析系统


http://www.ppmy.cn/news/1467343.html

相关文章

AndroidStudio中debug.keystore的创建和配置使用

1.如果没有debug.keystore,可以按照下面方法创建 首先在C:\Users\Admin\.android路径下打开cmd窗口 之后输入命令:keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 输入两次密码(密码不可见,打码处随便填写没关系) 2.在build…

【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解

目录 引言 一、存储卷 (一)存储卷定义 (二)存储卷的作用 1.数据持久化 2.数据共享 3.解耦 4.灵活性 (三)存储卷的分类 1.emptyDir存储卷 1.1 定义 1.2 特点 1.3 示例 2.hostPath存储卷 2.1 …

React Router v5 和 v6 中,路由对象声明方式有什么区别?

一、在React Router 6.x开始&#xff0c;路由对象的声明需要引用RouteObject。 import { RouteObject } from react-router-dom;const routes: RouteObject[] [{path: /,element: <Home />},{path: /about,element: <About />},// ... ];二、一些老项目使用的是R…

门面模式Api网关(SpringCloudGateway)

1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题&#xff0c;使用Spring Cloud LoadBalance解决了负载均衡的需求&#xff0c;同时借助OpenFeign实现了远程调用。然而&#xff0c;现有的微服务接口都直接对外暴露&#xff0c;容易被外部访问。为保障对外服务的安全…

基于SpringBoot3和JDK17,集成H2数据库和jpa

基于SpringBoot3和JDK17&#xff0c;集成H2数据库和jpa 学会用H2数据库&#xff0c;为了快速写出需要处理数据关系的demo。 文章目录 基于SpringBoot3和JDK17&#xff0c;集成H2数据库和jpa工程配置pom.xml文件application.properties文件 练习H2数据库的操作h2数据库的建表自…

人工智能芯片封装技术及应用趋势分析

简介人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#xff09;和大数据的融合正在开创全新的智能时代&#xff0c;以智能解决方案改变各行各业。人工智能芯片在支持人工智能学习和推理计算方面发挥着非常重要的作用&#xff0c;可实现各行各业的多样化应用。 本…

el-date-picker 选择日期范围只保存左侧日期面板

需求 日期筛选&#xff0c;但限制只能选择同一个月的数据&#xff0c;故此应该去掉右侧月份面板。 实现 主要是通过 css 样式实现&#xff1a; <style> /* 隐藏右边日期面板 */ .el-picker-panel__content.el-date-range-picker__content.is-right .el-date-table, .…

python高级面试题

1. Python 中的 GIL (Global Interpreter Lock) 是什么? 解答: Python 的 GIL 是全局解释器锁,限制了在 CPython 解释器中同时执行多个线程。GIL 确保在任意时刻只有一个线程执行 Python 字节码。这是为了保护访问 Python 对象的内部数据结构免受并发问题的影响。尽管 GIL 会…