网络原理(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.xdnf.cn/news/144604.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

扣子智能体实战-快速生成公众号爆款标题的智能体

文章目录 一,创建一个智能体二,创建工作流1,开始结点增加一个theme变量2,新增一个大模型节点3,新增一个代码结点4,发布工作流5, 工作流概览 三,增加开场白 如果是做公众号&#xff0…

Linux线程基础

🌎 Linux线程 文章目录: Linux线程 线程概念       线程的理解 再谈地址空间 线程控制       线程等待       线程资源共享       线程退出       线程异常       线程分离       理解线程tid 线程切换 线程…

重修设计模式-设计原则

重修设计模式-设计原则 设计原则 设计原则是软件编码时所遵循的规则,旨在帮助开发者创建出既满足功能需求又易于维护、可扩展且美观的设计,理解设计原则可以提升代码质量、减少错误以及促进团队协作,但对设计原则的理解要灵活,不…

佩戴舒适且适合学生党的蓝牙耳机?分享开放式耳机排行榜前十名

对于追求佩戴舒适的学生党来说,高性价比的开放式耳机是一个不错的选择。因为这类耳机不仅提供了良好的通风性,还减少了长时间佩戴带来的闷热感。而且开放式耳机也通常具有轻巧的设计,能够减轻了耳朵的压力。而且,还需要考虑到学生…

CO82-工單號碼段配置

可以通過CO82查看工單號碼段。 配置工單號碼段: 1、首先配置一個號碼段。 2、將工單類型分配給號碼段。 此時工單類型ZP01號碼段即為41W000000-41W999999 3、可以點擊概覽按鈕,查看概覽。 可以看到不同號碼段下的所有工單類型。 *然後在前台就可以對Z…

怎么测开关电源效率?电源效率标准是多少?

在追求电子产品高性能与低功耗的今天,开关电源的效率成为了衡量其性能的一项重要指标。提高开关电源的效率,对于保障电子设备的稳定性和延长使用寿命具有重要意义。今天将为大家介绍开关电源效率的测试方法以及在不同负载条件下电源的效率标准。 一、开关…

「Netmarble 小镇」活动来了:踏上穿越标志性世界的旅程!

欢迎来到 Netmarble 小镇!本次活动从 9 月 13 日持续到 10 月 11 日,是你们体验 Netmarble 著名游戏世界最精彩内容的入口。在为期一个月的庆祝活动中,你们将体验到独家内容、惊险刺激的挑战和全新人物化身的发布! 探索 Netmarble…

高校宿舍电费管理怎么实现

1引言 在大学的象牙塔里,宿舍不仅是学子们休憩的港湾,更是青春记忆的重要载体。然而,随着科技的发展与生活习惯的改变,宿舍内的电器设备日益增多,电费管理成为了一个不可忽视的问题。本文将从高校宿舍电费管理的现状出…

【AI小项目6】QLoRA针对资源受限设备上的大模型微调和文本分类任务的推理

目录 一、项目简介概述时间主要工作和收获技术栈数据集结果参考 二、训练阶段的完整代码什么是 QLoRA 微调?注意 安装库导入包配置定义一个Config类配置训练参数配置Lora 初始化分词器和模型数据预处理计算模型评估指标交叉验证划分数据集举例: 创建Trai…

mycat双主高可用架构部署-ER表

MySQL5.7服务器IP是192.168.31.209及192.168.31.210 vi /usr/local/mycat/conf/schema.xml <?xml version"1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat"http://io.mycat/"><schema n…

Java通信协议—TCP协议上传文件(完整详解,附有案例+代码)

TCP协议上传文件 文章目录 TCP协议上传文件1.需求2.代码实现 1.需求 客户端&#xff1a;将本地文件上传到服务器。接收服务器的反馈。 服务器&#xff1a;接收客户端上传的文件&#xff0c;上传完毕之后给出反馈。 2.代码实现 public class Server {public static void main(…

fastson与jackson入门

一&#xff0c;简介 json: JavaScript Object Notation, JS对象简谱。 官网&#xff1a;JSON官网 二&#xff0c;使用场景 网络传输 ​ 描述同样的信息&#xff0c;json相比xml占用更少的空间, <?xml version"1.0" encoding"uTF-8"?> <pers…

电气自动化入门03:安全用电

视频链接&#xff1a;2.1 电工知识&#xff1a;触电原因与防触电措施_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW/?p4&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电流对人体的危害 电击&#xff1a;电流通过人体。 电伤&#xff1a;电流热效应…

魅族20机型 M2381“工程固件”作用分析以及写入步骤

在上期的博文中简单说明了工程固件的作用。对于资深玩家来说写入工程固件可以调试参数或者格机 误檫除全分区后的底层修复,但对于一般玩家来说不推荐写入。固件本身的作用是修复与调校。有些操作是不可逆。工程固件实际是用于机型开发到量产中帮助开发人员检查和修复软件中的问…

小米机型“工程固件” 小米13工程资源预览 写入以及nv损坏修复

目前各大品牌机型中。可以录数于小米机型的工程固件最全 最多。这个也由于小米机型的加密机制比较特殊 。每款新机型发布后不久。工程包就会出现。从小米5起始以及红米note4起始都有工程固件。另外在维修行业中。米系机型更换cpu都需要先写入对应的绑定包。然后才可以写入官方m…

Windows如何查看已缓存的DNS信息

Windows server 2016如何查看已缓存的DNS信息 在Windows server 2016系统下&#xff0c;如何查看已缓存的DNS信息呢? 1.打开“运行”&#xff0c;输入cmd&#xff0c;点击“确定” 2.在命令行界面输入ipconfig /displaydns&#xff0c;按回车即可查看已缓存的dns信息

企业如何做好B站信息流广告投放?

B站作为年轻人喜爱的视频分享平台&#xff0c;以其独特的弹幕文化、丰富的视频内容和活跃的社区氛围&#xff0c;成为了众多企业竞相追逐的流量高地。B站信息流广告凭借其精准投放、高互动性和强大的用户粘性&#xff0c;成为了企业实现营销目标的重要渠道。 一、B站信息流广告…

JSONC:为JSON注入注释的力量

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;广泛应用于Web开发、配置文件和数据存储等领域。 其简洁的语法和易于解析的特点&#xff0c;使得JSON成为了现代编程中不可或缺的一部分。然而&#xff0c;JSON的一个显著缺点是…

美创科技唯一入选安全领域数字工程服务商并获“四星”评定!

近日&#xff0c;第二批浙江省数字工程服务商&#xff08;企业数字化转型服务商&#xff09;星级评价结果公布&#xff0c;美创科技入围“四星级-安全-数字工程服务商”。 评审专家对美创科技研发能力、技术与创新能力等6个维度均给予高分评定&#xff0c;数字工程服务商能力分…

Android 车载应用开发指南 - CarService 详解(下)

车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务&#xff0c;车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说&#xff0c;如何将自己的应用程序无缝集成到车载系统中&#xff0c;利用汽车的硬件和服务能力&#xff0c;是一个极具挑战性…