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

文章目录

  • 1. IP的基本概念
    • 1.1 什么是IP协议
    • 1.2 为什么要有IP协议
  • 2. IP的协议格式
  • 3. 网段划分(重要)
    • 3.1 为什么要进行网段划分
    • 3.2 网段划分的规则
      • 3.2.1 古老的划分方案
      • 3.2.2 现代的划分方案
  • 4. 特殊的IP地址
  • 5. 解决IP地址的数量限制问题
  • 6. 私有IP和公网IP
  • 7. 路由及路由表
    • 7.1 数据的路由
    • 7.2 路由表

1. IP的基本概念

1.1 什么是IP协议

IP协议(Internet Protocol)网际互联协议,是属于网络协议栈中的网络层协议

1.2 为什么要有IP协议

在上一节中,我们了解到TCP协议,TCP是用来控制数据在网络传输中的可靠性和传输效率的,因此叫做“传输控制协议”,但是实际上TCP协议并没有发送数据的能力,真正有发送数据的能力的是传输层之下的网络层和数据链路层(IP协议和MAC帧协议)

但是有能力就代表一定能做到么?

答案是否定的,有这个能力只能够表示IP有很大概率能完成这件事情,不代表一定能完成,所以需要在传输层TCP协议控制其稳定高效的将数据跨网络从A主机传输到B主机上。

在刚开始接触网络的时候,我们就已经说了,网络分层的作用是用来解耦,每一层都有每一层需要做的事情,那么对于网络层,需要完成的任务就是**把数据从一台主机交付给另一台主机,也就是数据的路由**

img

虽然在我们日常生活中使用网络的时候,大多数的场景下是连接无线网络(WI-FI),但是实际上在网络通信中,所有的网络都是通过网线进行连接的,只是在我们使用端会进行无线信号转化。还会有一些情况用的是网线连接的,大家肯定看过水晶头

IP的数据路由方式是按照IP地址在一堆路由器中选择下一个路由器,在网络环境中跳来跳去,最终跳到了目的主机

2. IP的协议格式

img

1. 4位版本

在日常使用中经常能看到IP的版本有两种:IPv4和IPv6,这个符号就是用来标识的(IPv4和IPv6不兼容)

2. 4位首部长度

提到协议就一定要考虑如何进行解包和分用,4位首部长度就是用来确定协议报头的长度的,和TCP协议相同,这个4位首部长度的单位是4字节

3. 8位服务类型

3位优先权字段(已经弃用), 4位TOS字段,和1位保留字段(必须置为0)。 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个。 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。

4. 16位总长度(字节数)

整个IP报文的总长度

5. 16位标识

唯一标识主机发送的报文. 如果IP报文大于数据链路层的最大传输单元,导致IP层进行分片, 那么每一个片里面的这个id都是相同的。

6. 3位标志和13位片偏移

3位标志字段: 第一位保留(保留的意思是暂未使用,备用)。第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为0, 其他是1,分片的该位为1说明该分片还不是整体报文的最后一片。

对于禁止分片标志位,如果置1表示禁止分片。该报文经过路上路由器时,若该路由器的最大MTU小于该报文的有效载荷,由于禁止分片标志位置1,路上路由器无法对其进行分片,该报文将会被丢弃。传输层将会超时重传该报文,并选择一条可以满足数据传输的路由通路。(找到较大吞吐量的路)。那么所有的路由器的最大MTU全部设置为1500字节不就好了?其实最大MTU较小的路由器更适合小容量的有效载荷通过,速度较快。

13位分片偏移(framegament offffset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。

7. 8位生存时间(TTL)

报文在网络中“跳来跳去”的话,有可能会出现找不到对应的目的IP的情况,在这种情况下就需要记录一条报文的生存时间(跳数),当跳数累计到一定程度的时候,就认为这个报文无效,然后途中路由器就不会再路由这条报文,直接丢弃

8. 8位协议

我们知道网络层的上层协议是传输层,有UDP和TCP协议,为了区分上层协议是什么,使用8位协议号来标识

9. 16位首部检验和

校验不通过,直接将报文丢弃,TCP有超时重传机制会补发给IP。

10. 32位源IP地址

表示一条报文的最初的发送地址

11. 32位目的IP地址

表示一条报文的目的地址

3. 网段划分(重要)

IP地址 = 网络号 + 主机号

网络号:保证相互连接的两个网段具有不同的标识; (就好像学校里不同的学院有不同的编号)

主机号:在同一网段内,会存在多个不同的主机,通过主机号来标识同一网段的不同主机

3.1 为什么要进行网段划分

互联网中存在非常庞大数量的主机,其中一台主机想要将数据发送到另外一台指定主机,用于查找的消耗非常大,为了方便快速的定位到一台主机,所以将子网进行了划分,然后每次在查找主机的时候按照网段进行划分即可

img

  • 不同网段之间的数据传输依靠路由器,所以如果想要把数据在网络中传输,路由器这种设备应该隶属于两个网段,路由器也是一台主机,它在多个网段都有一个当前网段的IP地址。通常情况下,路由器的子网IP地址是网段标识.1(LAN口),同时路由器也有WAN口表示上层子网的标识
  • 手动管理子网的IP太复杂了,所以一般来说,在一个子网内路由器充当IP的管理者
  • 有一种技术叫做DHCP,能够自动给加入当前子网的设备分配一个不同于当前子网段主机号的IP,一般路由器都带有DHCP功能,所以路由器也可以看作是DHCP服务器

3.2 网段划分的规则

3.2.1 古老的划分方案

把IP地址分为5类

img

  • 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

这种划分方案其实非常的不合理,很少有子网能够使用A类地址,一个子网内很少出现224 个主机,但是B类地址的设计分类就很适合使用,所以大家都想使用B类地址,导致IP地址不够用,所以提出了第二种划分方案

3.2.2 现代的划分方案

提出的新方案叫做CIDR(Classless Interdomain Routing),引入一个**子网掩码(subnet mask)**来区分网络号和主机号

子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;

将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;

网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

img

4. 特殊的IP地址

  • 在一个网段内,如果主机号为0,所对应的就是这个网段IP的网络号

  • 在一个网段内,如果主机号对应的每个二进制位都是1,所对应的就是这个网段的广播地址,用于给同一个链路中相互连接的所有主机发送数据包;

  • 127.*表示的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

5. 解决IP地址的数量限制问题

我们知道,一个IP地址的大小是4个字节,也就死活32个位,最终的IP地址个数最多也就42亿左右,这其中还存在一部分特殊IP地址,所以最终能够用在网络间通信的IP地址就更少了。但是TCP/IP协议规定,每一个参与网络通信的主机都应该有一个IP地址

使用CIDR技术只能够提高IP的利用率,没有办法增加IP地址个数,所以IP地址不够用的问题还是没有解决,但是现在有一些技术能够解决这个问题

  • 动态分配IP地址:只给接入网络的设备分配IP地址,所以每次入网的时候,同一个MAC地址的设备的IP地址不一样
  • NAT技术(后面再详细介绍)
  • IPv6协议:和IPv4是两个协议,并不兼容,采用128位表示一个IP地址,但是目前IPV6还没有普及

6. 私有IP和公网IP

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的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)

路由器的作用

1、数据包转发

2、DHCP功能、组建子网(如配置无线网络。注:局域网是内网IP)

3、NAT功能

数据是如何发送到服务器的?

在这里插入图片描述

(这里借用一下大佬dragon的图)

我们只带路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口(上文中提到过):

其中LAN口(Local Area Network)表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。WAN口(Wide Area Network)表示连接广域网的端口,一般指互联网。我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP

  • 不同的路由器,子网IP实际上都是一样的(一般来说是192.168.1.1)子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买

由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)。

  • 为什么私有IP不能出现在公网中?

不同局域网中主机的IP地址有可能相同,所以没有办法标识一台唯一的主机,如果出现在公网中,就会出现找不到指定的目的IP的情况

但由于IP地址不足的原因,我们不能让主机直接使用公网IP而让主机使用私网IP,因为私网IP可以重复也就意味着我们可以在不同的局域网使用相同的IP地址,缓解了IP的不足

此外,我们不能直接使用公网IP还有一个原因就是,因为我们的数据包必须要经过运营商的路由器,如果我们发送的数据直接到了公网,那也就意味着我们再也不用交网费了,这是不现实的

  • 两个局域网当中的主机不能不跨公网进行通信

两个局域网当中的主机理论上是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得先知道另一台主机的IP地址。即便现在这个主机知道了另一台主机的IP地址,但有可能这两台主机的IP地址是一样的,因为它们的IP地址都是私网IP地址。 当这一台主机发送数据时将目的IP地址填成和自己相同的IP地址,操作系统就会认为这个数据就是要发给自己的,而不会向外进行发送了。

所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。

但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

7. 路由及路由表

7.1 数据的路由

数据路由的过程:

img

路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程。

所谓 “一跳” 就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

IP数据包的传输过程也和问路一样:

  1. 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  2. 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。依次反复, 一直到达目标IP地址;(一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关)
  3. 通过路由表来判定这个数据包应该发送到哪里

7.2 路由表

在Linux下可以使用route指令来查看Linux机器的路由表

image-20240319171932866

  • Destination:目标网络
  • Gateway:下一跳(网关)
  • Genmask:子网掩码
  • Flags:使用状态(U/UG/UGH)
  • Iface:物理接口

若此时有一个目的IP10.0.4.0
1、遍历路由表
2、目的IP & 路由表配置的子网掩码,确定该数据包要去的目标网络
3、将&出来的结果和目标网络(Destination)进行比较
4、在路由器中找到这个目标网络,这个目标网络就是下一跳的目的地。
此时有另一个目的IP202.10.1.2
1、重复上述步骤发现路由表中并没有目标网络
2、那么路由器下一跳的目的地就是该路由器配置的默认网关
3、通过Iface接口发送报文

注:数据报位于不同的路由器中的网络号是不一样的。子网掩码越来越长,说明数据报去往的目标网络越来越具体。

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

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

相关文章

深入浅出Reactor和Proactor模式

Reactor模式和Proactor模式是两种常见的设计模式,用于处理事件驱动的并发编程。它们在处理IO操作时有着不同的工作方式和特点。 对于到来的IO事件(或是其他的信号/定时事件),又有两种事件处理模式: Reactor模式&…

HarmonyOS NEXT应用开发之元素超出List区域

介绍 本示例介绍在List组件内实现子组件超出容器边缘的布局样式的实现方法。 List组件clip属性默认为true,超出容器边缘的子组件会按照List的布局范围被裁剪。为此,可以在List组件内部添加一个占位的ListItem,以达到预期的布局效果。List占…

【项目实践Day06】异步请求与同步请求+Ajax+微信小程序上实现发送异步请求

什么是同步和异步 同步 在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务。也就是一旦调用开始,就必须等待其返回结果,程序的执行顺序和任务排列顺序一致。客户端必须等待服务器端的响应。在等待的期间客…

HTML静态网页成品作业(HTML+CSS)——宠物狗店网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型 生成式人工智能的采用率显着上升。 在 2022 年 OpenAI ChatGPT 推出的推动下,这项新技术在几个月内就积累了超过 1 亿用户,并推动了几乎所有行业的开发活动激增。 到 2023 年,开发人员…

Covalent Network(CQT)借助最大规模的历史与实时 Web3 数据集,推动人工智能的发展

人工智能在众多领域中增强了区块链的实用性,反之亦然,区块链确保了 AI 模型所使用的数据的来源和质量。人工智能带来的生产力提升,将与区块链系统固有的安全性和透明度融合。 Covalent Network(CQT)正位于这两项互补技…

HarmonyOS NEXT应用开发之Navigation实现多设备适配案例

介绍 在应用开发时,一个应用需要适配多终端的设备,使用Navigation的mode属性来实现一套代码,多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

backtrader回测股票:突破20日均线买入,跌破20日均线卖出

数据源:akshare 回测工具:backtrader 策略:突破20日均线买入,跌破20日均线卖出 代码: from datetime import datetime import backtrader as bt #1.9.78.123 import matplotlib.pyplot as plt #3.8.3 import aks…

数据库只追求性能是不够的!

那些成功的数据库公司没有一家是通过性能比竞争对手更快而成功的。 作者:JORDAN TIGANI,DuckDB 公司 MotherDuck 联合创始人&CEO 本文和封面来源:https://motherduck.com/,爱可生开源社区翻译。 本文约 4500 字,预…

论文阅读之AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

文章目录 原文链接主要内容模型图技术细节实验结果 原文链接 AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 主要内容 这篇文章的主要内容是介绍了一种新的计算机视觉模型——Vision Transformer(ViT),这是…

自然语言处理学习总结

目录 1、词表示 2、语言模型(LM) 3、常用学习网址 自然语言处理 1、词表示 词表示:自然语言中最基本的语言单位表示成机器理解的方式 方式一:词与词之间的相似度 方式二:词与词之间的关系 词义的表示方法&…

云手机在海外电商中的应用优势

随着海外市场的不断拓展,电商行业对于高效、安全的工具需求日益增长。在这一背景下,云手机作为一种新型服务,为海外电商提供了强大的支持和便利。云手机对传统物理手机起到了非常好的延展和补充作用,拓展了更广泛的应用场景&#…

RabbitMQ问题

如何实现顺序消费? 消息放入到同一个队列中消费 如何解决消息不丢失? 方案: 如上图:消息丢失有三种情况,解决了以上三种情况就解决了丢失的问题 1、丢失1--->消息在到达交换机的时候;解决&#xff1…

原生html vue3使用element plus 的树tree上移下移案例源码

上效果 html源码 <!DOCTYPE html> <html lang"en"> <!-- * Name: mallSalesReports.html * Description: * Author Lani * date 2024-02-28 18:32:36 --> <head><meta charset"UTF-8"><meta name"viewport" …

docker入门(五)—— 小练习,docker安装nginx、elasticsearch

练习 docker 安装 nginx # 搜素镜像 [rootiZbp15293q8kgzhur7n6kvZ home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx …

【Postrsql】postgresql的介绍、安装和使用

介绍 1.基本信息 PostgreSQL是一个功能强大的开源关系型数据库系统。经过长达15年以上的积极开发和不断改进&#xff0c;PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSQL可以运行在所有主流操作系统上&#xff0c;包括Linux、Unix和Windows…

html5cssjs代码 024 响应式布局示例

html5&css&js代码 024 响应式布局示例 一、代码二、解释 该HTML代码重点在于构建一个带有响应式设计的两栏布局网页&#xff0c;包含页头、导航条、主要内容区&#xff08;左右两列&#xff09;和底部区域&#xff0c;并运用CSS样式设置页面元素的布局、颜色、字体、间…

【Node.js从基础到高级运用】十五、单元测试与集成测试

引言 在Node.js开发过程中&#xff0c;测试是确保代码质量和功能正确性的关键步骤。单元测试和集成测试是最常见的测试类型。下面我们将使用Jest框架来进行测试。 单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证。在Node.js中&#xff0c;这通常指的是函数或者…

HarmonyOS开发:超详细介绍如何开源静态共享包,实现远程依赖

前言 当我们开发了一个独立的功能&#xff0c;想让他人进行使用&#xff0c;一般的方式就是开源出去&#xff0c;有源码的方式&#xff0c;也有文件包的形式&#xff0c;当然了也有远程依赖的方式&#xff0c;比如在Android中&#xff0c;我们可以提供源码&#xff0c;也可以打…

SQLiteC/C++接口详细介绍sqlite3_stmt类(一)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类简介 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;二&#xff09; ​ 序言&#xff1a; 本文开始了SQLite的第二个类的详细介绍…