一、前言
本系列文章旨在复习计算机网络核心知识,进一步夯实基础,为以后 参与物联网、音视频、直播、即时通讯等领域的项目做一定的知识储备。
文章列表:
- 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】
本文主要关注:
在不同网段之间转发数据,需要有路由器的支持。
OSI七层模型中的物理层和数据链路层处于模型最底部,可以说是网络协议的基层。
二、物理层(Physical)
物理层定义了接口标准、线缆标准、传输速率、传输方式等(比如路由器定义的接口是做什么的、水晶头怎么排布、光缆线的作用等)。
1. 模拟信号、数字信号
模拟信号(Analog Signal)
- 连续的信号,适合长距离传输
- 抗干扰能力差,受到干扰时波形变形很难纠正
数字信号(Digital Signal)
- 离散的信号,不适合长距离传输
- 抗干扰能力强,受到干扰时波形失真可以修复
2. 数据通信模型
- 局域网通信模型
注意:网线不能超过100米(要想更远,再接一个交换机就好了)。
- 广域网通信模型
3. 信道(Channel)
信道:信息传输的通道,一条传输介质上(比如网线)上可以有多条信道。
单工通信
- 信号只能往一个方向传输,任何时候都不能改变信号的传输方向
- 比如无线电广播、有线电视广播
半双工通信
- 信号可以双向传输,但必须是交替进行,同一时间只能往一个方向传输
- 比如对讲机
全双工通信
- 信号可以同时双向传输
- 比如手机(打电话,听说同时进行)
三、数据链路层(Data Link)
链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点。
数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输。
不同类型的数据链路,所用的通信协议可能是不同的。
- 广播信道:
CSMA/CD协议(比如同轴电缆、集线器等组成的网络) - 点对点信道:
PPP协议(比如2个路由器之间的信道)
数据链路层的3个基本问题:
- 封装成帧
- 透明传输
- 差错检验
1. 封装成帧
- 帧(Frame)的数据部分就是网络层传递下来的数据包(IP数据包,Packet)
- 最大传输单元MTU(Maximum Transfer Unit)
- 每一种数据链路层协议都规定了所能够传送的帧的数据长度上限
- 以太网的MTU为1500个字节
2. 透明传输
数据部分一旦出现了SOH、EOT,就需要进行转义。
由于在接收端在接收的时候把转义符还原了,感受不到数据的变化,所以是透明传输。
3. 差错检验
- 数据链路层首部是帧首部的一部分
FCS是帧尾部的一部分,FCS是根据数据部分+数据链路层首部计算得出的- 接收端接收到信息后会计算出
FCS并进行比较,如果发现不一致,网卡就会把这条信息丢弃(抓包工具也抓不到)
数据经过不同的数据链路层,对应的层会把之前的帧开始和结束符替换为自己的协议帧。
4. CSMA/CD协议
CSMA/CD(Carrier Sense Multiple Access with Collision Detectio),载波侦听多路访问/冲突检测(主要是为了支持单工通信和半双工通信)。
使用了CSMA/CD的网络可以称为是以太网(Ethernet),它传输的是以太网帧。
- 以太网帧的格式有:Ethernet V2标准、IEEE的802.3标准
- 使用最多的是:Ethernet V2标准
为了能够检测正在发送的帧是否产生了冲突,以太网的帧至少要64字节。
原因:如果A主机发送的帧很小,很快完成帧的发送,而两台冲突主机相距很远。在主机A发送的帧传输到B的前一刻,B开始发送帧。这样,当A的帧到达B时,B检测到冲突,于是发送冲突信号。假如在B的冲突信号传输到A之前,A的帧已经发送完毕,那么A将检测不到冲突而误认为已发送成功(有可能是碰撞导致的原数据回弹,也可能是B发送的冲突信号)。为了保证A在发送帧过程中产生冲突时还能接收到冲突信号,帧就必须足够长(大于A到B的距离),必须在B接收到帧的时候,A还处在发送帧的状态,这时候B如果发现冲突,A接收到冲突信号后就知道正在发送的帧有冲突了。因此必须有最小包长的限制(64字节是信道长度的两倍)。定义最小帧长度是为了使发送方能在一个帧的传输时间内检测到此帧是否在链路上产生冲突,如发生冲突,退避重发。在最小帧长度内没发生冲突后,此帧就不再会发生冲突,在随后的发送中链路中其他节点都可检测到此链路上的信号,即发送方占据此信道,为了避免单一主机占用信道过长,则规定了以太网的最大帧长是1518字节。
用交换机组件的网络,已经支持全双工通信,不需要再使用CSMA/CD,但它传输的帧依然是以太网帧。所以,用交换机组建的网络,依然可以叫做以太网。
5. Ethernet V2帧的格式
- 首部:目标MAC地址 + 源MAC地址 + 网络类型(IPV4/IPV6)
- 以太网帧:首部 + 数据 + FCS
- 数据的长度至少是:
64 - 6 - 6 - 2 - 4 = 46字节
以太网帧是没有帧开始和结束符的,但是以太网使用曼彻斯特编码,接收端接收帧过程只要发现没有信号跳变,就认为帧结束。但是在物理层是有帧开始定界符的。
当数据部分(从网络层传入的数据)的长度小于46字节时,数据链路层会在数据的后面加入一些字节填充,接收端会将添加的字节去掉。
长度总结:
- 以太网帧的数据长度:
46 ~ 1500字节 - 以太网帧的长度:
64 ~ 1518字节(源MAC + 目标MAC + 网络类型 + 数据 + FCS)
6. PPP协议(Point to Point Protocol)
- Frame(F):PPP协议是有帧开始和结束符的,
0x7E - Address(A):图中的值是
0xFF,形同虚设,点到点信道不需要源MAC、目标MAC地址 - Control(C):图中的值是
0x03,目前没有什么作用 - Protocol(协议):内部用到的协议类型(PPP协议的子分支协议)
虽然PPP帧和以太网帧的协议不一样,但是网络层的数据是一样的,仅仅是帧的首部和尾部发生了变化。
路由器和路由器直连时是PPP帧,如果在两个路由器之间加一个交换机,就不是PPP帧了,而是以太网帧。因为路由器之间是点对点,不需要知道对方的MAC地址,但是以太网帧是广播信道,每一台设备必须确认自己是否是接收方。
PPP协议也是需要进行字节填充的:
- 将
0x7E替换成0x7D5E - 将
0x7D替换成0x7D5D
7. 网卡
网卡接收到一个帧,首先会进行差错校验,如果校验通过则接收,否则丢弃。
Wireshark抓到的帧没有FCS,因为它抓到的是差错校验通过的帧,帧尾的FCS会被硬件去掉,所以抓不到差错校验失败的帧。
专题系列文章
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资源消耗导致卡顿的原因和解决方案