网络层(四)

2023-11-16

网络层

我们说过,网络层主要讲的就是ip编址路由选择算法

更准确的说,应该是网际IP协议,网际IP协议主要说明了各个主机和服务器的ip编址规则

了解IP编址前,我们需要知道IP数据报,IP数据报在网络层中传输,我们看一下IP数据报的结构

数据报格式

NdZOYD.png

(1)版本 占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。广泛使用的IP协议版本号为4(即IPv4)。关于IPv6,还处于草案阶段。

(2)首部长度 占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。

(3)区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。

(4)总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。

(5)标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

(6)标志(flag) 占3位,但只有2位有意义。

  • 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
  • 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

(7)片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍。

(8)生存时间 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。后来把TTL字段的功能改为“跳数限制”(但名称不变)。路由器在转发数据报之前就把TTL值减1.若TTL值减少到零,就丢弃这个数据报,不再转发。因此,TTL的单位不再是秒,而是跳数。TTL的意义是指明数据报在网络中至多可经过多少个路由器。显然,数据报在网络上经过的路由器的最大数值是255.若把TTL的初始值设为1,就表示这个数据报只能在本局域网中传送。

(9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。

(10)首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。

(11)源地址 占32位。

(12)目的地址 占32位。

以上信息来自百度百科

数据报分片

当我们的链路的最大传输容量小于数据报的大小时,数据报需要分片,如何实现分片?

  1. 利用片偏移将数据报分片,片偏移以8字节为单位,表示该片(分片后的数据报)的数据是从原数据报的第几个字节开始的
  2. 利用标志表示分片是否结束,如果标志MF=1,表示该片不是最后一片,当MF=0时表示该片是最后一片
  3. 被分片的数据报其源IP地址和目的IP地址这类数据将从原数据报中一样

IPv4

讨论完数据报格式,我们来看一下IP编址,现在广泛使用的是IPv4编址,我们先了解一下IPv4编址

ipv4是32位地址,所以大约有40亿个ip地址,我们现在要考虑的就是如何分配这些地址

为了便于管理,我们更希望将一块地址分配给一个区域,这样寻址的时候会更简单

因此我们引出了子网的概念

为了确定子网,分开主机和路由器的每个接口,从而产生了几个分离的网络岛,端口端接了这些独立的网络的端点,这些独立的网络中的每个都叫做一个子网

比如说给一个子网分配223.1.1.0/24的地址,我们观察一下这个写法,223.1.1就是这个子网里的主机将会拥有的相同前缀,/24表示就是就是子网中的IP地址前24位是相同的,也被称为子网掩码

不太正确的说,子网就是一个许多"接口"具有相同的ip地址前缀的网络

在这里插入图片描述

了解了子网的概念,那我们再来考虑地址分配策略,也就是这个ip地址要怎么分配,我们常有的形式了a.b.c.d/x,这个x就是子网所有的相同前缀的位数,那么剩下的32-x个比特就是由这个组织里的成员所独有的了,结构里的成员也可以再对所分到的ip地址进行再分配形成一个组织

在CIDR被采用之前,IP地址的网络部分(子网掩码)被限制位长度位8,16,24比特,这是一种被称为为分类编址的编址方案,网络部分为8、16、24的网络分别被称为A,B,C类网络,这种编址的缺点在哪,一个C类网络最多只有256-2个地址可以分配,而一个B类网络却有65534个地址,这显然是不合理的,要不就是不够用,要不就是太多浪费了,因此,我们更倾向于一种动态的编址方法

DHCP: 动态主机配置协议

可以想到,其实一个子网并不需要那么多地址,比如说一个图书馆,它虽然能容纳2000人,但是每天最多来的也不到400人,意味着不会由2000人同时需要一个ip地址,那我们没有必要给这个图书馆分配2048个ip地址,只要512个就足够用了,这个动态主机配置协议还有另一个依据就是,现在很多人都是携带便携机到处走的,你要是只给他一个固定的ip地址,那也不太行

这就是DHCP协议要完成的工作,当有一个主机连接到子网时,给他分配一个ip地址,当他离开时,就将该ip地址回收到地址池中

当然,要完成这一工作,显然需要一个DHCP服务器,每一个子网都应该有一个DHCP服务器,如果没有,那就需要一个DHCP中继代理

简单介绍一个DHCP协议的工作原理

  • 首先,一个要连接子网的用户向网络中广播一个DHCP发现报文,广播的方法就是将目的IP地址设为255.255.255.255
  • 附近的子网的DHCP服务器收到该DHCP发现报文,就使用一个DHCP提供报文来响应用户,当然是使用广播的方式
  • 客户的收到DHCP提供报文后,可能会有多个,选择其中一个发送DHCP请求报文
  • DHCP服务器收到请求报文后,发出一个DHCP ACK报文进行相应

网络地址转换

选择我们又要考虑另一个问题了,ip地址不够用怎么办,才40亿个ip地址,全球人口都70亿了,更何况好多人又有电脑又有手机的,这时候就需要网络地址转换了。

其实网络地址转换概念也挺简单的,因为ip地址是唯一的,我们不能有两个相同的ip地址,但是这是全球性的,假如我们将范围限制在一个子网里面,只要我在子网里面,那我用这个ip地址就不会遇到外面相同的ip地址了,不要去外面就可以了,这样所有子网都可以有相同的ip地址

那我现在要跟其他地方的主机通信怎么办,真要把网络局限在子网里,那互联网也没啥意义了,显然,这时候就要用到网络地址转换了,我们都知道,一个子网与外界通信都是经过第一跳路由器转发的,那么我们就可以用这个路由器的ip地址替换掉我们子网里面发送出来的报文的源ip地址,然后在外界看来,这就是一个有路由器发送的报文,接下来只要把相应报文发送还这个路由器就可以了

以上就是网络地址转换的基本概念,利用路由器的ip地址替换掉子网中主机的ip地址

你可能会问,子网中的主机是如何得到ip地址的,而且路由器的ip地址又是如何分配到

两者都是由
DHCP服务器分配的,子网的ip地址由路由器的DHCP服务器分配

你可能还有另外一个问题,路由器是如何将收到的报文准确发送到子网中对应的主机的?

这是由路由器中的NAT转换表完成的,每当一个主机往外界发送报文时,路由器在NAT表中加一个表项,顺便生成一个新的源端口号,然后将其替换掉子网中的报文的源端口号

也就是说,NAT表可以由这个端口号得到子网中主机的ip地址和端口号,然后将其准确的转发到主机上

IPv6

说完IPv4,我们可以了解一下IPv6

首先,为什么会有IPv6的出现,我们前面说的网络地址转换是因为什么才出现的,因为ip地址不够,而且网络地址转换引起的问题就是对P2P程序不友好,P2P程序需要两个程序可以建立TCP连接,但是你这个地址被隐藏在NAT后面,我就没办法建立连接了,当然,针对这个问题,也有相应的解决方案

但是,我们为何不使用一个128位的地址呢,如果地址是128位的,那ip地址就不怕不够用了,而且IPv4支持数据报分片,这对路由器也造成了一定的负担,并且路由器也会对数据报计算校验和,这也对路由器造成了一定的负担,我们希望路由器就单纯的转发ip数据报就可以了,不要管那么多事

出与各种原因,IPv6才会出现,简单来说,IPv6就是为了改进IPv4而诞生的,但是IPv6要如何替换掉IPv4呢,这是非常困难的一件事情,总不能规定一天让全球所有互联网设备停止工作吧,所以IPv6必须是向后兼容的

既然无法替换,那只好让两者同时工作,并逐步废弃IPv4了,注意,我们不能在IPv4使能的路由器中直接传递IPv6数据报,因为两者的数据报格式有一些地方不一样,这些数据会丢失,所以一个简单的方法叫做挖隧道法,就是将整个IPv6数据报放在IPv4数据报的数据内容中,然后IPv6使能的路由器就能提取出其中的IPv6数据报,再进行IPv6数据报的传输,这样就能传输IPv6数据报了

参考:

《计算机网络自顶向下方法》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络层(四) 的相关文章

  • url的讲解

    摘抄博客 什么是URL URL是什么意思 刘宇凡的专栏 CSDN博客 ur是什么意思 什么是URL URL是Uniform Resource Locator的缩写 即统一资源定位系统 也就是我们通常所说的网址 URL是在Internet的W
  • go get: installing executables with ‘go get‘ in module mode is deprecated.

    go get installing executables with go get in module mode is deprecated 问题描述 原因分析 解决方案 参考链接 问题描述 场景描述 执行go get github com
  • 关于CVE-2023-27161 Jellyfin流媒体系统存在SSRF漏洞的学习

    漏洞描述 Jellyfin 直到 v10 7 7 通过组件 Repository 包含服务器端请求伪造 SSRF 此漏洞允许攻击者通过构建的 POST 请求访问网络资源和敏感信息 环境及部署说明 实验环境 Centos 7 试验机器IP地址
  • 诚之和:Python机器学习之逻辑回归

    在机器学习领域中 逻辑回归是一个非常经典的算法 今天小编带来的是一片关于逻辑回归算法的介绍与实现 希望能给各位小伙伴带来一些帮助 一 题目 1 主题 逻辑回归 2 描述 假设你是某大学招生主管 你想根据两次考试的结果决定每个申请者的录取 机
  • 小程序使用mqtt时的问题

    由于业务需求 小程序项目中需使用mqtt 当我像Vue项目一样去使用时却出现了种种问题 归根结底还是因为没有去仔细看文档 因为英文文档实在懒得看 就那么顺其自然的写 结果浪费了一天时间 这里对小程序中使用mqttjs遇到的问题进行总结 mq
  • java获取两个时间之间的所有日期、月份、年份,返回列表

    需求描述 输入开始时间和结束时间 获取时间范围内的所有日期 月份 年份 输入可以为 yyyy MM dd HH mm ss 或者 yyyy MM dd 一 输入开始时间和结束时间 返回时间范围内中的所有日期列表 传入两个时间范围 返回这两个

随机推荐

  • Javascript组件化开发设计思想

    一 引言 项目中经常用web弹层组件 layer 其常见的代码如下 使用的时候很方便 弹窗的宽高 内容 标题 关闭按钮等弹窗的状态我们都可以通过配置参数配置 layer弹层组件用同一套代码来满足不同的弹窗层表现的需求 这便是组件开发的强大之
  • 服务器优化

    Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SYSTEM CurrentControlSet Services Tcpip Parameters 关闭无效网关的检查 当服务
  • 网站搭建学习 ubuntu(20.04) 无法使用ifconfig命令-解决办法

    想在新装好的ubuntu系统上部署django 一开始就遇到了问题 使用ifconfig命令时报错 于是按照提示安装net tools sudo apt install net tools 还是有报错 总之先按照系统提示来 用apt get
  • 如何终止一个无限循环线程和 程序退出时销毁线程

    http zhidao baidu com question 299079849 html android 启动了一个子线程 这个子线程是一个死循环 不成的打印 Hello 现在要实现点击一个Button 让这个子线程终止 用什么方法啊 s
  • 单相逆变器第四课、F28027最小系统绘画

    今天我们说的是F28027最小系统的绘画 其实我暂时还没有规划后面要用到什么引脚 所以我很任性的把所有GPIO引脚都接出去了 呵呵 先给大家上一个整体的图 看着图片是不是比较小 呵呵 没办法 截图最大的了 我晚点会把原理图和PCB上传到下载
  • VMware15中安装Linux详细教程

    VMware15中安装Linux详细教程 一 搭建VMware环境 1 打开链接 https www vmware com cn html 选择适合自己电脑系统的版本进行下载 2 下载完成后点击文件进行安装 安装界面如图 注 1 安装目录尽
  • 信息安全产品认证

    文章目录 一 引言 二 网络关键设备和网络安全专用产品安全认证证书 2 1 背景 2 2 产品目录 2 3 认证依据标准 2 4 认证机构 2 5 商密产品检测认证目录 与 网络关键设备和网络安全专用产品目录 的关系 三 中国国家信息安全产
  • 20个常见的Java错误以及规避方法

    原文 50 Common Java Errors and How to Avoid Them Part 1 作者 Angela Stringfellow 翻译 雁惊寒 译者注 本文介绍了20个常见的Java编译器错误 每种错误都包含了代码片
  • MKP勒索病毒:了解最新变种mkp,以及如何保护您的数据

    导言 在数字化时代 mkp 勒索病毒成为了网络安全领域的一大威胁 它采用高级加密技术 将您的数据文件锁定 要求支付赎金以解锁 本文将详细介绍 mkp 勒索病毒的工作原理 如何恢复被它加密的数据文件 以及如何采取预防措施来降低受攻击的风险 如
  • lambdaQuery用法

    lambdaQuery用法 LambdaQueryWrapper
  • pandas DataFrame行或列的删除方法

    pandas DataFrame的增删查改总结系列文章 pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pandas DataFrame的修改方法 此文我
  • uniapp之微信小程序开发教程及如何合理使用WebSocket(实时监听)+workman聊天系统+linux系统配置阿里云端口

    添加链接描述 添加链接描述 thinphp6 1 workerman文档 添加链接描述 https www kancloud cn manual thinkphp6 0 1147857 workerman手册 https www worke
  • 软件的最低测试方法

    前言 1 1 引言 对于大部分软件系统 如何测试及有效的测试 是一个很头痛的问题 在软件工程上 测试是软件工程中极其重要的一部分 但在具体的实际情况上 无论是时间 人手及资源的调配等原因 使国内大部分软件公司没有进行过理论上的完整的测试 本
  • JAVA变量与数据类型

    人生不如意之事十有八九 在最好的年纪要努力充实自己 莫等空悲切白了少年头 而是要及时当勉励 岁月不待人 一 java变量 变量概述 1 内存中存储的一个存储区域 2 该存储区域内的数据在同一类型范围内不断变化 3 变量是程序中最基本的存储单
  • 老虎证券美股策略——将动量策略日频调仓改成月频

    最近策略频繁回撤 跑不赢标普500指数 所以对策略简单修改 以待后效 新加入的代码 def get if trade day infile open countday dat r incontent infile read infile c
  • Linux系统中负载较高问题排查思路与解决方法

    Load 就是对计算机干活多少的度量 Load Average 就是一段时间 1分钟 5分钟 15分钟 内平均Load linux服务器出现高负载的情况下 一般都有一些具体的症状 比如cpu 内存等被耗尽 磁盘IO或者网络等出现问题 下面通
  • CentOS7下安装LNMP以及phpMyAdmin

    两种安装 第一种 下载 可以到官网找 版本 https www phpmyadmin net downloads cd 到你要下载的位置 wget https files phpmyadmin net phpMyAdmin 4 4 12 p
  • Maven中pom文件内scope标签中import、parent 、dependencies、dependencyManagement详解

    首先介绍parent 如果父项目中有这些依赖
  • linux-sed命令

    目录 1 linux shell sed获取某一段字符串 2 linux shell shell脚本中 sed n取出某一行赋给一个变量 3 linux shell sed查询某一行 1 linux shell sed获取某一段字符串 如果
  • 网络层(四)

    网络层 我们说过 网络层主要讲的就是ip编址和路由选择算法 更准确的说 应该是网际IP协议 网际IP协议主要说明了各个主机和服务器的ip编址规则 了解IP编址前 我们需要知道IP数据报 IP数据报在网络层中传输 我们看一下IP数据报的结构