一、前言
本系列文章旨在复习计算机网络核心知识,进一步夯实基础,为以后 参与物联网、音视频、直播、即时通讯等领域的项目做一定的知识储备。
文章列表:
- 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】
本文主要关注点:WebSocket、FTP、RESTful、SMTP、IMAP、POP等协议
二、ARP/RARP/ICMP
ARP(Address Resolution Protocol),地址解析协议。
- 通过IP地址获取MAC地址。
RARP(Reverse Address Resolution Protocol),逆地址解析协议。
- 使用与ARP相同的报头结构
- 作用与ARP相反,用于将MAC地址转换为IP地址
- 后来被BOOTP、DHCP所取代
ICMP(Internet Control Message Protocol),互联网控制消息协议。
- IPV4中的ICMP被称作ICMPv4,IPV6中的ICMP则被称作ICMPv6
- 通常用于返回错误信息,比如TTL值过期,目的不可达
- ICMP的错误消息总是包括了源数据并返回给发送者
三、WebSocket
WebSocket是基于TCP的支持全双工通信的应用层协议(全双工:客户端和服务器均可主动发消息给对方)。在2011年由IETF标准化为RFC_6455,后由RFC_7936补充规范。
WebSocket的应用场景很多:社交订阅、股票基金报价、体育实况更新、多媒体聊天、多玩家游戏等。
Socket是一套网络编程API,几乎所有的网络应用协议(HTTP/FTP/SMTP等)都是基于Socket实现的。而WebSocket是Web端的一个应用层通信协议。
1. HTTP和WebSocket
HTTP请求的特点:通信只能由客户端发起,所以早期很多网站为了实现推送技术,使用的技术都是轮询。
轮询是指由浏览器每隔一段时间(如每秒)向服务器发出HTTP请求,然后服务器返回最新的数据给客户端。为了能更好的节省服务器资源和带宽,并且能够更实时地进行通讯,HTML5规范中出现了WebSocket协议。
WebSocket和HTTP属于平级关系,都是应用层的协议。其实TCP本身就是支持全双工通信的,只是HTTP的“请求-应答”模式限制了TCP的能力。
WebSocket使用80(ws://)、443(wss://)端口,可以绕过大多数防火墙的限制(http默认使用80端口,https默认使用443端口)。
与HTTP不同的是,WebSocket需要先建立连接(应用层连接)。这就使得WebSocket成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都额外携带状态信息(如身份认证等)。
2. 建立连接
WebSocket需要借助HTTP协议来建立连接(也叫作握手,Handshake)。
由客户端(浏览器)主动发出握手请求:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Connection:必须设置Upgrade,表示客户端希望连接升级。
Upgrade:必须设置websocket,表示希望升级到WebSocket协议。
Sec-WebSocket-Version:表示支持的WebSocket版本,RFC_6455要求使用的版本是13。
Sec-WebSocket-Key:客户端生成的随机字符串(比如例子中的dGhlIHNhbXBsZSBub25jZQ==)。
服务器接收到客户端的Sec-WebSocket-Key后,会进行以下操作:
- Sec-WebSocket-Key拼接一个固定的GUID值(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)。例:
dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11。 - 将1的结果进行SHA-1摘要计算 ,结果:
b37a4f2cc0624f1690f64606cf385945b2bec4ea。 - 将2的结果进行Hex to Base64编码,结果:
s3pPLMBiTxaQ9kYGzzhZRbK+xOo=。 - 将3的结果作为Sec-WebSocket-Accept响应头的值,返回给客户端。
如此操作,可以尽量避免普通HTTP请求被误认为WebSocket协议。
3. 使用
WebSocket体验和演示:www.websocket.org/echo.html
W3C标准化了一套WebSocket API,可以直接使用JS调用。
let ws = new WebSocket('wss://example.com')
四、WebService
WebService(Web服务)是一种跨编程语言和跨操作系统平台的远程调用技术标准。
WebService使用场景举例:
- 天气预报、手机归属地查询、航班信息查询、物流信息查询等。
- 比如天气预报,是气象局把自己的服务以WebService形式暴露出来,让第三方程序可以调用这些服务功能(www.webxml.com.cn/zh_cn/index…
事实上,WebService完全可以用普通的Web API取代(比如HTTP + JSON),现在很多企业的开放平台都是直接采用Web API。
1. WebService - 核心概念
SOAP(Simple Object Access Protocol),简单对象访问协议。很多时候,SOAP = HTTP + XML。WebService使用SOAP协议来封装传递数据。
SOAP其实就是正常的HTTP请求和有规范格式的XML,请求和响应都是XML文件。
WSDL(Web Services Description Language),Web服务描述语言。一个XML文档,用以描述WebService接口的细节(比如参数、返回值等)。一般在WebService的URL后面跟上?wsdl获取WSDL信息。比如:ws.webxml.com.cn/WebServices…
五、RESTful
REST(Representatioanl State Transfer),表现层状态转移。
REST是一种互联网软件架构设计风格,定义了一组用于创建Web服务的约束。符合REST架构的Web服务,称为RESTful Web服务器。
RESTful后面的ful表示形容词,例如wonder -> wonderful 。
实践建议:
- URL中使用名词(建议用复数形式),不使用动词。
- 推荐:
/users、/users/6 - 不推荐:
listUsers、/getUser?id=6、/user/list、/user/get?id=6
- 推荐:
- 使用HTTP的方法表达动作:
- 一个资源连接到其他资源,使用子资源的形式
- GET:
/users/6/cars/88 - POST:
/users/8/cars
- GET:
- API版本化
idbeny.com/v1/usersidbeny.com/v2/users/66
- 返回JSON格式的数据
- 发生错误时,不要返回200状态码
六、HTTPDNS
HTTPDNS是基于HTTP协议向DNS服务器发送域名解析请求。替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,可以避免Local DNS造成的域名劫持和跨网访问问题。常用在移动互联网中(比如Android、iOS开发中)。
市面上已经有现成的解决方案,移动端集成相关的SDK即可使用HTTPDNS服务。
七、FTP
FTP(File Transport Protocol),文件传输协议。RFC_959定义了此规范,是基于TCP的应用层协议。在RFC_1738中有定义,FTP的URL格式为:ftp://[user[:password]@]host:[:port]/url-path。
1. 连接模式
FTP有2种连接模式:主动(Active)和被动(Passive)。
不管是哪种方式,都需要客户端和服务器建立2个连接:
- 控制连接:用于传输状态信息(指令) - 数据连接:用于传输文件和目录信息(数据)
1.1. 主动模式
主动模式是服务器主动,客户端被动。
- 客户端打开一个随机的命令端口
- 端口号大于1024,假设为N。同时连接至服务器的命令端口21(固定)
- 客户端开始监听N+1数据端口
- 同时向服务器发送一个Port命令给服务器的命令端口21
- 此命令告诉服务器,客户端正在监听的数据端口是N+1,并且已准备好从此端口接收数据
- 服务器打开20号数据端口(固定),并且创建和客户端数据端口(N+1)的连接
1.2. 被动模式
被动模式是客户端主动,服务器被动。
客户端通过两个随机的端口与服务器建立连接:命令端口N、数据端口N+1。 - 客户端的命令端口N用于连接服务器的命令端口21(固定) - 客户端通过命令端口N发送PASV命令给服务器的命令端口21 - 服务器打开一个随机的数据端口P,并告知客户端该端口号是P - 客户端数据端口N+1发起与服务器数据端口P的连接
八、邮件相关的协议
发邮件使用的协议:
- SMTP(Simple Mail Transfer Protocol),简单邮件传输协议。
- 基于TCP,标准参考RFC_5321
- 服务器默认使用25端口,SSL/TLS使用465端口
收邮件使用的协议:
- POP(Post Office Protocol),邮局协议。
- 基于TCP,最新版是POP3,标准参考RFC_1939
- 服务器默认使用110端口,SSL/TLS使用995端口
- IMAP(Internet Message Access Protocol),因特网信息访问协议。
- 基于TCP,最新版是IMAP4,标准参考RFC_3501
- 服务器默认使用143端口,SSL/TLS使用993端口
1. 收发邮件的过程
不同邮箱服务是不同直接通信的,例如腾讯邮箱(@qq.com)要想发邮件给网易邮箱(@163.com),客户端通过SMTP协议发送至腾讯邮箱服务,腾讯邮箱服务器通过SMTP协议转发给网易邮箱服务器,网易邮箱用户通过POP/IMAP协议拉取网易邮箱服务器上的邮件。
2. POP的特点
- 客户端连接服务器时,将会从服务器下载所有邮件。
- 可以设置下载完后,立即或一段时间后删除服务器邮件。
- 客户端的操作(比如删除邮件、移动到文件夹)不会跟服务器同步。
- 每个客户端都是独立的,都可以获得其自己的电子邮件副本。
3. IMAP的特点
-
客户端连接服务器时,获取的是服务器上邮件的基本信息,并不会下载邮件。
- 等打开邮件时,才开始下载邮件。
-
客户端的操作(比如删除邮件、移动到文件夹)会跟服务器同步。
-
所有客户端始终会看到相同的邮件和相同的文件夹。
专题系列文章
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资源消耗导致卡顿的原因和解决方案