一、前言
本系列文章旨在复习计算机网络核心知识,进一步夯实基础,为以后 参与物联网、音视频、直播、即时通讯等领域的项目做一定的知识储备。
文章列表:
- 01-📝计算机网络核心知识|计算机网络通识【计算机网络性能指标、网络协议分层的几种方式、OSI七层模型概念通识】
- 02-📝计算机网络核心知识|【搭建调试环境、新建Java项目、计算机通信基础、计算机连接方式、集线器/网桥/交换机/路由器】
- 03-📝计算机网络核心知识|【MAC地址、IP地址的组成、IP地址的分类、CIDR、子网掩码、超网】
- 04-📝计算机网络核心知识|【 静态路由、动态路由、数据包的传输、ISP、服务器机房、网络分类、家用无线路由器、公网IP、
- 05-📝计算机网络核心知识|物理层/数据链路层【模拟信号&&数字信号、数据链路层】
- 06-📝计算机网络核心知识|网络层【IP数据包Packet、网络协议、Checksum、源IP地址和目标IP地址、ping】
- 07-计算机网络协议核心知识|【传输层-UDP】
- 08-计算机网络协议核心知识|【传输层-TCP之可靠传输】
- 09-📝计算机网络核心知识|传输层TCP2【流量控制原理、拥塞控制:slow start、congestion avoidance、快速重传、快速恢复】
- 10-计算机网络协议核心知识|【传输层-TCP连接】
- 11-计算机网络协议核心知识|【 应用层】
- 12-📝计算机网络核心知识|【Cookie、Session(概念、生命周期、有效期、浏览器的要求等)、跨域(概念、 同源策略、跨域解决方
- 13-计算机网络协议核心知识|【 代理/CDN/网络安全】
- 14-计算机网络协议核心知识|【(非)对称加密/数字签名/证书】
- 15-计算机网络协议核心知识|【HTTPS】
- 16-📝计算机网络核心知识|HTTPS协议【HTTP2、HTTP3】 本文主要关注:MAC/IP/子网掩码在网络中非常重要,只要有网络的地方必然都会涉及这三个概念。
二、MAC
每一个网卡都有一个6字节(48bit)的MAC地址(Media Access Control)。
-
全球唯一,固化在了网卡的ROM中,由IEEE802标准规定
- 前3个字节:OUI(Organizationally Unique Identifier),组织唯一标识符,由IEEE的注册管理机构分配给厂商
- 后三个字节:网络接口标识符,由厂商自行分配
-
OUI查询
1. MAC地址的表示格式
- Windows
- 32-06-52-3C-4F-2E
- Linux、Android、Mac、iOS
- 32:06:52:3C:4F:2E
- Packet Tracer
- 3206.523C.4F2E
- 当48位全为1时,代表广播地址(给同一个网段的所有设备)
- FF-FF-FF-FF-FF-FF
2. MAC地址操作
查看MAC地址(终端):
- Windows:
ipconfig - Linux/Mac:
ifconfig
有时可以通过修改MAC地址达到上网的目的(有些公司的内网路由器设定了MAC地址白名单,我司就是这样,手机都无法连接无线)。
3. MAC地址的获取
当不知道对方主机的MAC地址时,可以通过发送ARP广播获取对方的MAC地址
- 获取成功后,会缓存IP地址、MAC地址的映射信息,俗称:ARP缓存
- 通过ARP广播获取的MAC地址,属于动态(dynamic)缓存。存储时间比较短(默认2分钟),过期会自动删除。
当找不到对应MAC地址时会再次发送ARP广播,所以不需要担心更换网卡后无法上网的问题。
相关命令:
arp -a [主机地址]:查询ARP缓存arp -d [主机地址]:删除ARP缓存arp -s [主机地址] [MAC地址]:增加一条缓存信息(这是静态缓存,存储时间比较久,不同系统的存储时间不同)
三、IP
IP地址(Internet Protocol):互联网上的每一个主机都有一个IP地址
最初是IPv4版本,32bit(4字节),2019年11月25日,全球的IP地址已经用完。后面推出了IPv6版本,128bit(16字节)。
1. IP地址的组成
IP地址由2部分组成:网络标识(网络ID)、主机标识(主机ID) 同一网段的计算机,网络ID相同
通过子网掩码(subnet mask)可以计算出网络ID:IP地址 & 子网掩码
按位与(&)计算技巧:遇1就是原来的,遇0就是0。
案例一:
IP地址:192.168.1.10
子网掩码:255.255.255.0
计算网段:
1100 0000.1010 1000.0000 0001.0000 1010 -> 192.168.1.10(10进制)
&
1111 1111.1111 1111.1111 1111.0000 0000 -> 255.255.255.0(10进制)
--------------------------------------------------------------
= 1100 0000.1010 1000.0000 0001.0000 0000 -> 192.168.1.0(10进制)
192.168.1 代表网络ID,后面一部分代表主机ID。
案例二:
IP地址:192.168.1.10
子网掩码:255.255.0.0
计算网段:
1100 0000.1010 1000.0000 0001.0000 1010 -> 192.168.1.10(10进制)
&
1111 1111.1111 1111.0000 0000.0000 0000 -> 255.255.0.0(10进制)
--------------------------------------------------------------
= 1100 0000.1010 1000.0000 0000.0000 0000 -> 192.168.0.0(10进制)
192.168 代表网络ID,后面两部分位代表主机ID。
注意:主机ID要去除全0和全255,因为0代表网段(例:192.168.0.0),255代表广播地址(例:192.168.255.255)。
计算机和其他计算机通信前,会先判断目标主机和自己是否在同一网段
- 同一网段:不需要由路由器进行转发
- 不同网段:交由路由器进行转发
2. IP地址的分类
2.1. A类地址:默认子网掩码是255.0.0.0
网络ID:
0不能用,127作为保留网段。其中127.0.0.1是本地环回地址(Loopback),代表本机地址。- 所以,可以分配给主机的,第1部分的取值范围是:
1~126
主机ID:
- 第2、3、4部分的取值范围是:
0~255 - 每个A类网络能容纳的最大主机数是:
256 * 256 * 256 - 2 = 2的24次方 - 2 = 16777214
2.2. B类地址:默认子网掩码是255.255.0.0
网络ID:
- 可以分配给主机的
- 第1部分的取值范围是:
128~191 - 第2部分的取值范围是:
0~255主机ID:
- 第1部分的取值范围是:
- 第3、4部分的取值范围是:
0~255 - 每个B类网络能容纳的最大主机数是:
256 * 256 - 2 = 2的16次方 - 2 = 65534
2.3. C类地址:默认子网掩码是255.255.255.0
网络ID:
- 可以分配给主机的
- 第1部分的取值范围是:
192~223 - 第2、3部分的取值范围是:
0~255
- 第1部分的取值范围是:
主机ID:
- 第4部分的取值范围是:
0~255 - 每个C类网络能容纳的最大主机数是:
256 - 2 = 2的8次方 - 2 = 254
2.4. D类地址:以1110开头,多播地址
D类地址没有子网掩码,用于多播(组播)地址。
第1部分取值范围是:224~239。
2.5. E类地址:以1111开头,保留为今后使用
E类地址保留为今后使用。
第1部分取值范围是:240~255。
只有A/B/C类地址才能分配给主机。
- 主机ID为全0,表示主机所在的网段
- 主机ID为全1,表示主机所在网段的全部主机(广播)
- 可以尝试用ping给某个网段的全部主机发数据
四、子网掩码
1. CIDR
CIDR(Classless Inter-Domain Routing):无类别域间路由。
子网掩码的CIDR表示方法:
192.168.1.100/24,代表子网掩码有24个1,也就是255.255.255.0123.210.100.200/16,代表子网掩码有16个1,也就是255.255.0.0
计算工具:www.sojson.com/convert/sub…
2. 子网划分
为什么要进行子网划分?
如果需要让200台主机在同一个网段内,可以分配一个C类网段,比如192.168.1.0/24。
- 共254个可用IP地址:
192.168.1.1 ~ 192.168.1.254 - 多出54个空闲的IP地址(这种情况并不算浪费资源)
如果需要让500台主机在同一个网段内,那就分配一个B类网段,比如191.100.0.0/16。
- 共65534个可用IP地址:
191.100.0.1 ~ 191.100.255.254 - 多出65034个空闲的IP地址(这种情况属于极大的浪费资源)
如何尽量避免浪费IP地址资源?合理进行子网划分。
子网划分:借用主机位做子网位,划分出多个子网。
- 可分为:
- 等长子网划分: 将一个网段等分成多个子网,每个子网的可用IP地址数量是一样的。
- 比如
172.16.0.0/16划分4个子网段,每个段可用IP地址就是6553个。
- 比如
- 变长子网划分: 每个子网的可用IP地址数量可以是不一样的。
- 比如
191.100.0.0/16划分3个子网段,第1段给512个IP地址,第2段给2048个IP地址,剩余的给最后一个网段。
- 比如
- 等长子网划分: 将一个网段等分成多个子网,每个子网的可用IP地址数量是一样的。
子网划分器:www.ab126.com/web/3552.ht…
子网划分的步骤:
- 确定子网的子网掩码长度
- 确定子网中第1个、最后1个主机可用的IP地址
2.1. 等长子网划分
等分成2个子网:
A子网:
- 网段:
192.168.0.0 - 子网掩码:
255.255.255.128/25 - 广播:
192.168.0.127 - 主机范围:
192.168.0.1 ~ 192.168.0.126
B子网:
- 网段:
192.168.0.128 - 子网掩码:
255.255.255.128/25 - 广播:
192.168.0.255 - 主机范围:
192.168.0.129 ~ 192.168.0.254
等分成4个子网:
A子网:
- 网段:
192.168.0.0 - 子网掩码:
255.255.255.192/26 - 广播:
192.168.0.63 - 主机范围:
192.168.0.1 ~ 192.168.0.62
B子网:
- 网段:
192.168.0.64 - 子网掩码:
255.255.255.192/26 - 广播:
192.168.0.127 - 主机范围:
192.168.0.65 ~ 192.168.0.126
C子网:
- 网段:
192.168.0.128 - 子网掩码:
255.255.255.192/26 - 广播:
192.168.0.191 - 主机范围:
192.168.0.129 ~ 192.168.0.190
D子网:
- 网段:
192.168.0.192 - 子网掩码:
255.255.255.192/26 - 广播:
192.168.0.255 - 主机范围:
192.168.0.193 ~ 192.168.0.254
B类子网划分:
A类子网划分:
规律:要将子网等分为
2^n个更小的子网,则子网掩码在原来基础上右移n位。
思考:下面两台设备是否能够正常通信?
答案:不能,因为不在同一个网段,计算机0的网段是192.168.0.0,计算机1的网段是192.168.0.128。要想让这两台设备进行通信,需要添加一个路由器即可。
2.2. 变长子网划分
如果一个子网地址块的长度是原网段的(1/2)^n,那么
- 子网的子网掩码,就是在原网段的子网掩码基础上增加n个1
- 不等长的子网,它们的子网掩码也不同
假设上图是对192.168.0.0/24进行变长子网划分 C网段:子网掩码是255.255.255.128/25 B网段:子网掩码是255.255.255.192/26 A网段:子网掩码是255.255.255.224/27 D网段:子网掩码是255.255.255.252/30 E网段:子网掩码是255.255.255.252/30
思考:下面两台设备是否能够正常通信?
答案:不能,因为不在同一个网段,计算机0的网段是192.168.0.0,计算机1的网段是192.168.10.0。要想让这两台设备进行通信,需要添加一个路由器即可。
分析:计算机0和计算机1通信时,只有计算机1的IP地址,没有计算机1的子网掩码,最终是拿着对方的IP地址和自己的子网掩码按位与计算出的网段,所以计算机1的网段是192.168.10.0,和计算机0不在同一个网段,也就无法进行通信。如果是计算机1和计算机0进行通信,两台设备的IP和计算机1的子网掩码按位与计算后网段都是192.168.0.0,可以向计算机0发送消息,但由于计算机0计算和计算机1不在同一个网段,计算机0就无法向计算机1回复消息,所以无法正常通信。
注意:IP地址的分类是看IP地址的第一部分属于哪一类的范围,子网掩码和IP地址分类没有任何关系。子网划分只能是2的指数。
3. 超网
超网:跟子网反过来,它是将多个连续的网段合并成一个更大的网段。
3.1. 合并2个网段
把网络部分划分出来给主机使用。上图划分后主机位后,192.168.0.0和192.168.1.0的网段都是192.168.0.0,并且由于主机位高位增加了1位,所以主机数比之前多了一倍(具体还是要减2的---去除网段和广播地址)。
需求:原来有200台计算机使用192.168.0.0/24网段,现在希望增加200台设备到同一个网段。
- 200台在
192.168.0.0/24网段,200台在192.168.1.0/24网段 - 合并
192.168.0.0/24、192.168.1.0/24为一个网段:192.168.0.0/23(子网掩码往左移动1位)
思考:192.168.0.255/23这个IP地址可以分配给计算机使用么?
答案:可以。因为主机部分实际是9位,此时主机位高位是0,并不是全部为1,因此这个IP地址不是广播地址,最终是可以分配给计算机使用的。如果把主机部分的高位变为1,实际的IP地址就是192.168.1.255/23(广播地址),这时候就不能分配给计算机使用了。
3.2. 合并4个网段
子网掩码向左移动2位,可以合并4个网段。
将192.168.0.0/24、192.168.1.0/24、192.168.2.0/24、192.168.3.0/24合并为192.168.0.0/22网段。
思考:下面的2个网段,能通过子网掩码向左移动1位进行合并么?
答案:不可以。因为192.168.2.0要想和192.168.1.0合并为同一个网段,必须向左移动两位才可以。
3.3. 合并网段的规律
假设n是2的k次幂(k≥1)
- 子网掩码左移k位将能够合并n个网段
- 如果第一个网段的网络号能被n整除,那么由它开始连续的n个网段,能通过左移k位子网掩码进行合并
比如:
- 第一个网段的网络号以二进制0结尾,那么由它开始连续的2个网段,能通过左移1位子网掩码进行合并
- 第一个网段的网络号以二进制00结尾,那么由它开始连续的4个网段,能通过左移2位子网掩码进行合并
0 192.168.0.0/24 192.168.0000 00|0|0.0
1 192.168.1.0/24 192.168.0000 00|0|1.0
2 192.168.2.0/24 192.168.0000 00|1|0.0
3 192.168.3.0/24 192.168.0000 00|1|1.0
// 上面就很容易看出,1和2左移1位是不能合并到同一个网段的。
// 左移1位,0和1可以合并,2和3可以合并。左移2位,0到3可以合并。
一旦使用超网,其实就没有必要划分地址分类了。当然具体还是根据需求进行定制。
4. 判断一个网段是子网还是超网
- 首先
- 看该网段的类型(IP地址分类)
- 默认情况下,A类子网掩码的位数是8(
255.0.0.0),B类子网掩码的位数是16(255.255.0.0),C类子网掩码的位数是24(255.255.255.0)
- 然后
- 如果该网段的子网掩码位数比默认子网掩码多,就是子网
- 如果该网段的子网掩码位数比默认子网掩码少,就是超网
例:
25.100.0.0/16是一个A类子网;200.100.0.0/16是一个C类超网。
专题系列文章
1. 前知识
- 01-探究iOS底层原理|综述
- 02-探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探究iOS底层原理|LLDB
- 04-探究iOS底层原理|ARM64汇编
2. 基于OC语言探索iOS底层原理
- 05-探究iOS底层原理|OC的本质
- 06-探究iOS底层原理|OC对象的本质
- 07-探究iOS底层原理|几种OC对象【实例对象、类对象、元类】、对象的isa指针、superclass、对象的方法调用、Class的底层本质
- 08-探究iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联对象
- 09-探究iOS底层原理|KVO
- 10-探究iOS底层原理|KVC
- 11-探究iOS底层原理|探索Block的本质|【Block的数据类型(本质)与内存布局、变量捕获、Block的种类、内存管理、Block的修饰符、循环引用】
- 12-探究iOS底层原理|Runtime1【isa详解、class的结构、方法缓存cache_t】
- 13-探究iOS底层原理|Runtime2【消息处理(发送、转发)&&动态方法解析、super的本质】
- 14-探究iOS底层原理|Runtime3【Runtime的相关应用】
- 15-探究iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探究iOS底层原理|RunLoop的应用
- 17-探究iOS底层原理|多线程技术的底层原理【GCD源码分析1:主队列、串行队列&&并行队列、全局并发队列】
- 18-探究iOS底层原理|多线程技术【GCD源码分析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探究iOS底层原理|多线程技术【GCD源码分析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探究iOS底层原理|多线程技术【GCD源码分析3:线程调度组dispatch_group、事件源dispatch Source】
- 21-探究iOS底层原理|多线程技术【线程锁:自旋锁、互斥锁、递归锁】
- 22-探究iOS底层原理|多线程技术【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探究iOS底层原理|内存管理【Mach-O文件、Tagged Pointer、对象的内存管理、copy、引用计数、weak指针、autorelease
3. 基于Swift语言探索iOS底层原理
关于函数、枚举、可选项、结构体、类、闭包、属性、方法、swift多态原理、String、Array、Dictionary、引用计数、MetaData等Swift基本语法和相关的底层原理文章有如下几篇:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
4. C++核心语法
- 01-C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
- 02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
- 03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
- 04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
- 05-📝C++核心语法|面向对象3【 继承和派生、多态、静态成员、const成员、引用类型成员、VS的内存窗口】
5. Vue全家桶
- 01-📝Vue全家桶核心知识|Vue基础【Vue概述、Vue基本使用、Vue模板语法、基础案例、Vue常用特性、综合案例】
- 02-📝Vue全家桶核心知识|Vue常用特性【表单操作、自定义指令、计算属性、侦听器、过滤器、生命周期、综合案例】
- 03-📝Vue全家桶核心知识|组件化开发【组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互、组件插槽、基于组件的
- 04-📝Vue全家桶核心知识|多线程与网络【前后端交互模式、promise用法、fetch、axios、综合案例】
- 05-📝Vue全家桶核心知识|Vue Router【基本使用、嵌套路由、动态路由匹配、命名路由、编程式导航、基于vue-router的案例】
- 06-📝Vue全家桶核心知识|前端工程化【模块化相关规范、webpack、Vue 单文件组件、Vue 脚手架、Element-UI 的基本使用】
- 07-📝Vue全家桶核心知识|Vuex【Vuex的基本使用、Vuex中的核心特性、vuex案例】
6. 音视频技术核心知识
- 01-📝音视频技术核心知识|了解音频技术【移动通信技术的发展、声音的本质、深入了解音频】
- 02-📝音视频技术核心知识|搭建开发环境【FFmpeg与Qt、Windows开发环境搭建、Mac开发环境搭建、Qt开发基础】
- 03-📝音视频技术核心知识|Qt开发基础【
.pro文件的配置、Qt控件基础、信号与槽】 - 04-📝音视频技术核心知识|音频录制【命令行、C++编程】
- 05-📝音视频技术核心知识|音频播放【播放PCM、WAV、PCM转WAV、PCM转WAV、播放WAV】
- 06-📝音视频技术核心知识|音频重采样【音频重采样简介、用命令行进行重采样、通过编程重采样】
- 07-📝音视频技术核心知识|AAC编码【AAC编码器解码器、编译FFmpeg、AAC编码实战、AAC解码实战】
- 08-📝音视频技术核心知识|成像技术【重识图片、详解YUV、视频录制、显示BMP图片、显示YUV图片】
- 09-📝音视频技术核心知识|视频编码解码【了解H.264编码、H.264编码、H.264编码解码】
- 10-📝音视频技术核心知识|RTMP服务器搭建【流媒体、服务器环境】
7. 计算机网络核心知识
- 01-📝计算机网络核心知识|计算机网络通识【计算机网络性能指标、网络协议分层的几种方式、OSI七层模型概念通识】
- 02-📝计算机网络核心知识|【搭建调试环境、新建Java项目、计算机通信基础、计算机连接方式、集线器/网桥/交换机/路由器】
- 03-📝计算机网络核心知识|【MAC地址、IP地址的组成、IP地址的分类、CIDR、子网掩码、超网】
- 04-📝计算机网络核心知识|【 静态路由、动态路由、数据包的传输、ISP、服务器机房、网络分类、家用无线路由器、公网IP、
- 05-📝计算机网络核心知识|物理层/数据链路层【模拟信号&&数字信号、数据链路层】
- 06-📝计算机网络核心知识|网络层【IP数据包Packet、网络协议、Checksum、源IP地址和目标IP地址、ping】
- 07-计算机网络协议核心知识|【传输层-UDP】
- 08-计算机网络协议核心知识|【传输层-TCP之可靠传输】
- 09-📝计算机网络核心知识|传输层TCP2【流量控制原理、拥塞控制:slow start、congestion avoidance、快速重传、快速恢复】
- 10-计算机网络协议核心知识|【传输层-TCP连接】
- 11-计算机网络协议核心知识|【 应用层】
- 12-📝计算机网络核心知识|【Cookie、Session(概念、生命周期、有效期、浏览器的要求等)、跨域(概念、 同源策略、跨域解决方
- 13-计算机网络协议核心知识|【 代理/CDN/网络安全】
- 14-计算机网络协议核心知识|【(非)对称加密/数字签名/证书】
- 15-计算机网络协议核心知识|【HTTPS】
- 16-📝计算机网络核心知识|HTTPS协议【HTTP2、HTTP3】
其它底层原理专题
1. 底层原理相关专题
2. iOS相关专题
- 01-iOS底层原理|iOS的各个渲染框架以及iOS图层渲染原理
- 02-iOS底层原理|iOS动画渲染原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏渲染原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决方案