网络原理(4)——网络层(IP)、数据链路层

1. IP 协议

基本概念:

主机:配有 IP 地址,但是不进行路由控制的设备

路由器:即配有 IP 地址,又能进行路由控制

节点:主机和路由器的统称

IP 协议报头格式

1) 4 位版本:实际上只有两个取值(4 -> IPv4(主流)、6 -> IPv6)

2) 4 位首部长度:IP 协议报头也是变长的(0 -> 15,实际上报头长度 * 4,例如:当 15 时,报头长度就是 60)

3) 8 位服务类型(TypeOfService):3 位优先权字段(已经弃用),4 位 TOS 字段,1 位保留字段(必须置为 0)

4 位 TOS 分别表示:最小延时,最大吞吐量、最高可靠性、最小成本,这四者相互冲突,只能选择一个,对于 ssh/telnet 这样的应用程序,最小延时比较重要;对于 ftp 这样的程序,最大吞吐量比较重要

最小延时:数据从 A 到 B 的时间消耗最短

最大吞吐量:数据从 A 到 B 单位时间内,传输的数量更多

最高可靠性:IP 协议并不像 TCP 那样有严格的可靠性,但是 IP 的一些机制也会影响到丢包的概率

最小成本:设备上消耗的资源较少


4) 16 位总长度(字节数):IP 数据报的长度,UDP 也是 16 位(2 个字节),但是 IP 并不是和 UDP 一样只能传输 64KB 的数据

IP 协议内置了拆包组包机制,单个 IP 数据报确实没法超过 64KB,但是不代表 IP 协议不能传输超过 64KB 的数据,IP 协议会自动把大的数据包拆成多个 IP 数据包携带数据,到接收方再进行拼装


5) 16 位标识 / 3 位标志 / 13 位片偏移

IP 协议会自动拆包,同一个载荷的数据会被分成多份,交给多个 IP 数据来携带,多个 IP 数据包,16 位标识是相同的数值

13 位片偏移决定组包的时候数据包的位置(网络中存在后发先至)

3 位标志位,只有 2 个有效(剩下一个保留),其中一个表示这个包是否需要组包(是否是拆包的一部分),另一个表示当前包是否是组包中的最后一个单位


tip:面试题:如果像使用 UDP 实现传输超过 64KB 的数据,如何做?

实现方案:参考 IP,应用层编写代码时,引入标识(id),约定标识相同的数据就应该进行组包

引入片偏移,约定组包时数据的先后顺序

引入标志位,区分是否需要组包,标识一个包


6) 8 位生存时间(TTL)一个数据包在网络中最多存活时间,假设构造一个 IP 数据包,目的 IP 写错了,写成不存在的 IP,如果让这样的数据包无限传输,就会消耗很多网络的资源,TTL 约定了传输时间的上限,达到上限之后,数据包就会自动被丢弃掉

TTL 的单位不是 s 或 min,而是 “次数”,指的是经过路由器转发的次数

发送一个 IP 数据包的时候,会有一个初始的 TTL的值(32、64、128...),数据包每次经过一个路由器转发,TTL 就会 -1(经过交换机不减),一旦 TTL 减到 0,此时这个数据包就会被当前的路由器直接丢弃掉

tip:正常情况下,64 这样的 TTL 是非常充裕的(类似于 “六度空间理论”)


7) 8 位协议:IP 数据包中,携带的载荷是哪种传输层协议的数据包

通过这里的不同数值,感知到,接下来要把数据交给 TCP 解析,还是 UDP 解析,或是其他协议解析....(类似于 TCP/UDP 报头中的 “端口号”)


8) 16 位首部检验和:验证数据在传输中是否出错(只针对首部,IP 报头部分),载荷部分 TCP/UDP 都有自己的校验和了


9) 32 位源 IP 地址/32 位目的 IP 地址:IP 数据包中最关键的信息,数据包从哪里来,到哪里去

IP 地址是 32 位的整数,是一个很大的数字,不方便人进行阅读和理解,因此将 32 位(4字节)通过 3 个圆点分隔开,每个部分是一个字节,范围 0~255,称其为 “点分十进制”

IP 地址,用来标识网络上的一个设备,我们期望 IP 地址是唯一的,而 32 位表示的数据范围:0 ~ 42亿9千万,这样的数字放到现在,不一定够用了

为了解决 IP 不够用的问题,有以下方案

方案一:动态分配 IP 地址,一个设备上网就分配,不上网就先不分配

方案二:NAT 网络地址转换,以一当千,使用一个 IP 代表一大波设备

将 IP 地址分成两大类:

1. 内网 IP / 私网 IP(10.*    172.16.* - 172.31.*    192.168.*)(重点!)

2. 外网 IP / 公网 IP

NAT 网络地址转换:一个设备在进行上网的时候,IP 数据包中的 IP 地址就会被 NAT 设备(通常就是路由器)进行自动的修改


网络访问分为以下几种情况

1) 同一个局域网内,主机 A 访问主机 B,不会涉及到 NAT 机制

2) 公网上的设备 A,访问公网上的设备 B,不会涉及到 NAT 机制

3) 一个局域网中的主机 A 访问另一个局域网中的主机 B,NAT 机制中是不允许的

4) 局域网内部的设备 A 访问公网上的设备 B,NAT 机制主要就是针对此情况生效的

在网络通信中,不仅仅只有 IP 信息,还有端口号,端口号本来是区分一个主机上不同的应用程序的,在 NAT 中就可以用于不同主机上不同的应用程序

tip:由于客户端的源端口是操作系统随机分配的空闲端口,那么两台电脑的端口都是 1234 的概率是 1/60000


NTA 机制的缺点:

网络环境太复杂了,在 NTA 替换过程中,每一层路由器都需要维护映射关系,每次转发数据,都需要查询映射关系,这些都是开销


解决方案三:IPv6(从根本上解决 IP 地址不够用的问题)

IPv4 使用 32 位 4 个字节表示 IP 地址;IPv6 使用 128 位 16 个字节表示 IP 地址

16个字节表示的 IP 地址的数量可不是 4 个字节的 IP 地址的 4 倍,他是一个指数关系

2^128 = 2^32 * 2^32 * 2^32 * 2^32,IPv6 的地址空间非常大,足够给地球上的每一粒沙子都分配一个唯一的 IPv6 地址


地址管理、网段划分

IP 地址是一个 32 位整数,将其一分为二,左半部分为网络号,右半部分为主机号

需要通过 “子网掩码” 来区分具体哪些是网络号,哪些是主机号

网络中规定:

同一个局域网中的设备,网络号必须相同,主机号必须不同

两个相邻的局域网中,网络号必须不同

ABCDE  五类网络

除了子网掩码的方案,还有一种 ABCDE  五类网络的方案,不过这是上古时期的网络划分方式了,目前只存在于教科书上了

特殊的 IP 地址

1. 主机号全为 0(二进制)

此时这个 IP 就是表示当前网段(相当于网络号),因此给局域网中的某个设备分配 IP 地址时,不能把主机号设为全 0

2. 主机号全为 1(二进制)

比如子网掩码是 255.255.255.0 的 IP 地址:192.168.0.255(其中主机号 255 就是 1111 1111)

往这个 IP 地址上发送数据包,相当于给整个局域网中所有的设备都发了一次数据包(特殊情况下的特殊解决方案)

平常看到的“业务上的广播”都是通过应用层编写代码来实现的,而不是借助广播 IP,例如:

以 cctalk 为例,cctalk 服务器会维护出很多的 “教室信息”,每个直播间就是一个教室,一个教室里会涉及到很多同学(教室中包含所有同学的数据),此时当直播间的老师进行一段直播时,画面和声音就会发给 cctalk 服务器对应的教室这里,cctalk 服务器就会根据教室中同学的列表(依次遍历每个列表元素),把数据发送过去

真正用到广播 IP 的例子:手机与电视之间投屏,当手机与电视处于同一个局域网时,手机上基于广播 IP 来知道局域网中有多少个设备允许投屏

手机触发投屏按钮的时候,往对应的广播 IP 上发送一个数据包(UDP,TCP 不支持广播,只支持一对一)

如果收到这个数据包的设备不具有投屏功能就无响应

如果收到这个数据包的设备具有投屏功能,就会返回一个响应,告知其是一个什么设备,IP 是多少

3. 127.*

环回 IP(loopback)

自发自收,给这个 IP 发一个数据,设备就会从这个 IP 上再收到同一个数据(自己发给自己)

日常中写的网络通信大多数情况都是为了跨主机通信,在这之前需要先自行测试,一台主机测试自己测客户端和服务器之间能否正常交互,就使用到环回 IP

一般使用的环回 IP 就是 127.0.0.1,虽然其他 127 开头的 IP 也是可以的,但是很少见

简单了解 “路由选择” 的大概流程

网络是复杂的网状结构,从一个节点到另一个节点之间可能存在很多条路线,就类似于生活中的交通网(公路网)

举个例子:假设我们现在要从陕西科技大学(北郊)前往西安邮电大学(南郊),我们可以打开地图软件,它会提供给我们多条线路进行选择

tip:地图软件的线路选择和 IP 协议的路由选择是有本质去别的

在地图软件中,它能够知道路线的全貌,能给我们计算出“最优解”(用时最短、成本最低、最少换乘等等)

而每个路由器无法知道整个网络结构的全貌,只能知道其中的一小部分(每个路由器只知道它附近的设备是怎样的情况),无法得到“最优解”,只能得到“较优解”

路由选择的基本情况和下例类似:

上述问路的过程就和 IP 协议路由选择非常相似,上述的 ABCDE 这几个路人就相当于路由器,每个路由器都不知道整体网络的全貌,但是能够知道其中的一部分

路由表(路由器内部维护的重要的数据结构),路由表类似于 hash 一样,key 相当于 IP 地址(网络号),value 就是对应的网络接口(往哪个方向走)

IP 数据包到达路由器,就需要进行路由表查表操作,查一查 IP 数据包中的目的 IP 在路由表中是否存在,如果查到了,自然按照路由表指向的方向继续转发即可,如果没查到,路由表会有一个“默认的表项”(下一跳)-> 指向了一个更高层的路由器(认识的设备范围更广),这个路由器也可能查不到,也有下一跳 -> 更高层的路由器(认识的设备范围更更广)

上述讨论的过程是一个直观的认识流程,真实的转发过程更加复杂

2. 数据链路层

以太网帧格式

mac 地址和 IP 地址的区别

1. mac 地址使用 6 个字节表示;IP 地址使用 4 个字节表示

空间比 IP 地址大了 6w 多倍,mac 地址当前仍然可以给每个设备都分配一个唯一的 mac 地址值,一般一个网卡在出场的时候 mac 地址就被分配好了,写死了(不能改),因此 mac 地址可以作为设备的身份标识

2. mac 地址使用在数据链路层,用来实现两个设备之间的数据转发(微观)

IP 地址使用在网络层,立足于整个转发流程,进行路径规划(宏观)

理论上说,搞一套地址也能完成宏观和微观层次上的所有工作,IP 地址和 mac 地址留一组就可以了,但实际上两个都留下了,并且分配了不同的任务(不是技术问题,而是历史遗留问题)

ARP 协议

ARP 数据包 / ARP 协议,可以视为是让当前设备获取到周围设备 IP 地址和 mac 地址之间的映射关系

在 IP 协议路由转发的过程中,都是拿着 IP 地址来进行查路由表的,由此得到的是 “网络接口”(是一个抽象的概念),想要得到更具体的(要传输给哪个 mac 地址的设备),就涉及到当前 IP 地址对应到哪个 mac 地址的设备

当前设备接入网络的时候,就会往广播地址发送 ARP 报文,收到 ARP 请求的设备就会返回 ARP 响应,响应中就会告知自己的 IP 和 mac

RARP 则是反其道而行之,用来建立 mac 地址和 IP 地址之间的映射关系

MTU

将数组链路层数据帧的最大载荷长度 1500 字节称为 MTU,其和硬件直接相关,不同的硬件设备,对应到了不同的数据链路层协议,对应到了不同的 MTU

以太网的 MTU 就是很短的(1.5kb),IP /UDP 至少还是 64kb,因此此处的 MTU 限制,就会对上层协议产生直接影响

IP 协议之所以拆包组包,更多就是为了应对 MTU 的限制,当一个 IP 数据包达到 1500 以上的时候,就会自动拆包了


mac 地址在网络传输中变化的例子:

现假设要从西安到吉林省白城市安广镇感受八百里瀚海,会有以下规划:

3. 重要应用层协议 DNS(Domain Name System)

DNS 是一整套从域名映射到 IP 的系统

在网络中,虽然把 IP 写作点分十进制,但仍然对人类不友好,于是开始使用单词字符串来表示 IP 地址,称为域名

域名和 IP 地址存在对应关系,但是二者都不是一一对应关系

将域名转换为 IP 地址的一套系统就是“域名解析系统(DNS)”

早期的域名解析系统非常简单,仅仅通过一个文件来实现(hosts)

虽然仍然有效,但已经不使用了,因为网站太多了,域名很多,IP 地址很多,靠文件来维护不现实,不方便

为了解决上述问题,搭建了 DNS 服务器,把 hosts 文件放到 DNS 服务器里,当某个电脑需要进行域名解析时,直接访问 DNS 服务器

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

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

相关文章

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况,而本道题是出现两个单身狗的情况。根据一个数…

9.C++程序中的选择语句

选择语句一共分为两种:条件语句和开关语句 其中条件语句叫if语句,常见的形式为:if ... else ... ; 再复杂一些为if... else if ... else ... ; 开关语句又叫switch语句,类型于开关的使用形式常见的有 switch (var) case : ... b…

tauri中加载本地文件图片或者下载网络文件图片后存储到本地,然后通过前端页面展示

有一个需求是需要将本地上传的文件或者网络下载的文件存储到本地,并展示在前端页面上的。其实如果只是加载本地文件,然后展示还是挺简单的,可以看我的文章:tauri程序加载本地图片或者文件在前端页面展示-CSDN博客 要想实现上述需…

JS 历史简介

目录 1. JS 历史简介 2. JS 技术特征 1. JS 历史简介 举例:在提交用户的注册信息的时候,为避免注册出现错误后重新填写信息,可以在写完一栏信息后进行校验,并提示是否出现错误,这样会大大提高用户提交的成功率&…

gradle镜像配置

当我们在Android Studio中新建项目或者打开已有项目时,会下载gradle文件,当使用官方的下载源时很慢,经常会下载失败,国内我们可以使用腾讯或者阿里的镜像,一般下载速度很快。 一、gradle下载地址 官网地址&#xff1…

C语言指针系列2——加深理解

大家,今天讲的知识点是一块儿一块儿的,所以大家要好好学习喔~ 话不多说,开始正题 关键字:const (三种用法) 1. int* const p; 2. int const* p; 3. const int* const p; 首先我们要了解一下const&#xff…

【计算机组成原理】实验一:运算器输入锁存器数据写实验

目录 实验要求 实验目的 主要集成电路芯片及其逻辑功能 实验原理 实验内容及步骤 实验内容 思考题 实验要求 利用CP226实验箱上的K16~K23二进制拨动开关作为DBUS数据输入端,其它开关作为控制信号的输入端,将通过K16~K23设定…

【学习笔记】SSL/TLS证书安全机制之证书透明

1、概念 CT - Certificate Transparency,证书透明 2、Trying to Solve 如果意外的 CA 为我们的域名颁发证书,我们是不可见,这就是证书透明(CT)要解决的问题 3、How CT Works 任何CA机构颁发的所有证书的公共登记处&…

西门子1200PLC模拟量指令读出来的值好像不太对劲的样子

问题:模拟量指令读出来的值好像不太对劲的样子 各位高手看看,是不是哪里错了,传感器4-20ma的规格,我取值0-27648,我要换算成N,后面范围是0-200,但是值为什么都是小数点啊,而且和实际的压力怎么看…

使用宝塔部署项目在win上

项目部署 注意: 前后端部署项目,需要两个域名(二级域名,就是主域名结尾的域名,需要在主域名下添加就可以了),前端一个,后端一个 思路:访问域名就会浏览器会加载前端的代…

VMware虚拟机Centos操作系统——配置docker,运行本地打包的镜像,进入conda环境(vmware,docker新手小白)

1.docker-centos运行sudo yum install -y yum-utils报错 遇到问题 解决: 进入/etc/yum.repos.d目录下找到 CentOS-Base.repo,执行下面两个命令: cp CentOS-Base.repo CentOS-Base.repo.backupvi CentOS-Base.repo 进入后改成&#x…

恶意Bot流量识别分析实践

1、摘要 随着互联网的发展,自动化工具和脚本(Bots)的使用越来越普遍。虽然一些善意 Bots 对于网站的正常运行和数据采集至关重要,但恶意 Bots 可能会对网站带来负面影响,如爬取敏感信息、恶意注册、刷流量等。因此&am…

11. Map和Set

一、二叉搜索树 1. 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根…

基于JAVA+SpringBoot+Vue的健身房管理系统1

基于JAVASpringBootVue的健身房管理系统1 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽…

阿里云kafka消息写入topic失败

1. 问题现象描述 20240918,14:22,测试反馈说kafka有问题,生产者写入消息的时候报错,并发了一张日志截图,主要报错如下: to topic xxxx: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for x…

Flutter为Android添加签名并打包

前言 我们需要将App进行数字签名才能发布到商店里。在这里就具体描述一下如果给App添加签名 为App签名 创建一个用户上传的秘钥库 如果你已经有一个秘钥库了,可以直接跳到下一步,如果没有则按照下面的指令创建一个 keytool 可能不在我们的系统路径中…

客户端数页面异步填充器-———未来之窗行业应用跨平台架构

一、创生 在前端代码的神秘世界里,jq赋值渲染方法曾被视为法宝。然而,随着数据量增大和应用复杂,它的缺点逐渐显现。 在大数据量的激战中,逐个用 val() 赋值会导致性能骤降,频繁操作 DOM 时,页面重绘和重排…

论文复现我能行:Dynamic Movement Primitives: Volumetric Obstacle Avoidance

一、论文介绍 论文题目:《Dynamic Movement Primitives: Volumetric Obstacle Avoidance Using Dynamic Potential Functions》,Journal of Intelligent & Robotic Systems 该论文在2019年ICRA《Dynamic Movement Primitives: Volumetric Obstacle…

即插即用篇 | DenseNet卷土重来! YOLOv8 引入全新密集连接卷积网络 | ECCV 2024

本改进已同步到YOLO-Magic框架! 本文重新审视了密集连接卷积网络(DenseNets),并揭示了其在主流的ResNet风格架构中被低估的有效性。我们认为,由于未触及的训练方法和传统设计元素没有完全展现其能力,DenseNets的潜力被忽视了。我们的初步研究表明,通过连接实现的密集连接…

R语言中的shiny框架

R语言中的shiny框架 Shiny 的基本概念基本用法示例常见用法示例1. 输入控件2. 输出控件3. 动态 UI4. 数据传递和反应式编程 高级功能1. 使用 shinyjs2. 使用 shinythemes Shiny 是一个 R 语言的框架,用于构建交互式的网页应用,可以让用户以最少的 HTML、…