一、前言
本系列文章旨在复习计算机网络核心知识,进一步夯实基础,为以后 参与物联网、音视频、直播、即时通讯等领域的项目做一定的知识储备。
文章列表:
- 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中的比重很大,几乎所有的网络请求库都会涉及到。
二、网络层(Network)
网络层数据包(IP数据包:Packet)由首部、数据2部分组成。
数据:很多时候是由传输层传递下来的数据段(Segment)。
1. 版本(Version)
占4位(0b0100
:IPv4,0b0110
:IPv6)。
2. 首部长度(Header Length)
占4位,标识该IP头部有多少个32bit字(4字节),因为4位最大能表示15,所以IP头部最长是60字节。
最小值:0b0101(5 * 4 = 20)
最大值:0b1111(15 * 4 = 60)
首部固定部分是20个字节,虽然还有可变部分,但很多时候就是20个字节。由于最大值是60个字节,所以可变部分是40个字节。
3. 区分服务(Differentiated Services Field)
占8位,可以用于提高网络的服务质量(QoS:Quality of Service)
包括3位优先级字段、1位保留字段和4位TOS字段。4位TOS分别表示:最小时延、最大吞吐量、最高可靠性和最小费用。其中最多有一个能置为1。
比如客户端发送数据给服务端,数据在经过路由器的时候,路由器识别区分服务(例如,区分服务的优先级值为3)的优先级后可以让这部分数据优先通过。
4. 总长度(Total Length)
占16位。指整个IP数据报的长度,以字节为单位。首部 + 数据的长度之和,最大值是65535(2^16-1)字节
。
但是由于MTU限制(帧的数据不能超过1500字节),长度超过MTU的数据报将会分片传输,所以实际传输的IP数据报长度远远没有达到最大值。因此过大的IP数据包,需要分成片(fragment),每一片都有自己的网络层首部(IP首部)。
标识、标志、片偏移描述了如何分片。
5. 标识(Identification)
占16位,数据包的ID。其初始值是系统随机生成,每发送一个数据包,其值加1。该值在分片时被复制到每一个分片中,因此同一个数据包的所有分片的标识都是一样的。
6. 标志(Flags)
占3位。
- 第1位(Reserved Bit):保留
- 第2位(Don't Fragment):表示“是否禁止分片”,1代表禁止分片,0代表允许分片
- 第3位(More Fragments):表示“是否还有更多片”,1代表不是最后一片,0代表是最后一片。如果要分片,除了最后一个分片外,其他的分片都要置1。
7. 片偏移(Fragment Offset)
占13位。是分片相对原始IP数据报开始处的偏移(仅指数据部分)。实际偏移值是该值左移3位得到的。所以除最后一个分片,其他分片的数据部分长度必须是8的整数倍(片偏移乘以8:字节偏移)。
为什么要左移3位?
除最后一个片段外,每个片段都必须包含8字节数据的倍数。由于片段偏移是按13位编码的,因此其范围在0到8191个8字节单位之间。 但是,由于“总长度”也考虑了IP标头,因此“片段偏移”最大限制实际上是8189个单位,而不是8191个单位。总长度被编码为16位,这意味着它被限制为65535个字节。 然后,由于IP标头至少为20个字节,因此导致有效载荷被限制为最大65535个字节-20个字节= 65515个字节。 将这65515个字节以8个字节为单位进行划分,结果将可能最多有8189个单位,因此分片偏移限制为最大为8189个单位。
8. 生存时间(Time to Live)
占8位。设置了数据可以经过的最多的路由器数(操作系统不同TTL值也不同),每个路由器在转发之前会将TTL减1,如果该值减为0依旧没有到达目的主机,就丢弃该数据包,由这个路由器发送ICMP差错报文(目标不可达)。主要作用就是防止路由死循环(A路由跳B路由,B路由跳A路由,数据一直在往返,如果没有TTL就会产生死循环)。
观察使用ping命令后的TTL,能够推测出对方的操作系统,中间经过了多少个路由器。
9. 协议(Protocol)
用于区分上层协议,表明所封装的数据使用了什么协议。
10. 首部检验和(Header Checksum)
由发送端填充,检查首部是否有错误。接收端对其使用CRC算法检验IP数据报首部在传输过程中是否损坏(只检查首部,不管数据部分)
11. 源IP地址和目标IP地址(Source Address、Destination Address)
各占4个字节。用来指定发送端和接收端的。
12. ping的几个相关用法
ping -h
:查看ping的用法(Windows:ping /?
)ping IP地址 -l 数据包大小
:发送指定大小的数据包ping IP地址 -f
:不允许网络层分片ping IP地址 -i TTL
:设置TTL的值- 通过
tracert
、pathping
命令,可以跟踪数据包经过了哪些路由器
Mac系统首次使用
ping
设置网络层,可能会提示权限不足,需要授权sudo
。
专题系列文章
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资源消耗导致卡顿的原因和解决方案