【网络】网络层(IP协议)

目录

一、基本概念

二、协议头格式

三、网段划分

四、特殊的IP地址

五、IP地址的数量限制

六、私有IP地址和公网IP地址

七、路由


一、基本概念

  •  IP协议:提供一种能力, 将数据从A主机送到B主机,(TCP协议:确保IP协议把数据送到了B主机)。
  •  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模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为 0 ,其他是 1 。类似于一个结束标记。
  •  13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
  •  8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL-= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
  •  8位协议:表示上层协议的类型。
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
  •  32位源地址和32位目标地址:表示发送端和接收端。
  •  选项字段(不定长,最多40字节)

 在网络中,报文要在满足不大于数据链路层MTU的前提下,尽量不要分片。 因为过多的分片容易增加丢包率,而分片丢失,传输层就认为整个报文丢失了。所以就需要让TCP协议发送的数据不要过大,单个报文有效数据的大小不超过 MTU - TCP协议报头大小 - IP协议报头大小,称为MSS(最大段尺寸)。这也是TCP滑动窗口中要把窗口范围内的数据拆成多份发送的原因。

三、网段划分

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

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

  •  不同的子网其实就是把网络号相同的主机放到一起。
  •  如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致。但是主机号必须不能和子网中的其他主机重复。
  •  子网是由路由器构建的,路由器一般都是一个子网中的第一台主机,因此主机标识是1。

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

 那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情。

  •  有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。
  •  一般的路由器都带有DHCP功能。因此路由器也可以看做一个DHCP服务器。

 过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类,如下图所示(该图出 自[TCPIP])。

  • 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

 随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。

  •  例如,申请了一个B类地址,理论上一个子网内能允许6万5千多个主机。A类地址的子网内的主机数更多。
  •  然而实际网络架设中,不会存在一个子网内有这么多的情况。因此大量的IP地址都被浪费掉了。

 针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing):

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
  • 子网掩码也是一个32位的正整数。通常用一串 "0" 来结尾。
  • 将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号。
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。

 可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围。

 IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0

四、特殊的IP地址

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

五、IP地址的数量限制

 我们知道,IP地址(IPv4)是一个4字节32位的正整数。那么一共只有 2的32次方 个IP地址,大概是43亿左右。而TCP/IP协议规定,每个主机都需要有一个IP地址。

 这意味着,一共只有43亿台主机能接入网络么?

 实际上,由于一些特殊的IP地址的存在,数量远不足43亿。另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。

 CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加),仍然不是很够用。这时候有三种方式来解决:

  •  动态分配IP地址:只给接入网络的设备分配IP地址。因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。
  •  NAT技术
  •  IPv6:IPv6并不是IPv4的简单升级版。这是互不相干的两个协议,彼此并不兼容。IPv6用16字节128位来表示一个IP地址。但是目前IPv6还没有普及。

六、私有IP地址和公网IP地址

 如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址:

  • 10.*,前8位是网络号,共16,777,216个地址。
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址。
  • 192.168.*,前16位是网络号,共65,536个地址。
  • 包含在这个范围中的,都成为私有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(Network Address Translation,网络地址转换)。
  •  因为子网的私有IP在向上传递的过程中不断经历着向WAN口IP转换的过程,因此就可以在内网中把LAN口IP设置成IPV6,WAN口继续使用IPV4了。
  •  如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网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路由器根据它的路由表决定下一跳地址

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

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

相关文章

Jmeter函数助手(一)随机字符串(RandomString)

一、目标 实现一个请求单次调用,请求体里多个集合中的相同参数(zxqs)值随机从序列{01、02、03、03、04、05、06、07、08}中取 若使用CSV数据文件、用户参数等参数化手段,单次执行请求,请求体里多个集合中的相同参数&a…

Django实现音乐网站 ⑹

使用Python Django框架制作一个音乐网站, 本篇主要是在添加编辑过程中对后台歌手功能优化及表模型名称修改、模型继承内容。 目录 表模型名称修改 模型继承 创建抽象基类 其他模型继承 更新表结构 歌手新增、编辑优化 表字段名称修改 隐藏单曲数和专辑数 姓…

LAXCUS分布式操作系统引领科技潮流,进入百度首页

信息源自某家网络平台,以下原样摘抄贴出。 随着科技的飞速发展,分布式操作系统做为通用基础平台,为大数据、高性能计算、人工智能提供了强大的数据和算力支持,已经成为了当今计算机领域的研究热点。近日,一款名为LAXCU…

Mysql on duplicate key update用法及优缺点

在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql…

【ASP.NET MVC】使用动软(二)(10)

一、添加动软生成工程 按前文添加动态到工程 双击动软 完成新建数据库服务器后 ,需要关闭重新打开 选择简单三层,注意保存位置 注意切换数据库: 生成后拷贝五个文件夹到工程目录 注意目录结构: 添加四个项目到原来的工程&…

【已解决】安装win7系统,“Windows安装程序无法将Windows配置在此计算机的硬件上运行”

问题: 安装windows7时报错:“Windows安装程序无法将Windows配置在此计算机的硬件上运行” 解决办法: 方法一 shiftF10 调出命令提示行,输入cd oobe 然后再输入msoobe 回车,就可以继续进行下一步了。 如果方法一不…

docker删除容器(步骤详解)

要在Docker中删除容器,需要使用命令docker rm。 下面是详细步骤: 1. 首先,使用docker ps命令查看当前正在运行的容器。这个命令会列出所有正在运行的容器的ID、名称、状态等信息。 如果没有正在运行的容器可以通过docker ps -a 查看当前所…

使用文心一言等智能工具指数级提升嵌入式/物联网(M5Atom/ESP32)和机器人操作系统(ROS1/ROS2)学习研究和开发效率

以M5AtomS3为例,博客撰写效率提升10倍以上: 0. Linux环境Arduino IDE中配置ATOM S3_zhangrelay的博客-CSDN博客 1. M5ATOMS3基础01按键_zhangrelay的博客-CSDN博客 2. M5ATOMS3基础02传感器MPU6886_zhangrelay的博客-CSDN博客 3. M5ATOMS3基础03给RO…

.Net6 Web Core API 配置 Autofac 封装 --- 依赖注入

目录 一、NuGet 包导入 二、Autofac 封装类 三、Autofac 使用 四、案例测试 下列封装 采取程序集注入方法, 单个依赖注入, 也适用, 可<依赖注入>的地方配置 一、NuGet 包导入 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy 二、Auto…

Python元编程-装饰器介绍、使用

目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒&#xff0c;打印时间 方法一&#xff1a;使用datetime 方法二&#xff1a;使用time 一、Python元编程…

百度UEditor编辑器如何关闭抓取远程图片功能

百度UEditor编辑器如何关闭抓取远程图片功能 这个坑娘的功能&#xff0c;开始时居然不知道如何触发&#xff0c;以为有个按钮&#xff0c;点击一下触发&#xff0c;翻阅了文档&#xff0c;没有发现&#xff0c;然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发&a…

JAVA语言:如何自定义类加载器?

本文重点 前面的课程中&#xff0c;我们已经学习了双亲委派机制&#xff0c;如果想要自定义一个类加载器&#xff0c;那么我们只需要继承ClassLoader&#xff0c;并且定义好自己的findClass就可以了&#xff0c;也就是自己的类加载器是如何进行工作的&#xff0c;而loadClass就…

深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测

大家好,我是微学AI,今天给大家介绍一下深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测。随着遥感技术和卫星图像获取能力的快速发展,卫星图像分类任务成为了计算机视觉研究中一个重要的挑战。为了促进这一领域的研究进展,EuroSAT数据集应运而生。本文将详细…

实例031 窗体中的滚动字幕

实例说明 普通窗体中的文字位置都是固定的&#xff0c;一些窗体中需要让文字动起来&#xff0c;例如一些广告性较强的界面中需要做一些滚动的字幕。本例实现了一个具有滚动字幕效果的窗体&#xff0c;运行本例&#xff0c;单击【演示】按钮&#xff0c;看到窗口中的文字开始滚…

vscode 前端开发插件 2023

自己记录 安装vscode后必装插件 chinesegit 必装没啥可说 随时更新 1.CSS Navigation CTRL点击类名可跳转到对应样式位置。 如果是scss less的话。css peak插件无法生效 2.GitLens — Git supercharged 可以看到每一行的git提交记录。 3.Auto Rename Tag 可以同步更新…

第3集丨Vue 江湖 —— Vue中的事件

目录 一、Vue中事件使用二、事件修饰符2.1 prevent2.2 stop2.3 once2.4 capture2.5 self2.6 passive2.7 修饰符连续写2.8 整合案例 三、键盘事件3.1 Vue 中常用的按键别名3.2 key值绑定3.3 系统修饰符键3.4 keyCode绑定3.5 自定义别名3.6 组合键3.7 案例整合 一、Vue中事件使用…

windows docker部署

windows docker部署 使用 Docker Desktop for Windows安装Docker问题&#xff1a;Update the WSL kernel by running "wsl --update" or follow instructions at https://docs.microsoft.com/windows/wsl/wsl2-kernel.问题描述&#xff1a;解决办法&#xff0c;升级W…

软考A计划-系统集成项目管理工程师-信息系统安全管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

前端(十一)——Vue vs. React:两大前端框架的深度对比与分析

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;Vue vs. React&#xff1a;两大前端框架的深度对比与分析 文章目录 前言概述原理与设计思想算法生态系统与社区支持API与语法性能与优化开发体验与工程化对比总结结语 前言 在当今快速发展的前端领…

Jenkins 节点该如何管理?

Jenkins 拥有分布式构建(在 Jenkins 的配置中叫做节点)&#xff0c;分布式构建能够让同一套代码在不同的环境(如&#xff1a;Windows 和 Linux 系统)中编译、测试等 Jenkins 的任务可以分布在不同的节点上运行 节点上需要配置 Java 运行时环境&#xff0c;JDK 版本大于 1.5 节…