写在文前：没想到最后也屈服于 AI 了，在各种资料和 Gemini 的帮助下完成了一次微调和部署流程 项目目标：基于 Qwen2.5-7B-Instruct 模型，使用 PsyQA 数据集微调一个具备共情能力的心理咨询 AI，并量化部署到 Ollama。 硬件环境：NVIDIA 5090 32G + 100G 可用磁盘空间 基座模型：Qwen/Qwen2.5-7B-Instruct 第一阶段：环境与数据准备 1. 环境搭建 推荐使用 Conda 创建独立环境，防止依赖冲突。 Bash # 1. 创建并激活虚拟环境 conda create -n qwen_finetune python=3.10 -y conda activate qwen_finetune # 2. 克隆 LLaMA-Factory git clone --depth 1 https://github.com/hiyouga/LLAMA-Factory.git cd LLAMA-Factory # 3. 安装核心依赖 pip install -e ".[torch,metrics]" -i https://pypi.tuna.tsinghua.edu.cn/simple # 4. 安装加速库 (Flash Attention 2) # 注意：这步极易报错，确保 CUDA 版本与 Torch 匹配 pip install flash-attn --no-build-isolation 2. 数据处理与清洗 将 HF 格式转换为 LLaMA-Factory 支持的 Alpaca/JSONL 格式。 脚本：preprocess_psyqa.py Python import json from datasets import load_dataset def format_psyqa(output_file): print("正在加载数据集 lsy641/PsyQA ...") try: # 建议先下载到本地 /root/autodl-tmp/data/ 避免网络中断 dataset = load_dataset("lsy641/PsyQA", split="train") except Exception as e: print(f"加载失败: {e}") return print(f"原始数据量: {len(dataset)}") formatted_data = [] system_prompt = "你是一位共情能力强、专业的心理咨询师。请根据求助者的描述，给出温暖、建设性的建议。" for item in dataset: question = item.get('description', '') or item.get('question', '') answer = item.get('answer', '') # 简单清洗 if len(question) < 10 or len(answer) < 10: continue formatted_data.append({ "instruction": system_prompt, "input": question, "output": answer }) with open(output_file, 'w', encoding='utf-8') as f: json.dump(formatted_data, f, ensure_ascii=False, indent=2) print(f"✅ 处理完成！有效数据: {len(formatted_data)} 条。保存至: {output_file}") if __name__ == "__main__": # 确保 data 目录存在 import os os.makedirs("data", exist_ok=True) format_psyqa("data/psyqa_formatted.json") 生成文本样例： { "instruction": "你是一位共情能力强、专业的心理咨询师。请根据求助者的描述，给出温暖、建设性的建议。", "input": "我想实现自己的目标，但是心灵匮乏，没有能量，所以行动力很低心灵能量如何补？", "output": "楼主你好呀，给你温暖的抱抱～在你的问题描述中，你能够感知到自己是一个有目标的人，但是你却缺乏【能量】，这能量更学术一点的来说，就是动机。给我们做出行为反应的更多的就是我们的动机，当我们的动机越强烈越明确的时候，我们就能够越高效的、迅速的做出行为反应。或许你需要去寻找这个目标对你来说的意义，你为什么渴望有这样的一个目标？在这你还需要去完善你的行动，可能你有很强烈的需求去促进你的行为，但是可能在时间的安排上，你会耽误一些。可以试着给自己进行一个规划，通过一个大的目标来分解为小目标，进而制定一个适合自己的计划，通过细分能够更好地促进自己行为的发生。祝好~。" } 3. 注册数据集 LLaMA-Factory 必须在 dataset_info.json 中注册数据才能识别。编辑 LLAMA-Factory/data/dataset_info.json，在文件末尾（大括号内）添加： JSON "psyqa": { "file_name": "psyqa_formatted.json", "columns": { "prompt": "instruction", "query": "input", "response": "output" } } 第二阶段：LoRA 微调 (SFT) 1. 启动训练 建议保存为 run_train.sh 并运行。 ⚠️ 显存注意：如果你显存小于 24GB，请调低 per_device_train_batch_size 为 1，并调高 gradient_accumulation_steps。 #!/bin/bash CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \ --stage sft \ --do_train \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --dataset psyqa \ --dataset_dir ./data \ --template qwen \ --finetuning_type lora \ --lora_target all \ --output_dir saves/Qwen2.5-7B-PsyQA/lora/sft \ --overwrite_output_dir \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 500 \ --learning_rate 1e-4 \ --num_train_epochs 3.0 \ --max_samples 10000 \ --max_grad_norm 1.0 \ --lora_rank 32 \ --lora_alpha 64 \ --lora_dropout 0.1 \ --plot_loss \ --bf16 \ --gradient_checkpointing 第三阶段：验证与合并 1. 快速对话测试 (Check LoRA) 验证 Adapter 是否有效。 llamafactory-cli chat \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --adapter_name_or_path saves/Qwen2.5-7B-PsyQA/lora/sft \ --template qwen \ --finetuning_type lora 2. 模型合并 (Merge) 将 LoRA 权重合入基座，生成完整模型。 ⚠️ 路径注意：请根据实际下载位置调整 /root/autodl-tmp/...。 # 确保在 LLAMA-Factory 目录下 llamafactory-cli export \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --adapter_name_or_path ./saves/Qwen2.5-7B-PsyQA/lora/sft \ --template qwen \ --finetuning_type lora \ --export_dir /root/autodl-tmp/Qwen2.5-7B-PsyQA-Merged \ --export_size 5 \ --export_device cpu 第四阶段：GGUF 量化与部署 (AutoDL -> 本地) 1. 编译 llama.cpp 修复点：针对 AutoDL 环境，需安装 cmake 和 libcurl。 cd /root/autodl-tmp git clone --depth=1 https://github.com/ggerganov/llama.cpp.git cd llama.cpp # 安装依赖防止编译报错 apt-get update && apt-get install -y cmake libcurl4-openssl-dev # 使用 CMake 编译 (生成工具在 build/bin 下) mkdir build && cd build cmake .. cmake --build . --config Release -j $(nproc) 2. 格式转换 (HF -> GGUF FP16) ⚠️ 空间预警：此步需要约 35GB 空闲空间。 # 回到 llama.cpp 根目录 cd /root/autodl-tmp/llama.cpp # 执行转换 (使用绝对路径) python convert_hf_to_gguf.py /root/autodl-tmp/Qwen2.5-7B-PsyQA-Merged/ \ --outfile Qwen2.5-7B-PsyQA-f16.gguf \ --outtype f16 3. 模型量化 (FP16 -> Q4_K_M) 将 14GB 的模型压缩至 5GB，适合本地运行。 # 注意工具路径在 build/bin ./build/bin/llama-quantize Qwen2.5-7B-PsyQA-f16.gguf Qwen2.5-7B-PsyQA-q4_k_m.gguf Q4_K_M 4. 备份到 Hugging Face (推荐) 防止 AutoDL 数据丢失。需先在 HF 申请 Write 权限 Token。 pip install huggingface_hub huggingface-cli login # 输入 Token huggingface-cli upload 你的HF用户名/Qwen2.5-7B-PsyQA \ /root/autodl-tmp/llama.cpp/Qwen2.5-7B-PsyQA-q4_k_m.gguf \ Qwen2.5-7B-PsyQA-q4_k_m.gguf 第五阶段：本地 Ollama 运行 1. 编写 Modelfile 在本地电脑（存放 GGUF 的目录）新建文件 Modelfile： FROM ./Qwen2.5-7B-PsyQA-q4_k_m.gguf TEMPLATE """{{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}{{ if .Prompt }}<|im_start|>user {{ .Prompt }}<|im_end|> {{ end }}<|im_start|>assistant """ SYSTEM "你是一位专业的心理咨询师，擅长共情、倾听。请先接纳用户情绪，再给出建议。" PARAMETER temperature 0.7 PARAMETER num_ctx 4096 2. 导入与运行 # 导入 ollama create psyqa -f Modelfile # 运行 ollama run psyqa
感谢HOMOLAB的精彩文章，让我对SSD有了更为科学的认识 PART I 固态硬盘（SSD）基础 1.1 发展历史与演进 NAND Flash 原理：1145141919810个浮栅晶体管平铺堆叠（发配到模电区）。把晶体管在不同挡位的电压（浮栅晶体管捕获存储的电子数量差异导致电压不同）当作信息。 比特数与存储密度 单元 数据量（二进制位数） SLC 1 MLC 2 TLC 3 QLC 4 性能与耐用性 从SLC➡MLC➡TLC➡QLC： 存储数据难度上升：主控在写入数据时，需要精确地控制浮栅中电子的数量； 读取数据的难度上升：主控在读取数据时，也必须非常精确地判断当前电压属于哪个区间，否则可能导致误读； 耐久性降低：存储信息越多，对电压精度要求越高。擦写次数越多，浮栅的磨损就越大，电压状态就越不稳定。 原因：如QLC，将16种不同的电压状态挤在一个小小的浮栅晶体管里，就好比在一条狭窄的公路上行驶16辆车。每辆车之间的安全距离会变得非常小。 1.2 SSD 的基本构成 NAND Flash 存储芯片：浮栅晶体管堆叠，有着比较玄学的寿命说 Block（擦除的最小单位） ➡ Page（读写最小单位）➡ Cell 主控（Controller）：硬盘里管理数据的大脑，在如今SSD产品损坏的案例里一般是由于主控物理暴毙或者固件暴毙导致的 DRAM 缓存（不是都有） 无缓（DRAMless SSD） 有缓（DRAM SSD）：存储FTL表，便于寻址 PART II SSD工作原理 2.1 读写与擦除 REW（Read-Erase-Write） 固态的擦除是以block为单位、读写以page为单位，nand的物理特性决定了他不能覆盖写入。因此如果我们要对一个已有数据的page进行写入，那么必须先要把这个page所在的block中的数据读出，block清空后再把所有数据写进去。 2.2 核心技术与机制 PART III SSD性能参数与协议 3.1 关键性能指标 IOPS（Input/Output Operations Per Second）：如英文名，硬盘每秒钟能够处理的输入/输出操作次数。 传统指标：随机和顺序是HDD时代传承下来的概念，在SSD中或许不再适用，但仍然被广泛使用。 顺序读写（Sequential Read/Write）： 顺序读写是指数据在存储介质上连续存储和读取的方式，通常用于大文件传输或连续数据流的处理。参数通过用大文件进行读写测试来获得。 随机读写（Random Read/Write）：随机读写是指数据在存储介质上分散存储和读取的方式，通常用于小文件或随机访问的数据。一般使用大量小文件进行读写测试。 相关论述文章《随机 稳态 缓外 无知以及谎言,不存在的随机写入》总结： SSD数据存储在NAND的多个页（Page）中，页是SSD的最小读写单位； SSD读取数据时，一般需要根据FTL（Flash Translation Layer）将逻辑地址转换为物理地址； FTL表的查询需要时间，如果一个文件分布在临近的物理空间上,那么对其进行读写的操作就不需要多次查询FTL表从而节省开销； FTL表的映射是非线性的，物理上连续的存储单元未必在逻辑上是连续的； 对于一个大块的连续文件写入而言,看起来是顺序写入，但数据不会集中在某一个NAND的某一个DIE的某一个plane的某一个block,而是分布在不同NAND上的不同block中； 因此，顺序读写和随机读写的概念对于SSD并不完全适用，SSD的性能更多地取决于其内部结构和数据管理方式；因此，顺序读写和随机读写的概念对于SSD并不完全适用，SSD的性能更多地取决于其内部结构和数据管理方式； 缓外速度（Sustained Write Speed）：在SLC Cache技术应用后产生的概念 定义：缓外速度是指在SSD的SLC Cache被填满后，数据写入到TLC或QLC NAND Flash时的速度。通常情况下，SLC Cache可以提供更高的写入速度，而缓外速度则较低。 备注：缓外速度不等同于SSD的实际写入速度，在如今常常导致用户对SSD性能的误解。实际上，连续大容量写入分多个阶段（关键词：SLC Cache释放、REW、Writeback惩罚、TLC/QLC直写、GC回收），而这受到厂家设计策略的影响，部分用户观察到的缓外速度没有太大的意义。 WAF（Write Amplification Factor） 定义：写放大因子，表示实际写入的数据量与原始数据量的比率。 产生原因：SSD是以页为单位进行读写，但由于NAND Flash的特性，无法直接覆盖写入，因此需要先擦除整个块（Block），然后再写入新的数据。这种操作会导致实际写入的数据量大于原始数据量，从而产生写放大现象。 WAF与脏盘度（Dirty Page）：WAF与脏盘度密切相关，较高的脏盘度意味着更多的数据需要被擦除和重写，从而增加了写放大现象。 3.2 消费级常见接口与协议 SATA（Serial ATA） 传输速率：SATA III的最大传输速率为6 Gbps（约750 MB/s）。 特点：SATA接口是传统的硬盘接口，主要用于连接机械硬盘和早期的SSD。 目前SATA接口的SSD产品性价比较低 NVMe（Non-Volatile Memory Express） 传输速率：NVMe接口的传输速率远高于SATA接口，理论上可以达到32 Gbps（约4 GB/s）甚至更高。 特点：NVMe接口专为SSD设计，能够充分发挥NAND Flash的高速性能，具有更低的延迟和更高的并发处理能力。 UFS（Universal Flash Storage） 传输速率：UFS 3.0的最大传输速率为23.2 Gbps（约2.9 GB/s）。 特点：UFS接口主要用于移动设备，如智能手机和平板电脑，具有更低的功耗和更高的性能。 CFexpress（CompactFlash Express） 传输速率：CFexpress 1.0的最大传输速率为1 GB/s，CFexpress 2.0可以达到2 GB/s。 特点：CFexpress接口主要用于专业相机和摄像机，支持PCIe和NVMe协议，具有高性能和低延迟。 SD Express（Secure Digital Express） 传输速率：SD Express的最大传输速率为985 MB/s。 特点：SD Express是SD卡的最新标准，支持PCIe和NVMe协议，主要用于移动设备和相机。 PART IV 主控与固件深度解析 4.1 SSD主控的功能与作用 SSD主控是固态硬盘的核心组件，负责管理数据的读写、擦除和存储。它的主要功能包括： 数据管理：主控负责将数据从主机传输到NAND Flash，并在需要时将数据从NAND Flash传输回主机。 地址映射：主控使用FTL（Flash Translation Layer）将逻辑地址转换为物理地址，以便正确地读写数据。 垃圾回收：主控定期执行垃圾回收操作，以释放被删除或过时数据占用的空间，从而提高SSD的性能和寿命。 性能优化：主控通过各种技术（如SLC Cache、OP等）来优化SSD的性能和耐用性。 固件更新：主控可以通过固件更新来修复错误、改进性能或添加新功能。 4.2 固件的优化策略 4.2.1 SLC Cache 产生原因：SLC Cache是为了提高SSD的写入性能而设计的。由于SLC（单层单元）具有更高的写入速度和耐用性，SSD制造商通常会将一部分TLC或QLC NAND Flash配置为SLC Cache（主控只需要区分两种电压状态），以便在写入数据时先使用SLC Cache进行高速写入。 种类： 全盘SLC Cache：将整个SSD的部分空间配置为SLC Cache，通常在SSD的容量较大时使用。比较考验主控的算法设计能力。 分区SLC Cache：将SSD的部分空间划分为SLC Cache，通常在SSD的容量较小或中等时使用。 动态SLC Cache：根据实际写入需求动态分配SLC Cache的大小，通常在SSD的空闲空间较多时，SLC Cache会较大。比较考验主控的算法设计能力。比较出色的产品：Solidigm P41 Plus(QLC) 写入流程（与主控、算法与固件有关，此处仅仅阐释常见的SLC Cache写入流程）： FOB阶段：主控将数据写入SLC Cache，SLC Cache的写入速度通常较快，因为SLC只需要区分两种电压状态（0和1）。 Transition过渡态：当剩余空间处于一定低线时，SSD内部将并未完整写入的page进行整理、触发GC回收机制将标记删除的数据从Nand上物理的删除掉。由于还有部分未写入的page可以利用,因此R-E-W惩罚为中等,并发效率受到一定程度的限制。 R-E-W惩罚：在这一阶段，由于GC回收和数据整理的需求，SSD的写入性能可能会受到影响，导致写入延迟增加。 GC回收：当所有的空间都不可用或者可用度很低，SSD不得不实时性的进行垃圾的释放(GC回收)：读取垃圾文件所在块上的其他有效数据➡擦除整个块➡把这些数据整理并腾挪到其他地方。 Steady稳态：GC回收、R-E-W进入了一个动态均衡的状态，因而性能维持在一条线上。主控和NAND成为当前的主要瓶颈（对于主控来说，它在这一高负载的情况下需要频繁的进行GC回收的处理、写入与读取数据的命令分配、磨损平衡的计算、数据纠错等操作） 4.2.2 地址映射表（FTL） 定义：FTL（Flash Translation Layer）是SSD中的一种关键技术，负责将逻辑地址映射到物理地址，以便正确地读写数据。 优化策略：为了提高FTL的性能，SSD制造商通常会采用多种优化策略，如： 使用DRAM缓存：在SSD中增加DRAM缓存，以提高映射表的查询速度。 采用分层映射：将映射表分为多个层次，以减少查找时间。类比内存中的多级页表。 进行预读和预写：根据访问模式预测数据的读写需求，提前加载或写入数据。 4.2.3 OP（Over-Provisioning） 定义：OP（Over-Provisioning）是指在SSD中预留一部分额外的空间，以提高性能和延长寿命。 原理：通过增加闲置空间，OP可以减少写放大现象，提高垃圾回收效率，从而提升SSD的整体性能和耐用性。 注意事项： OP的大小需要根据实际使用场景进行合理配置，过大或过小都会影响SSD的性能。 OP的使用需要与其他优化策略结合，以达到最佳效果。 4.3 Writeback惩罚的原理与影响 定义：Writeback惩罚是指在SSD中，由于数据写入策略和垃圾回收机制的影响，导致写入性能下降的现象。 原因：当SSD的SLC Cache被填满后，数据需要写入到TLC或QLC NAND Flash中，这个过程通常会比SLC写入慢得多。此外，在进行垃圾回收时，SSD需要读取、擦除和重写数据，这也会导致写入性能下降。 影响：Writeback惩罚会导致SSD在高负载情况下出现明显的性能下降，影响用户的使用体验。 4.4 SSD维护 4.4.1 S.M.A.R.T.表 功能：S.M.A.R.T.可以实时监测SSD的各项指标，如温度、写入/读取错误率、剩余寿命等，并在出现异常时发出警告。 关键指标： 03：可用备用空间，代表SSD中已使用Over-Provisioning的大小。 0E：介质与数据完整性错误计数，只要大于0则表示存在潜在的介质损坏风险。 4.4.2 TRIM 定义：TRIM是一种命令，允许操作系统通知SSD哪些数据块不再使用，从而帮助SSD进行垃圾回收。 方法：大多数现代操作系统（如Windows、Linux和macOS）都支持TRIM命令，用户无需手动操作。
午睡，梦中，将醒未醒时，意识恍然一掠发觉自己在那片依旧熟悉的黄绿相间的小路上，天上斜斜得挂着略有些晒人的太阳，路边疯长着有腰高的杂草，从层层叶间掠过扑面而来的是夹杂着草木青味的温热空气。虫鸣、鸟啼，铺洒在初夏回家的路上。
第一章 计算机网络体系结构 I.计算机网络概述 概念 计算机网络是互连的、自治的计算机集合。 由节点（Node）和连接这些节点的链路（Link）组成。 组成 组成部分：硬件、软件、协议 工作方式： 边缘部分：用户直接使用的主机 核心部分：网络的基础设施，如路由器、交换机等 功能组成： 通信子网：负责数据传输 资源子网：负责资源管理 功能 数据通信 资源共享 分布式处理 提高可靠性 负载均衡 交换技术 种类 交换技术 特点 优点 缺点 电路交换 1.需要建立物理连接通道2.传输过程中通道被==独占== 1.通信时延2.适用于实时通信3.能够完全有序传输 1.建立连接时间长2.线路利用率低灵活性差3.难以实现差错控制 报文交换 1.报文封装全部信息2.==全部存储==后再转发3.无需建立连接 1.适用于短报文传输2.适用==不确定==通信量3.线路可靠4.动态分配线路 1.转发时延长2.缓存开销大3.难以实现差错控制 分组交换 1.报文分割成==固定长度==的分组2.==存储转发==3.无需建立连接 1.减少出错概率2.简化缓存3.流水线加速 1.存在存储转发时延2.需要额外信息量3.可能出现乱序、丢失、重复分组 [!Important] 报文转发和分组转发存在处理延迟，即上图中的空隙 分组转发花费时间和中间节点数量有关系，一些情况下可以简便运算 区别 计算机的数据传送往往是突发式的，采用电路交换时通信线路的利用率很低。报文交换和分组交换不需要建立连接（即预先分配通信资源），在传送计算机的突发数据时可以提高通信线路的利用率 将报文构造成若干个更小的分组进行分组交换，比将整个报文进行报文交换的时延要小，并且还可以避免太长的报文长时间占用链路，有利于差错控制，同时具有更好的灵活性。 分类 分布范围 广域网（WAN） 城域网（MAN） 局域网（LAN） 个人区域网（PAN） 传输技术 广播式网络 点对点网络 拓扑结构 总线型 星型 环型 网状型 关于差别，在通信效率、可靠性、扩展性、成本等方面出题 网络性能指标 [!Important] 速率中的K、M、G表示的是十进制，分别为10^3、10^6、10^9 速率 带宽 模拟信号：频率范围（Hz） 计算机网络：最高数据传输速率 吞吐量：单位时间通过网络的实际数据量 时延 发送时延 t_s = 数据块长度/发送速率 传播时延 t_c = 信道长度/传播速率 处理时延 排队时延 总时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延 时延带宽积: 传播时延 * 带宽 往返时延 RTT=|发送报文时间 - 接收确认ack时间| ！信道利用率 U 空闲时延 D_0、当前时延 D D = \frac{D_0}{1-U}，U 越大，当前时延 D 越大 II.计算机网络体系结构 分层结构 分层基本原则 每层实现特定功能 各层间由可以互相通信的接口 下层独立于上层，即没有上层也能工作 上层==单向==使用下层服务 结构元素 实体 实体：在通信过程中能够发送或接收信息的硬件或软件模块 对等实体：在通信过程中能够相互通信的实体 协议数据单元（PDU）：对等层水平传递的数据单元，分为数据和控制信息 服务数据单元（SDU）：对等层垂直传递的数据单元，服务上层 协议控制信息（PCI）：对等层水平传递的控制信息 [!Note] 第n层收到的PDUs称为n-1层的SDUs，加上第n层的PCI就构成了n层的PDUs ！协议、接口、服务 协议（水平关系） 协议 含义 作用 举例 语法 数据格式 数据的结构和编码 TCP 报文的格式由语法决定 语义 具体操作流程 何时发何种控制信息、如何应答 TCP 三次握手具体操作 同步（时序） 操作条件、时序 明确数据交互的顺序流程 TCP 连接的建立、关闭报文时序 接口 服务访问点 SAP（Service Access Point）：同一节点内相邻层之间的接口，提供服务访问点 服务（垂直关系） 服务原语：服务提供者和服务用户之间的通信操作 请求：服务用户向服务提供者发出的请求，请求服务提供者执行某种操作 指示：服务提供者向服务用户发出的指示，要求服务用户执行某种操作 响应：服务用户向服务提供者发出的响应，表示对指示的响应 证实：服务提供者向服务用户发出的证实，表示对请求的证实 服务分类 面向连接服务和无连接服务：是否建立连接 可靠服务和不可靠服务：是否保证数据传输的可靠性 有应答服务和无应答服务：是否需要对数据传输进行应答 OSI参考模型 低三层为通信子网，高三层为资源子网 层次 名称 传输单位 功能 协议 1 物理层 比特 1.规定物理接口参数2.规定信号意义和电气特征 IEEE802.3 2 数据链路层 帧 1.速率协调2.差错检测（==只能丢弃==）3.流量控制 SDLC、HDLC、STP、PPP、 3 网络层 数据包 点到点 1.差错、拥塞控制2.路由选择3.分组交换4.流量控制 IP、ICMP、IGMP、ARP、RIP、OSPF 4 传输层 段 端到端 1.差错控制2.流量控制3.拥塞控制 TCP、UDP 5 会话层 数据 1.建立、==同步==、释放会话2.建立恢复点 6 表示层 数据 1.数据格式转换2.数据==加密、压缩== 7 应用层 数据 1.提供用户接口2.文件传输3.电子邮件4.远程登录 HTTP、FTP、SMTP、POP3 [!Tip] 流量控制： 数据链路：相邻节点之间的流量控制 网络层：==整个网络==中的流量控制 传输层：端到端的流量控制 TCP/IP参考模型 网络接口层 与OSI的物理层和数据链路层对应 功能：定义网络接口标准 以太网、令牌环、FDDI、ATM、PPP、SLIP 网际层 与OSI的网络层对应 功能：IP寻址、路由选择、分片、差错检测 协议：IP、ICMP、ARP、RARP 传输层 与OSI的传输层对应 功能：差错控制、流量控制、拥塞控制 协议：TCP、UDP 应用层 与OSI的应用层、表示层、会话层对应 功能：提供用户接口、文件传输、电子邮件、远程登录 协议：HTTP、FTP、SMTP、POP3 ！OSI与TCP/IP对比 OSI 是理论模型，TCP/IP 是实际模型 OSI 七层，TCP/IP 四层 OSI 在网络层支持面向连接和无连接服务，而 TCP/IP 只支持无连接服务 OSI 的传输层只提供端到端可靠传输，而 TCP/IP 的传输层提供不可靠传输 UPD 和可靠传输 TCP 第二章 物理层 实现功能： “透明”传输比特流； 物理接口特性 机械特性：形状尺寸、引脚设计 电气特性：信号电压、阻抗、传输速率、距离限制 功能特性：规定接口各电缆作用（网线八根作用）、电压波形含义 过程特性：信号时序关系 I.通信原理 基本名词 数据、信号和码元 数据：传送信息的实体 信号：数据的电气和电磁表现 码元：不同离散数字的基本波形 模拟数据（信号）是连续的 数字数据（信号）是离散的 信源、信道和信宿 信源：产生和发送数据的源头 信宿：接收数据的终点 信道： 基带信号是数字0/1；宽带信号是模拟波形 数字信道传输数字信号；模拟信道传输模拟信号 速率、波特和带宽 码元传输速率（波特率Baud/s） 信息传输速率（比特率b/s） 带宽 模拟信号通信：频率范围Hz 计算机网络：最高数据传输速率b/s 传输方式 串行并行 局域网：串行 计算机内部：并行 同步异步 同步传输 外同步：外加时钟 内同步：信号编码同步 ==异步传输==：字节间异步，字节内同步 单工双工 单向：广播 半双工：对讲机 全双工：互联网 编码与调制 数字数据->数字信号 归零（RZ）编码 0：前低后零 1：前高后零 不归零（NRZ）编码（==无自同步==） 0：低电平 1：高电平 曼彻斯特编码：以太网 设定初始信号形式 码元必定在中间跳变 码元==中间==电平变化表示信号0/1 差分曼彻斯特编码 码元==开始==无跳变表示1，有跳变表示0 模拟数据->数字信号 奈奎斯特定理：f_{采样}≥2*f，才能完整保留信号信息 数字数据->模拟信号 调幅（AM）：载波振幅变化表示0、1 调频（FM）：载波频率变化表示0、1 调相（PM）：载波相位变化表示0、1 正交幅度调制（QAM）：R = B*log_{2}（mn） 信道容量 奈奎斯特定理（无干扰） 奈奎斯特速率v = 2Wlog_{2}V W：信道频率带宽范围（Hz） V：码元离散电平数量 香农定理（有噪声） 香农速率C = Wlog_{2}(1+\frac{S}{N}) W：信道频率带宽范围（Hz） \frac{S}{N}：信噪比 [!Note] 计算时注意“二进制”、“十六进制”等字眼，是波特值的含义，则要在v和C中选出最小的 分贝值的大小为 d=10log_{10}(\frac{S}{N})，注意转换 信道复用 频分复用 FDM：不同用户用不同频率的信道，限于模拟信号 时分复用 TDM：分时服务用户 波分复用 WDM：（光的）波长 ！码分复用 CDM 码片m_i：分给每个站码片 m_i，码片之间正交 码片向量：码片 m_i 的1为1，0为-1 站点发送：比特1为码片向量，比特0为码片销量负值 站点接收：与自身码片向量相乘，除以码片长度 II.传输介质 双绞线 同轴线缆 光纤：==外低（反射率）内高（反射率）== 多模：光的全反射；光源为发光二极管 单模：直径小于光的波长，光沿直线；光源为半导体激光 无线传输： 无线电波 激光、红外线、微波 III.物理层设备 中继器 功能：整形、放大并转发数字信号 “5-4-3”原则：5段通信介质由4个中继器连接，最多挂载3个计算机 [!Tip] 放大器放大的是模拟信号 两端可以是不同介质，如无线有线，则两端可以是不同的链路层协议 集线器（Hub） 功能：多端口中继器；整形、放大信号，扩大网络范围 ==半双工== 第三章 数据链路层 实现功能： 封装成帧 透明传输 差错检测 I.数据链路层概述 相关名词 链路：从一个节点到相邻节点的通信信道，中间==无交换节点== 数据链路：链路+链路层协议 帧：数据链路层传输的数据单元 PDU ！服务 无确认的无连接服务：不需要建立连接，不需要确认，如以太网 有确认的无连接服务：不需要建立连接，需要确认，如无线局域网 有确认的面向连接服务：需要建立连接，需要确认，如PPP 设备 交换机（多接口网桥） 工作流程 自学习：收到帧，发现转发表中没有此帧的源MAC和目的MAC，记录MAC和对应接口，并广播到==其他==所有接口 转发：收到帧，转发表中有目的MAC表项，转发到对应接口 工作模式 直通交换：只检查帧首目的MAC地址，直接转发 存储转发：存储到内存中进行检错，错则丢，无损则转发 特点 隔离冲突域：星型一对一 不隔离广播域：广播帧都会被转发 ！功能 封装成帧 在数据前后加上帧首部和帧尾部 帧首部和帧尾部 帧首部：帧起始标志、地址、控制、协议 帧尾部：校验和 以太网V2的MAC帧格式（左尾右首） FCS 数据载荷 类型 源地址 目的地址 4B 46-1500B 2B 6B 6B PPP的帧格式（左尾右首） 标志 FCS 数据载荷 协议 控制 地址 标志 1B 2B 最大1500B 2B 1B 1B 1B 帧定界 帧同步 透明传输 传输的数据不受特殊字符的影响 字符填充：在数据中插入转义字符，如HDLC的ESC(11111101) 字符计数：在帧首部加入帧长度 流量控制 控制==发送方==发送速率，防止接收方缓存溢出 OSI体系中，数据链路层有流量控制的功能 TCP/IP体系中，流量控制由==传输层==负责 差错检测 通过确认重传、CRC检测帧中的错误 CRC：检测帧内位错，将帧看成多项式，除以生成多项式，余数作为校验码 确认重传：帧丢失，超时重传 通信质量好的线路，仅进行CRC检测，重传由上层协议处理 通信质量差的线路，进行确认重传 II.组帧 功能：将网络层递交的分组封装成帧 问题：帧定界、帧同步、透明传输 字符计数法：帧首部添加==计数字段==记录该帧的字节数 字节填充法： 添加SOH、EOT标识帧头帧尾 数据段中存在”SOH、EOT、ESC“字符，前面添加ESC进行转义 （==HDLC==）零比特填充法： 使用01111110标志帧开始和结束 数据字段中每连续5个”1“后自动添加一个”0“ 违规编码法：使用数据传输方式中不用的编码标识首尾 III.差错控制 检错编码 奇偶检验码：数据中”1“的个数 循环冗余码CRC 约定 G(x) = x^{n_k}+x^{n_{k-1}}+···+x^{n_1} 冗余码计算：在源数据后加 G(x) 中 Max(x_{n_k}、x_{n_{k-1}}···x_{1}) 位，进行除法计算 纠错编码 海明码距 d_{min} 检错数量 r = d_{min}-1 校正错误数量 r = (d_{min}-1)/2 海明码：见车爹PPT IV.流量控制和可靠传输 流量控制 流量控制指由==接收方控制发送方==的发送速率。 数据链路层控制的相邻结点之间的流量；传输层控制端到端流量 数据链路层控制方法：接收方是否返回ACK控制；传输层控制方法：接收方在ACK设置窗口值调整发送方的发送窗口 可靠传输 可靠传输是指发送方数据能被接收方正确接收 有线网络数据链路层不负责可靠运输 无线网络数据链路层负责可靠运输 停止等待协议(S-W) 一次只发送一帧 超时重传 一位比特编号 设置帧缓冲区用于重传 后退N帧协议(GBN) 发送方在发送窗口内连续发送 接收方发现丢失一帧，后面全无效 接收方可累计确认，只确认最新连续的一位 发送方接收到ACK后，可直接将窗口后滑 选择重传(SR) 发送方在发送窗口内连续发送 接收方必须每帧都发送确认 接收方检测到错误帧就发送NAK，要求==立即重传==要求的帧 [!Tip] 注意题目中的帧数和帧序号比特数区别 帧序号比特数k：2^k - 1 >= n V.介质访问控制 随机访问控制 ALOHA协议 纯ALOHA协议 发送方：随机发送数据帧，发送成功则等待下一帧，发送失败则等待随机时间后重传，直到发送成功 时隙ALOHA协议 发送方：等待下一个时隙发送数据帧，发送成功则等待下一帧，发送失败则等待下一个时隙后重传，直到发送成功 CSMA协议 1-坚持CSMA协议 发送方：要发送信号时，持续监听信道，信道空闲则发送数据帧，直到发送成功 非坚持CSMA协议 发送方：要发送信号时，若信道忙则等待随机时间后再次监听信道，信道空闲则发送数据帧，直到发送成功 p-坚持CSMA协议 发送方：要发送信号时，若信道忙则等待随机时间后再次监听信道，信道空闲则以概率p发送数据帧，以概率1-p继续等待 CSMA/CD协议 总线型有线网络 半双工通信 发送阶段：检测冲突 争用期 t=2τ ：代表信号在端到端往返的最大时间，若在此时间内没有检测到冲突，则发送成功 最小帧长L_{min} = 2τ*v：保证在发生冲突时，发送方能检测到冲突； 10Mbps以太网：t= 51.2μs，L_{min} = 512bit =64B ！冲突阶段：截断二进制 二进制指数退避算法：R = rand(0,1,···,2^k-1)，k=min(n,10)，n为冲突次数 重传推迟时间t_{backoff} = R*2τ 发送失败：当n >= 16时，发送失败 ！CSMA/CA协议 无线局域网 发送阶段 源站检测信道空闲，等待==DIFS==长度的时间准备发送 源站检测信道空闲，使用==随机避让算法==延迟 [可无此阶段]信道预约阶段 源站广播发送==RTS==报文 目的站等待==SIFS==后，发出==CTS==，通信范围接收到此帧的其他站保持静默（处理隐蔽站问题） 数据传输阶段 源站接收到CTS，等待SIFS后开始发送 目的站接收完数据后，等待SIFS后发送ACK帧回应直到源站接收 此阶段对于其他站为NAV（信道忙）时间 IFS（InterFrame Space）:帧间间隔 DIFS：分布式协调IFS，只在源站侦测到空闲后触发 SIFS：短IFS，在任意类型帧间触发 RTS（Request To Send）：请求发送控制帧 源地址 + 目的地址 本次通信所需时间：SIFS + CTS + SIFS + 数据帧 + SIFS + ACK 即对面接收完RTS开始，到己方接收完ACK结束 CTS（Clear To Send）：允许发送控制帧 给源站明确的发送指令 指示其他站在预约期内保持静默 预约期：SIFS + 数据帧 + SIFS +ACK 即对面接收完CTS开始，到对面接收到ACK结束 NAV（Network Allocation Vector） 预约时间/信道被分配时间 在CTS中标明，NAV = SIFS + 数据帧 + SIFS + ACK 随机避让算法 基本退避时间 2τ 退避计时器在第k次：R=rand(0,1,···，2^{k+2}-1)，k<=6 退避时间 2τ*R 轮询访问 令牌传递协议 源站按环路连接，令牌轮流传递； 一个站点拥有令牌后 无数据发送，则立即传给下一站 有数据发送，将令牌中插入数据发送，每次只能发送一帧； 数据帧在环路循环转发，目的站收到后复制再继续转发； 源站收到后检验帧，出错则重发，否则生成新令牌并传递给下一站。 VI.局域网 概览 介质访问控制方法：CSMA/CD、令牌总线、令牌环 局域网拓扑：以太网、令牌环、FDDI IEEE802定义： 逻辑链路控制（LLC）：无确认无连接、带确认无连接（帧加序号）、面向连接、高速传送、寻址、竞争处理 介质访问控制（MAC）：组帧、差错控制、透明传输 以太网V2/802.3 结构：逻辑总线型、物理星型（一交换机连多终端） CSMA/CD协议 无连接、无确认、不可靠 曼彻斯特编码 网卡（网络适配器）：数据==串并联转换==、直接丢弃差错帧、正确帧触发中断 MAC地址：6B = 48b 以太网V2 MAC帧 MAC层：MAC帧 物理层：前导码（8B，7B前同步码+1B帧开始定界符）+ 以太网MAC帧（64B~1518B） [!TIP] 以太网==没有帧停止定界==，由于使用曼彻斯特编码，发送完一帧后出现电平不变现象，接收方视其为帧结束（类似违规编码思想） 高速以太网 速率 帧间间隔 通信方式 介质访问控制协议 100Mbps 9.6μs 全双工+半双工 CSMA/CD==（半双工）== 1Gbps 0.96μs（缩短信道长度到100M） 全双工+半双工 10Gbps 全双工 全双工不需要访问控制 无线网802.11 802.11帧有==4个地址== 有固定基础设施 基本服务集（BSS）：一个AP + 几个移动站 AP接入点基站： 服务及标识符SSID（WIFI名） 信道Channl 扩展服务集（ESS）：一个分配系统DS + 几个基本服务集BSS DS连接各BSS的基站AP 自组织网络：节点平等，所有节点都有路由功能 802.11帧 结构 地址字段分配 方向 地址1（接） 地址2（发） 地址3（末） 地址4 发送给AP设备 AP地址 源地址 目的地址 — 发送给终端设备 目的地址 AP地址 源地址 — VLAN服务802.1Q 划分方式 基于物理接口 基于MAC地址 基于IP地址 ！802.1Q帧 [!TIP] 比普通V2帧长度多4B，最大帧长1522B 添加后，需要重新计算FSC 结构： TPID：0X8100 PRI：优先级 VID：标识符，==12位== VII.广域网 PPP协议 用户与ISP的通信协议 数据层面：不可靠、无序号和确认 控制层面：面向连接 只保证CRC检错实现无差错接收 面向==字节==、全双工 组成部分 链路控制协议LCP：配置测试链路连接，协商参数 网络控制协议NCP：对接兼容多种网络层协议 组帧方法（规范） ！PPP帧 结构 首尾标志字段F：0X7E，定界符（与V2帧相比，有尾定界符） 同步传输：零比特填充法，防止0x7E（01111110）在内部出现 异步传输：转义字符0x7D 地址字符A：0xFF，无用 控制字符C：0x03，无用 协议字符P：0x0021->IP数据报；0xC021->LCP数据 数据载荷：0~1500B（不用CSMA/CD，无需最小帧长） 帧检验FCS：CRC检验冗余码 连接过程 flowchart TD A[链路静止] --> |物理层链路建立| B[链路建立] B --> |LCP协商失败|A B --> |LCP配置协商|C[鉴别] C --> |鉴别失败|D[链路终止] D --> |LCP链路终止|A C --> |鉴别成功|E[网络层协议] E --> |NCP配置协商|F[链路打开] F --> |链路故障或终止|D 无连接 -> 物理链路 -> LCP链路（控制）-> NCP链路（数据） 第四章 网络层 I.网络层功能 屏蔽了各种局域网的异构细节，如链路层协议、网络层协议（IPv4和IPv6） 路由转发 路由选择 分组转发 服务方式 虚电路 面向连接 保证可靠性 设虚电路号码VCID 建立连接时：分组首部使用完整地址 后续：只使用VCID 工作流程 虚电路建立 A：呼叫请求 -> B B：呼叫应答 -> A 数据传输 A：数据 -> B B：ACK -> A 虚电路拆除 A：释放请求 -> B B：释放应答 -> A 分类 永久性虚电路（PVC） 交换型虚电路（SVC）：临时 数据报 无连接、不可靠 SDN网络 架构 数据平面：终端设备 + 路由器（感觉已经算是交换机了） 控制平面：远程控制服务器计算路由 接口 南向接口：转发设备（路由器）与控制服务器建立连接的接口，如Overflow协议 北向接口：给上层开发者设计应用 东西接口：SDN控制服务器之间的接口 拥塞控制 判断方式：负载增加，吞吐量降低 开环控制 静态，设计时预计所有情况 闭环控制 动态，运行时对反馈的拥塞情况进行调整 闭环：即运行时有反馈环 II.IPv4 IPv4地址 4B = 32bit 分类编址 主机号全0：网络地址标识 主机号全1：广播地址 划分规则： 特殊地址： 划分子网编址 分类编址 + 子网掩码，使部分主机号作为网络号，划分出多个子网 范围：主机号全0、全1无法使用 路由表变化：目的网络地址 + 子网掩码 + 下一跳地址 无分类编址CIDR 去除ABC分类编址的思想，只使用掩码标识网络号长度 从ISP分到网络号后，仍然能自定义掩码长度来划分子网 V4首部格式 段名 长度 作用 版本 4b 协议版本为4 首部长度 4b 单位为4B，长度范围20B~60B，数值范围0101~1111 区分服务 8b 区分类别和优先级，很少使用 总长度 16b 单位为1B，首部长度 + 数据载荷长度 标识 16b 分片后通过同一标识合并 标志 3b MF：1表示后面还有分片，0表示没有；DF：1表示允许分片，0表示不允许 片偏移 13b 单位为8B，数值×8代表本段第一个字节在原数据载荷中的位置 生存时间 8b TTL，每转发一次跳数减1 协议 6b 表示数据载荷协议类型（如TCP、UDP等） 首部校验和 16b 用于检测首部差错 计算分片 片偏移计算（8B整数） 生存时间判断 优化技术 NAT：路由器构建NAT表，将外网地址+端口和内网地址+端口进行映射 NAT路由要看到传输层的端口号 转发时会改变源或者目的IP地址 路由聚合：路由器对需要聚合的网络寻找最长前缀，并和变长掩码一起存入路由表 特殊路由： 特定主机路由：*.*.*.*/32，定位到单个主机 默认路由：0.0.0.0/0，路由表无其他项则走默认路由 ARP 地址解析协议 网络层/数据链路层，自生成报文 每个主机、路由都有ARP表 已知IP地址，需要询问MAC地址 动态维护，一般2min更新 ARP请求报文 主机A发送广播，目的MAC地址为全1 目的主机B收到后，自身ARP表记录A的源IP和源MAC ARP响应报文 主机B单播回应 内容为自身MAC地址 主机A更新ARP表 DHCP 协议 ICMP 网际控制协议 IP报文 网络层数据报转发时状态信息交互 ICMP差错报告报文 终点不可达：路由器/主机==不能交付报文==时向源发送 源点抑制：路由器/主机因为==拥塞==丢弃报文时向源发送 超时：路由器收到TTL==为0==的报文时向源发送，若收不到全部分片则全部丢弃 参数问题：路由器/主机收到==首部字段校验和错误==时丢弃报文，并向源发送 改变路由（重定向）：路由器向源发送，告知源有更好的路由 不发送ICMP差错报告的情况 ICMP差错报告报文，不发送ICMP差错报告 特殊地址不发（广播、回环） 多分片报文只发送一次，后续分片不发 ICMP询问报文 回送请求和应答：PING（应用层） 时间戳请求和应答：Traceroute（网络层） 地址掩码请求和应答 路由器请求和通告 III.IPv6 128b = 16B 基本首部长度固定，选项通过扩展首部实现，扩展首部算在有效载荷内 不能分片，只能由源端分片，目的端合并 中间路由接收到太长的数据报会丢弃报文，并发送ICMP差错报告 V6首部格式 段名 长度 作用 版本 4 内容6 通信量类 8 区分类别和优先级 流标号 20 类似于v4首部标识，同一个“流”内流标号相同 有效载荷长度 16 单位1B，除基础首部的字段长度（包含扩展首部），最大65535 下一个部首 8 无扩展首部时：数据载荷协议类型（TCP/UDP）有扩展首部时：第一个扩展首部类型 跳数限制 8 TTL，路由器转发-1，0则丢弃 V6地址 表示方法 冒号十六进制：每4个十六进制数（2Byte）之间用冒号隔开 左侧0省略：两个冒号间的十六进制数中最前面的一串0可以省略不写；冒号间全为0，可省略只写一个 连续0压缩：多个连续0，可只填俩个冒号，==只能出现一次==，多个则无法定位 可结合点分十进制后缀 地址类型 未指明地址：0:0:0:0:0:0:0:0，::/128，只能作为源地址 回环地址：0:0:0:0:0:0:0:1，::1/128，只有一个 多播地址：FF00::/8，用于多播通信 本地链路地址：FE80::/10，私有地址，只能在本地链路使用 全球单播地址：除了以上，其他都是 全球路由前缀 子网标识 接口标识 48b 16b 64b [!TIP] 由于接口标识可对MAC地址进行编码，所以可以通过IPv6地址直接找到MAC地址，==省去ARP协议== V4和V6地址转换 双栈：同时支持V4和V6 隧道：V4数据报封装在V6数据报中 NAT64：V6数据报封装在V4数据报中 IV.路由协议 RIP协议 应用层，UDP封装 基于距离向量 路由器到直连网络的距离定义为1 只和==相邻==路由器交换自己的路由表 周期30s交换更新路由表，180秒无报文则此路由失效 收敛：每个路由器都知道到达本自治系统AS内各网络的最短距离和下一跳路由器 计算流程： A向相邻的B发送路由表a B将a中所有距离条目加上与A的距离，下一跳改为A 和自身路由表进行比较，选最短的 存在问题：网络N1突然失效，相邻路由器更新成16不可达之后，被相邻其他无法获取到N1状态的路由器路由表影响，16不可达被覆盖为可达。直到多次后才能确认不可达。 OSPF协议 网络层，IP数据报 基于链路状态（量化为代价） 支持CIDR 有鉴别，保证安全 链路状态有32位序号，越大越新 代价计算 cost = 100Mbps/链路带宽 cost大于1则保留整数，小于1则记为1 链路状态表：相邻路由 + 代价 区域划分：为适配大规模网络，OSPF将一个自治系统AS再划分为多个==区域==，限制洪泛范围，减少通信量，但OSPF更复杂了 ==主干==区域连接若干区域 主干路由器：主干区域内的路由器，包含边缘 区域内路由器：只在区域内，不连接主干路由器 区域边界路由器：属于主干路由器，与其他区域连接 链路建立和维护 问候（hello） 建立邻居表 发送周期10s，若40s未收到某方hello则视为其已经不可达 链路状态更新分组（LSU） 链路状态通告（LSA）：直连网络 + 邻居路由器的链路状态信息 ==可靠==的洪泛发送 可靠：需要收到的路由器发送==链路状态确认==报文 洪泛：向所有相邻路由器发送，它们收到后继续转发给相邻 链路状态数据库（LSDB） 每一个路由器都存储，记录链路状态通告（LSA） 通过洪泛使得网络中所有LSDB一致 报文类型 基本工作流程 BGP协议 EGP：与RIP、OSPF内部网关协议（IGP）相对的外部网关协议 连接多个AS的协议 非选择最佳，只求能比较好的到达 基本概念 各AS选择某个路由器作为BGP发言人 BGP发言人运行BGP + AS内部网关协议 目的：构造出AS间不存在环路的树形结构连通图 路径向量：（AS1，AS2） 报文 V.IP多播 基本概念 一对多 多端口转发 IPv4中使用D类多播地址：1110****.*.*.* ==224==.0.0.0 ~ ==239==.255.255.255 一个D类地址代表一个多播组 ！局域网硬件多播 解决本地局域网内多播数据包分发问题 IPv4地址映射多播MAC地址 多播MAC号：前25比特相同，01：00：5E：0 ：··· 后23位来自多播IP地址后23位 由于D类前4位为1110，后23位映射到多播MAC，有32-4-23=5位没映射到MAC地址上，使得一个MAC地址对应2^{5}=32个IP上 在网络层还需要过滤非目的IP的报文（IP和MAC双匹配） 因特网多播 解决多播组设备寻址问题 IGMP 多播路由器运行IGMP，监视本局域网内多播组成员变化 路由器不知道多播组成员数量和网络分布情况 IGMP报文类型 成员报告报文：设备->多播路由器，加入 成员查询报文：多播路由器->设备，是否存活 离开组报文：设备->多播路由器，直接退出 多播路由选择协议 目标：为每个多播组建立多播转发树，使报文只转发一次 IP多播组沿多播转发树洪泛，能传到所有拥有多播成员的多播路由器 多播路由器再进行硬件多播 VI.移动IP 原因：移动设备在某个网络下获得了IP地址 设备在移动状态下需要在不同网域下使用网络 正在提供服务的服务器也需要定位到此设备，移动设备IP不能改变 解决方法：代理 设备在归属地获得永久（归属）地址，上级路由称为归属代理 设备移动到其他网络下 设备使用代理发现协议，在外地网络注册，并提供永久地址和归属代理地址 外地代理通过以上信息与归属地代理建立IP隧道 归属地代理==接收==到数据后，转发给外地代理，外地代理转发给移动设备 移动主机==发送==数据时，交给外地代理直接转发，不需要送给归属代理 第五章 传输层 I.概述 物理层+数据链路层+网络层 -> 主机到主机通信 传输层 -> 进程到进程通信 端口号 区分计算机类进程的数据报文 同设备内一个端口只能建立一个连接 长度：2B 范围：0 ~ 65535（2^{16}-1） 分类 熟知端口：0~1023 登记端口：1024~49151 临时端口：49152~65535 复用分用 复用 TCP/UDP 复用：理解为应用报文打包 IP复用：传输层报文打包为IP报文 分用：理解为解包并分流到各自应用进程 II.UDP 无连接不可靠，不使用流量控制和拥塞控制 检查到错包就丢弃 支持广播、多播、单播 伪首部序号为17 UDP首部 源端口 目的端口 长度 校验和 2B 2B 2B 2B 源端口：可选，不需要时全0 目的端口： 长度：首部+数据，最小8（首部长度） 校验和：需要加上12B伪首部 III.TCP 面向连接 可靠 对==报文段==进行确认 面向字节流 伪首部中序号为6 TCP首部 序号：32b，代表本报文段第一个字节序号 确认号：32b，指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号 数据偏移：4b，数据报长度，单位4B 保留：6b，无用置0 短状态：1有效 URG：紧急报文，首先传送 ACK：为1则确认字段有效 PSH：尽快交付，不保留在缓冲区 RST：复位，释放连接再重新连接 SYN 连接请求报文：SYN=1，ACK=0 连接确认报文：SYN=1，ACK=1 FIN：终止位，代表要求释放连接 窗口：16b，代表接收方所允许的对方发送的数据量（rnwd) 校验和：12b，伪首部+首部+数据载荷计算反码算数运算求和 紧急指针：16b，URG=1时才有效，指明紧急数据的长度，单位1B 建立连接 三次挥手 第一次：SYN=1,ACK=0，==SYN占用一个序号== 第二次：SYN=1,ACK=1，==SYN占用一个序号== 第三次：ACK=1，可带可不带数据，不带数据则不占用序号 [!TIP] 采用“三报文握手”而不是“两报文握手”来建立TCP连接，是为了防止已失效的TCP连接请求报文段突然又传送到了TCP服务器进程，因而导致错误。 左边： CLOSED SYN-SENT ESTABLISHED 右边： CLOSED LISTEN SYN-RCVD ESTABLISHED 四次挥手 第一次：FIN=1,ACK=1，==FIN占用一个序号== 第二次：ACK=1，继续传送数据 第三次：FIN=1,ACK=1，数据传送完，使用FIN表示准备断开 第四次：ACK=1，对方收到后断开，己方等待2MSL [!TIP] 等待2MSL是防止第四次丢失，导致对面无法关闭 左边： ESTABLISHED FIN-WAIT1 FIN-WAIT2 TIME-WAIT CLOSED 右边： ESTABLISHED CLOSE-WAIT LAST-ACK CLOSED 流量控制 接收窗口（rwnd)：发送方维持，代表缓冲区能接受的容量 实现端到端的流量控制（两个进程直接），数据链路层是节点之间的流量控制 滑动窗口+持续计时器 拥塞控制 种类 开环控制：初始即设计好一切情况 闭环控制：引入反馈，边监测边调整 拥塞窗口（cwnd)：发送方的窗口大小 发送上限 = min[cwnd, rwnd] 慢开始 拥塞窗口cwnd从1开始，每经过一次确认（时隔1TTL）后乘2 慢开始门限（ssthresh)：到达限制后cwnd进入拥塞避免 拥塞避免 cwnd到达ssthresh后，每次加一 直到发生超时（拥塞）或者收到三次确认报文，进入下一种调整模式 快重传 报文丢失（非拥塞状态） 接受方发送三次确认报文冗余ACK 发送方立即重传对方所需报文段 快恢复 收到==三次确认报文==后进行 ssthresh调为当前cwnd一半 cwnd调为当前一半 进入拥塞避免 第六章 应用层 I.网络应用模型 C/S模型 服务器：总是打开，提供服务，面向任务 客户机：请求服务，面向用户 特点： 体系内计算机地位不平等 客户机间不直接通信 可扩展性不佳 P2P模型 对等方（Peer）：任意一对计算机，直接相互通信 可扩展性好 网络健壮性好 II.动态主机配置协议（DHCP） 动态分配地址 基于UDP，主机端口68，服务器67 ！工作流程 客户端加入：客户端广播DHCP发现，源地址全0，目的地址全1 服务器接手：DHCP服务器收到后，广播DHCP提供，源地址服务器地址，目的地址全1 客户端接受此服务器，广播DHCP请求，源地址全0，目的地址全1 服务器广播DHCP确认，分配IP地址，源地址服务器地址，目的地址全1 报文 种类 目的 源IP 目的IP DHCP发现 客户端寻找DHCP服务器 0.0.0.0 255.255.255.255 DHCP提供 DHCP服务器确认给此客户端提供服务 服务器地址 255.255.255.255 DHCP请求 客户端要求分配IP 0.0.0.0 255.255.255.255 DHCP确认 服务器分配IP 服务器地址 255.255.255.255 III.域名系统（DNS） 命名系统，方便记忆 基于UDP协议，53号端口 域名服务器 根域名服务器：被所有本地域名服务器所知 顶级域名服务器：com、cn、site等 权限域名服务器 本地域名服务器 解析过程 递归查询 本地主机向本地域名服务器查询 本地域名服务器向根域名服务器查询 根域名服务器向顶级域名服务器查询 ··· 主机->本地->==根域名==->顶级域名->权限域名 根域名负载大 ，基本不用 主机和本地域名服务器之间只使用递归查询 迭代查询 本地主机向本地域名服务器查询 本地域名服务器： 向根域名服务器查询 向顶级域名服务器查询 向权限域名服务器查询 本地域名服务器向主机返回结果 IV.文件传输系统（FTP） 交互式访问，允许用户指明==文件类型和格式== 控制连接：端口21，TCP 数据连接：端口20，TCP 会话过程，服务器保留用户状态信息，追踪用户在远程目录树位置 控制连接 传输控制信息 会话期间保持打开 数据连接 接收到文件传输请求后，创建数据传送进程和数据连接 传送完毕后关闭 模式 主动模式PORT：客户端发送PORT命令和==客户端随机开放端口号x==，服务器通过20与x连接 被动模式PASV：客户端发送PASV命令，==服务器在本地开放随机端口y==，告知客户端 选择权都在客户端上 网络文件系统NFS FTP：修改服务器上文件，先==全部==下载到本地，修改完再传回 NFS：远程打开文件，在文件特定位置读写修改 V.电子邮件（Email） 组成结构 用户代理UA：程序，如QQ邮箱、Outlook软件 邮件服务器：用于发送、接收邮件 邮件发送和读取协议：存取协议 现状：用户通过浏览器使用HTTP协议发送邮件，SMTP只在服务器之间 邮件格式和MIME 格式 信封：从内容自动提取目的人和标题 内容 首部 FROM To Subject 主体内容 MIME 由于SMTP只能传输7位ASCII码文件，需要MIME进行内容扩展，可以讲图片音视频等转换为7位ASCII，并读取恢复 ！发送协议IMAP SMTP==服务器==端口号：25 连接建立 发送方SMTP服务器（客户端）与接收方SMTP服务器建立TCP连接 接收方服务器发出220服务就绪 客户端发送HELLO+客户端主机名 接收方发送250 OK 邮件发送 客户端发送MAIL FROM+主机名 接收方服务器准备好则发送250 OK 客户端发送RCPT TO+收件人地址 接收方服务器准备好则发送250 OK 客户端发送DATA命令 接收方服务器准备好则发送250 OK 客户端发邮件内容，.代表结束 接收方服务器准备好则发送250 OK 客户端发送QUIT 接受方服务器发送221，==主动断开== 接收协议POP3和IMAP POP3 TCP，端口110 工作方式 下载并保留：主机下载完邮件保留在SMTP服务器上 下载并删除：主机下载完邮件删除SMTP服务器的文件 IMAP 允许用户创建文件夹，并移动位置 允许用户只获取邮件部分报文 VI.万维网WWW URL 统一资源定位符 <协议>://<域名（或IP）>:<端口>/<路径> [!TIP] 当浏览器输入URL开始访问(无缓存）： 主机向本地域名服务器发出DNS查询 本地域名服务器 向根域名服务器查询 向顶级域名服务器查询 向权限域名服务器查询 本地域名服务器将结果IP返回主机 主机发起TCP连接请求，三次握手后建立连接 主机发出HTTP请求 服务器处理请求，返回HTTP报文 主机收到报文后进行处理 传输结束，四次挥手结束TCP连接 HTTP 无连接，TCP确保可靠连接 无状态，引入Cookie后实现了有状态 Cookie 网站服务器为用户生成Cookie识别码，在服务器中存储用户信息 网站服务器发送给用户的响应报文中有"Set cookie: ****" 用户在自己的Cookie文件中存储此信息 用户下次访问时，在请求报文中添加Cookie值 服务器识别后提供个性化服务 非持续连接 HTTP1.0：==每个元素==传输都建立一次TCP连接，*2TTL开销** 持续连接 HTTP1.1：建立一次TCP连接后保持，主机发出请求，服务器发送文件 非流水线：一次请求，一个文件 流水线：可连续发送请求（可视为一次），服务器连续发送多个文件 [!WARNING] ！发送大文件时，需要注意TCP窗口大小（遵循慢启动） 报文结构 请求报文 方法+URL+版本：GET xidian.edu.cn HTTP1.1 首部字段名+值：Keep Alive：1 响应报文 版本+状态码+短语：HTTP1.1 202 Accepted
由于在当前的网络环境下部署了软路由+NAS，由软路由延申到我房间的硬路由在DHCP模式下的网络多了一层NAT，无法向上一层访问，但刷了OpenWrt的硬路由没有常见商用路由器的AP模式切换，让路由器将仅作为无线信号扩展设备。只能逐一对LAN口和WAN口以及防火墙进行设定，下文记录一下操作和背后的原理。 1. 关闭 DHCP 服务 进入 Network → Interfaces。 编辑 LAN 接口，在 DHCP Server 选项卡下，勾选 Ignore interface。 保存并应用。 既然只作为 AP 使用了，自然不需要 DHCP 为局域网内的设备自动分配 IP 地址了 2. 设置 LAN 口 IP（避免冲突） 仍在 LAN 接口的 General Settings 选项卡下： 协议切换为静态地址，把 IPv4 地址改为与上级主路由同一网段且不冲突的 IP。 例如：主路由 IP 是 192.168.2.1，此处可设置为 192.168.2.20。 子网掩码与主路由一致（通常 255.255.255.0）。 网关填写主路由 IP（如 192.168.2.1）。 DNS 服务器可填写主路由 IP 或公共 DNS（如 8.8.8.8）。 保存并应用。 此 IP 地址的存在意义： 提供接口地址管理硬路由本身； 和上级软路由网络层通信。 个人曾经的误区：把 AP 模式和交换机模式混为一谈 3. 关闭防火墙并桥接接口 进入 Network → Firewall。 删除所有防火墙规则，或直接关闭防火墙： 在 General Settings 选项卡，将 Forward、Input、Output 全部设为 ACCEPT。 或直接删除所有防火墙区域（确保不阻断流量）。 4. WAN 和 WAN6 处理 方案一 如果固件里有 switch （交换机）的设置项，可以很方便的通过以下办法来实现将 OpenWrt 设置为交换机 / AP 模式，可以充分利用物理 WAN 口充当 LAN 口来用。 进入 Network → Switch； 将 VLAN ID 1 中的 WAN 口设置为未标记； 删除 Interfaces 中的 WAN 口（包括 WAN6）。 方案二 如果固件里没有 switch （交换机）的设置项，可以进行以下设置，但此设置会浪费一个 WAN 口。 删除 Interfaces 中的 WAN 口（包括 WAN6）； 将连接主路由的网线连接到WAN口。
起因 当我在网页版Jellyfin直接播放视频时，虽然内网能够满足数千兆每秒的网速，这些视频仍然经常卡顿（后面分析是网页播放是直接用NAS的核显解码，但它性能捉急），我就选择直接下载到本地。 由于Jellyfin的限制，下载到本地的文件中文名称是经过URL编码后的，比如其中一个文件为“%E8%83%86%E5%A4%A7%E5%85%9A+S01E07.mkv”，看起来是16进制的Unicode编码。 问题 后续在我清理磁盘时，我发现Windows在图形界面上直接删除此类文件时会异常卡死，而换使用终端命令删除时居然无法定位到这份文件，它就像一个黑户一样钉在了磁盘上，Windows的文件系统拿它丝毫没有办法。这就很奇妙了，之前从未遇到过这种情况。 解决 经过一系列查询检索，最终定位到Windows的一个奇妙特性： Windows系统默认的最大路径长度为260个字符（包括盘符、文件夹名、文件名及分隔符\）。如果文件或文件夹的完整路径超过此限制，系统工具（如资源管理器）可能无法正常操作。 一时间确实有点难绷，这种古老的问题能存续到现在也是神奇。最后索性启动Manjaro Linux，干净利落删除了这个文件。 后面和朋友讨论时，他提出了个更简单的操作方法：使用WSL的终端操作磁盘上的文件。确实可行，连重启切系统的功夫都不用了。
第一讲 引言 网络安全核心地位的关键目标 保密性（Confidentiality） 数据保密性 隐私性 完整性（Integrity）(包括不可否认性、真实性) 数据完整性 系统完整性 可用性（Availability） 真实性（Authenticity） 可追溯性（Accountability） 安全攻击 被动攻击 在未经用户同意和认可的情况下将信息或数据文件泄露给系统攻击者，但对数据信息不做任何修改 常见手段 搭线监听 无线截获 其他截获 应对措施：重点在于预防 主动攻击 涉及某些数据流的篡改或虚假流的产生 分类 阻断攻击 伪造攻击 重放攻击 篡改攻击 拒绝服务攻击 应对措施 自动审计 入侵检测 完整性恢复 安全机制 安全机制要具备检测、防御或从安全攻击中恢复的能力，没有单一的机制能够提供所有的安全服务 特定的安全机制（specific security mechanisms） 加密， 数字签名， 访问控制，数据完整性，认证交换，流量填充，路由控制，公证等 普遍的安全机制（pervasive security mechanisms） 可信功能，安全标签，事件检测，安全审计跟踪，安全恢复 安全服务 可认证性 Authentication 访问控制 Access Control 机密性 Confidentiality 完整性 Integrity 不可否认性 Non-repudiation 可用性 Availability 第二讲 传统加密技术 密码学 密码编码学 研究内容：主要研究对信息进行编码，实现对信息的隐蔽 特征 密码编码学常用运算：代替与置换 所用的密钥数：单钥与双钥 处理明文的方法：分组密码与流密码 密码分析学 研究内容：主要研究如何破解密文的方法 攻击的两种常用方法 密码分析学： cryptanalytic attack 穷举攻击： brute-force attack 保护密码算法还是密钥 与维护算法的保密性相比，维护密钥的保密性更容易。 万一密钥暴露了，Alice 和 Bob 可以很容易地更换密钥；而万一算法被攻破，重新设计一个很好的加密算法要难得多。 万一有多对人员需要加密其通信，这些人可以使用相同的算法和不同的密钥，而使用不同的程序则太难。 加密算法 凯撒密码：共有密钥25个、移位、替换 单表代替密码：任意地打乱字母的顺序，密钥数目： 26！＞ 4 × 10^{26} playfair 密码：多字母代替密码，密钥空间：25！≈1.6×10^{25} Hill 密码 加密：C≡KP mod 26，其中，K为密钥矩阵，P、C分别为明、密文分组 解密：P≡K^{-1}C mod 26 维吉尼亚密码 置换密码 第三讲 分组密码与 DES Feistel 密码结构 混淆和扩散 混淆：使得密文的统计特性与密钥的取值之间的关系尽量复杂 扩散：明文的统计特征消散在密文中，使得明文和密文之间的统计关系尽量复杂 DES 加解密 两次置换（初始置换和初始逆置换） 密钥控制下的十六轮迭代加密 轮密钥生成 DES 是一种用 56 位密钥来加密 64 位数据的方法 雪崩效应 明文或者密钥的某一位发生变化，会导致密文很多位的变化 第四讲 代数基础 模运算性质 对称 传递 计算2^{64} mod 2012 \begin{flalign*} &2^2 =4 mod 2012\\ &2^4 =16 mod 2012\\ &2^8 =256 mod 2012\\ &2^{16}=65536 ≡1152 mod 2012\\ &2^{32}=1152^2 ≡1196 mod 2012\\ &2^{64}=1196^2 ≡1896 mod 2012& \end{flalign*} 欧几里得算法（辗转相除法） 求gcd(1970, 1066) \begin{flalign*} &令a=1970，b=1066\\ &1970=1×1066+904\\ &1066=1×904+162\\ &904=5×162+94 \\ &…… …… \\ &10=1×6+4\\ &6=1×4+2\\ &4=2×2\\ &因此gcd(1970, 1066)=2 & \end{flalign*} 求乘法逆元 已知28与81互素，求81 mod 28的逆元。 \begin{flalign*} &81=2×28+25\\ &28=1×25+3\\ &25=8×3+1\\ \\ &1=25-8×3\\ & =25-8×(28-25)\\ & =(-8)×28+9×(81-2×28)\\ & =9×81+(-26)×28\\ &所以81×9≡1 mod 28，同时 28×（－26）≡1 mod 81, 81 mod 28的逆元为9\\ &而28 mod 81的逆元为－26≡55& \end{flalign*} 群环域基本概念 群：群是定义了一个二元运算“•”的集合G，表示为(G，•)$，并且满足以下公理： 封闭性 结合律 单位元 逆元 环：设R是至少含有两个元素的集合，R中定义了两种运算“+”和“•”，如果代数系统<R,+, • >满足以下公理，则称其为环 R关于加法构成交换群 R关于乘法构成半群，即乘法满足封闭性和结合律 分配律 域：设F是至少含有两个元素的集合，F中定义了两种运算“+”和“•”，如果代数系统<F,+, • >满足以下公理，则称其为域 F是一个整环 有乘法逆元：对于任意a ∈F，存在a-1∈F，使得a • a -1=a-1 • a=1成立 基于多项式的有限域构造及运算 密码学中为什么用 GF(2^m) 第五讲 AES 加密 AES 加解密过程 字节代替 行移位 列混合 轮密钥加 轮函数四步：字节代替、行移位、列混合、轮密钥加（注：最后一轮无列混合） AES 密钥生成过程 第六讲A 分组密码工作模式 2DES 加密：C = EK2(EK1(P)) 解密：P = DK1(DK2(P)) 双重 DES 为什么不行？（中间相遇攻击） 中间相遇攻击是一种针对双重加密算法的攻击，需要一个已知的明、密文对，本质上，明文在双重加密中被加密产生中间值，密文在双重加密中被解密产生中间值，表查找方式可以用这种方法改进对密钥的蛮力尝试。 已知明文攻击可以成功对付密钥长度为 112 位的 2DES C = E_{K2}(E_{K1}(P)), X = E_{K1}(P) = D_{K2}(C) 用所有可能的密钥加密明文并存储 用所有可能的密钥解密密文，并与存储的X匹配。如果有相等的，那么获得一组可能的密钥对，并用新的明密文对验证。 概率分析：2^{112}/2^{64}=2^{48}，2^{48}/2^{64}=2^{-16}，两组明密文对后，正确密钥的概率是1-2^{-16}；三组明密对后，正确密钥的概率是1-2^{-80} 付出数量级为 O(256),比攻击单DES的O(255)多不了多 为什么需要分组密码工作模式 如果待加密的消息过长，需要将消息分组后，一组一组的使用加密算法，然后输出密文。在这一过程存在两个问题： 分组密码不能隐蔽数据模式，即相同的明文分组对应着相同的密文分组，容易受到攻击 分组加密不能抵抗重放、插入和删除攻击等。把分组密码算法用在不同环境时，环境不同要求也不同。 为了满足不同要求，需要通过改变分组密码输入和输出的形式，得到分组密码的不同工作模式。 五种工作模式的具体构造及特点 模式 特点 典型应用 电码本 ECB 用相同的密钥分别对明文组加密 单个数据的安全传输 密文分组链接 CBC 有 IV 加密算法的输入是上一个密文组合下一个明文组的异或 加密长度大于 64 位明文 P、认证 密文反馈 CFB 有 IV 分组任意，安全性优于 ECB 模式加、解密都使用加密运算（不用解密运算） 加密长度大于 64 位的明文，分组随意；可作为流密码使用、认证 输出反馈 OFB 有 IV 抗消息流篡改攻击的能力不如 CFB 噪声信道上的数据流的传输,比如卫星通信 计数器 CTR 有 IV 硬(软)件效率：并行、预处理、随机访问、可证明的安全性、简单性：只用到加密算法 分组传输，高速需求的应用 第六讲B 随机数与流密码 随机数基本概念 （随机数在密码学中的）应用 临时交互号，用于防止重复攻击 会话密钥产生 RSA算法中密钥的产生 （对随机数产生的）要求 随机性和不可预测性 基于密码学的随机数生成 循环加密：设E为加密算法，C为计数器，预置其初值为0，K_m为保密的主密钥，每加密一次，产生一个随机数，同时计数器的值加1 用DES的输出反馈方式产生 流密码的基本原理 消息的处理以字节为单位以流的方式进行 伪随机密钥流 keystream 密钥流与明文进行按位的异或运算 (XOR) 密钥的随机性破坏明文中的统计规律 C_i = M_i \ \ XOR \ \ StreamKey_i 不能重复使用密钥流，否则将被破译 第七讲 数论基础 素数基本概念 费马小定理、欧拉定理、素性检测概率算法 离散对数的基本概念 第八讲 公钥密码学与RSA 对称密码弱点 密钥量大 密钥管理困难：传递、换发、保存 无法实现网络中的数字签名、消息认证、用户认证等应用 系统中有 n 个用户，两两进行保密通信： 每个用户需要有 n-1 个密钥 总密钥数C(n,2) = n(n-1)/2 Shamir 盒及公钥密码基本原理 Shamir 盒模型的两点启示： 不事先交换密钥就能进行秘密通信 加密、解密的密钥可以分开 公钥密码基本原理： 使用两个不同的密钥，一个用于加密，一个用于解密 用于加密的密钥 E_k 可以公开，用于解密的密钥D_k 保密 E_k 与 D_k 之间有联系，但不能由 E_k很容易地算出 D_k RSA 公钥密码基本原理及计算 RSA算法密钥的建立 选择素数：p = 17 \& q = 11，计算n = p q =17 x 11 = 187 计算 ø(n) = (p–1)(q-1) = 16 * 10 = 160 选择 e: gcd(e, 160) = 1; 选择 e = 7 确定 d: d*e = 1 mod 160 且 d < 160 d = 23 因为 23 *7=161= 10 * 160+1 公钥 PU = { 7, 187 }，私钥 PR = { 23, 187 } 明文消息：m = 88 (<187) 加密：c = 887 mod 187 ≡ 11 解密：m = 1123 mod 187 ≡ 88 第九讲 其他公钥密码体制 (重点)Diffie-Hellman 密钥交换 中间人攻击 Darth生成两个随机数X_{D1}和X_{D2}，随后计算相应的公钥Y_{D1}和Y_{D2}; Alice将Y_A传递给Bob; Darth截获了Y_A，将Y_{D1}传给Bob，同时计算 K_{2}=\left(Y_{A}\right)^{X_{D 2}} \bmod q Bob收到Y_{D1}，计算 K_{1}=\left(Y_{D1}\right)^{X_{B}} \bmod q Bob将Y_B传给Alice; Darth截获了Y_B，将Y_{D2}传给Alice，Darth计算 K_{1}=\left(Y_{B}\right)^{X_{D1}} \bmod q Alice收到Y_{D2}，计算 K_{2}=\left(Y_{D2}\right)^{X_{A}} \bmod q ElGamal 密码体制 困难问题：离散对数问题 特点：加密是概率算法—有随机数参与 加密过程 设m为明文，随机选择整数k，k与p-1互素，计算 c_1 ≡ g^k mod p c_2 ≡ my^k mod p 密文c=(c1, c2) 解密过程 收到密文c=(c1, c2)后，接收方进行如下计算 \begin{array}{l} c_{2} \cdot\left(c_{1}^{x}\right)^{-1}=m y^{k} \cdot\left(g^{k x}\right)^{-1} =m g^{k x}\left(g^{k x}\right)^{-1} \equiv m \bmod p \end{array} 第十讲 密码学Hash函数 Hash 函数的基本特性、基本设计框架 任意长度的明文进行变换得到相应的函数值，称为散列值(长度固定)。 用途：消息认证码、数字签名预处理、从口令衍生密钥等。 特性： 对任意长度输入进行变换，得到固定长度输出 求逆不可行 抗原像攻击/单向性 对给定 x，很难找到x’≠x，使得h(x’)=h(x) 抗弱碰撞性 很难找到一对不同的x, x’，使得 h(x’)=h(x) 抗强碰撞性 满足1-2为单向散列函数，1-3为弱散列函数，1-4 为强散列函数 CVL 为最终的哈希输出 生日攻击基本原理 攻击者产生一份合法的明文，再产生232个不同的明文变形，构成一个合法明文组； 生成一份非法明文，构造232个不同的非法明文变形，产生一个非法明文组； 分别对以上两个组产生散列值，在两组明文中找出具有相同散列值的一对明文。如果没有找到，则再增加每组明文变形的数目，直至找到。由 “生日悖论”可知，其成功的概率很大； 于是，攻击者找到了一则与合法明文（至少内容合法）具有相同散列值的非法明文。 第十一讲 消息认证码 消息认证码如何设计？基于hash和基于密码的(大致思路) 基于密码 hash 函数的 MAC**：**HMAC 不用分组密码，而用 hash 函数来产生 MAC，因为 hash 函数一般都较快 没有出口限制，(分组密码有出口限制) hash 函数不依赖于密钥，所以不能直接用于 MAC 建议: KeyedHash = Hash( Key || Message ) 基于密码的：采用分组密码（DES）的链接工作（CBC 模式）模式，并把最后分组作为 MAC 看复习PPT，最好能直接画出框图 CMAC：基于密码的消息认证码，框架与 DAA 类似，加密用 AES 和 3DES 实现 第十二讲 数字签名 数字签名的基本特性和用途，如何构造 （私钥签名，公钥验证） 特性： 签名值必须依赖于所签的消息 必须使用对于发送者唯一的信息，以防止伪造和否认 产生签名比较容易 识别和验证签名比较容易 伪造数字签名在计算上是不可行的。包括已知数字签名，伪造新的消息和已知消息，伪造数字签名 保存数字签名的拷贝是可行的 第十三讲 密钥管理与分发 典型的基于对称加密的密钥分发方案（步骤） 公钥基础设施 公钥基础设施 (PKI) 系统是有硬件、软件、人、策略和程序构成的一整套体系 公钥基础设施实体： 端实体 签证机构 CA 注册机构 RA 证书撤销列表发布 CRL 证书存储库 公钥分发机制、X.509 证书、PKI 基本概念 第十四讲 用户认证 Needham-Schroeder 认证协议、Kerberos 基本原理及步骤、基于公钥的远程认证步骤 第十五讲 传输层安全 SSL 协议设计思路、SSL 握手协议过程以及其能对抗攻击的原因 SSL握手协议的具体交互过程 建立安全协商：交换 Hello 消息，对于算法、交换随机值等协商一致 服务器鉴别：交换必要的密码参数，以便双方得到统一的 premaster secret 客户端鉴别和密钥交换：交换证书和相应的密码信息，以便进行身份认证产生 master secret 结束：把安全参数提供给 SSL 记录层检验双方是否已经获得同样的安全参数 SSL的安全性 保护主密钥 保护服务器的私钥 使用良好的随机数 证书链检查 算法选择（强度） 第十六讲 IP安全 IPSec 基本原理、AH、ESP、传输模式、隧道模式、密钥管理基本思路 IPsec 优点 对应用和最终用户透明 在防火墙或路由器中实现时可以防止 IP 旁路 需要时 IPSec 可以提供个人安全性 弥补 IPv4 在协议设计时缺乏安全性考虑的不足 IPsec 两种模式：传输模式和隧道模式 传输模式为上层协议提供保护，用于两台主机间的端到端通信 隧道模式对整个 IP 数据包提供保护
一、 分布式计算概述 1. 分布式系统定义 分布式系统是由一组通过网络进行通信，为了完成共同的任务而协调工作的计算机节点组成的系统 1.1 消息传递模型（Shared-Nothing） 节点之间通过消息传递进行通信 内部运算速度快，但通信速度慢 1.2 分布式计算与并行计算 分布式计算是并行计算的一种特殊形式 并行计算 指令并行 CPU多核并行：多线程编程 多CPU并行（一致性内存共享）：多进程编程 多CPU并行（非一致性内存共享）：分布式计算 基于GPU的并行计算 多机并行计算 1.3 分布式与云计算 云计算 用户角度：是一种服务/应用/交付模式，方便用户随时随地通过网络访问应用程序、存储数据，不是一种技术 与分布式计算的关系 云计算是目标，分布式计算是手段 分布式计算是实现云计算的核心技术之一（还有虚拟化技术，网络通信技术，安全技术等） 2. 构建分布式系统的收益 提高计算能力 提高存储能力 提高网络吞吐能力 提高可靠性 提高可扩展性 提高安全性 实现资源共享 实现跨时空协同服务 3. 分布式系统衡量指标 业务层性能 时间复杂度 空间复杂度 通信复杂度 可扩展性：系统能够适应业务量的增长 容错性：系统在部分节点失效时，仍能正常工作 并发性：系统能同时处理多个请求 透明性：用户感知不到系统的分布式特性 开放性：节点可以动态加入或退出系统 安全性：系统能抵御各种攻击 可观测/可维护性：系统能够监控自身的运行状态，及时发现故障并修复 简记：扩容，容错，并发，透明，开放，安全，可观测 4. 设计分布式系统的挑战 与性能衡量指标 类似 5. 分布式计算任务的分类 5.1 OLTP（联机事务处理） 实时处理大量的短小的事务请求，每个事务请求的处理时间很短，通常是几毫秒到几秒钟 5.2 OLAP（联机分析处理） 对大量的历史数据进行分析，通常是对大量数据进行聚合计算，每个计算任务的处理时间很长，通常是几分钟到几小时 5.3 流式计算 对大量的实时数据进行分析，通常是对数据进行过滤、聚合、统计等操作，每个计算任务的处理时间很短，通常是几毫秒到几秒钟 6. 分布式系统架构模式 6.1 客户端-服务器模式 负载均衡技术 如何架构 通过DNS轮询 通过反向代理 通过负载均衡器 带来的收益 提高系统的可扩展性，弹性增减节点 提高系统的可靠性 提高系统的性能 常用的负载均衡算法及优劣 轮询：简单，均衡，但不考虑节点的负载情况 随机：简单，均衡，但不考虑节点的负载情况 最少连接：考虑节点的负载情况，但不考虑节点的性能 最少响应时间：考虑节点的负载情况，考虑节点的性能，但不考虑节点的可用性 哈希：考虑节点的负载情况，考虑节点的性能，考虑节点的可用性，但不支持动态增减节点 一致性哈希：考虑节点的负载情况，考虑节点的性能，考虑节点的可用性，支持动态增减节点 6.2 主从模式 主从模式的概念 主节点 负责处理客户端的请求，维护系统的状态 从节点 负责处理主节点分配的任务，不维护系统的状态 主从模式的优缺点 优点 提高系统的可扩展性 提高系统的可靠性 提高系统的性能 缺点 主节点成为瓶颈 从节点的状态不一致 6.3 总线模式 总线模式的概念 不同节点通过总线进行通信 消息发送与接受者解耦 异步 分工 6.4 对等模式 对等模式的概念 系统中的所有计算节点任务分工都是对等的 完全相同的软件在不同的节点上运行，只是初始化参数不同 对等模式的优缺点 优点 不会出现单点故障 无需维护系统的状态 缺点 效率低 7. 分布式中间件的概念 7.1 中间件在计算机系统中的位置 中间件是介于操作系统和应用程序之间的软件，它为应用程序提供服务，为操作系统提供接口 7.2 中间件的作用 为开发者提供高层的抽象接口 提高互操作性和可移植性 提供分布式系统的基础设施 7.3 中间件的基本表现形式 独立的后台进程 语言编译/解释器的一部分 函数库 二、分布式系统节点通信技术 1. 基于Socket的通信技术 1.1 Socket的概念 Socket是一种通信机制，它允许不同节点上的应用程序通过网络进行通信 是传输层和网络层提供给应用层的接口 1.2 基于流式Socket（TCP） 建立连接（三次握手） 客户端向服务器发送连接请求 服务器向客户端发送连接确认 客户端向服务器发送连接确认 发送请求 客户端向服务器发送请求 返回响应 服务器向客户端发送响应 关闭连接 1.3 基于数据报Socket（UDP） 发送请求 客户端向服务器发送请求 返回响应 服务器向客户端发送响应 与TCP的区别：没有建立连接的过程，不可靠，不保证数据的顺序 1.4 并发服务技术 多线程——线程池 优点：线程复用，减少线程创建和销毁的开销 多路复用（事件驱动技术） 优点：单线程，减少线程切换的开销，适用于并发连接数少，连接时间短，IO密集的场景 2. 远程过程调用RPC（上层通信技术） 凤凰架构 RPC是一种通信机制，它允许不同节点上的应用程序通过网络进行通信，它是Socket的高级封装，使应用程序可以像调用本地函数一样调用远程函数 2.1 RPC的基本原理 序列化/反序列化 序列化：将对象转换为字节序列 反序列化：将字节序列转换为对象 插桩/代理（stub/skeleton） 插桩：客户端调用本地函数，插桩将函数调用转换为网络消息 代理：服务器端接收网络消息，代理将网络消息转换为函数调用 实现RPC语义的应用层协议 负责远程对象的集中注册与管理 点对点通信的缺点 关系复杂，耦合度高 可扩展性差 2.2 RPC中间件的作用——注册中心的作用 服务启动时，将服务的地址注册到注册中心，客户端从注册中心获取服务地址，实现服务发现 优点： 动态增减节点，负载均衡，容错 2.3 接口描述语言IDL 作用：定义接口，实现语言无关，平台无关，网络协议无关 2.4 RPC调用模式 同步调用 客户端调用远程函数，等待远程函数返回结果 异步调用 客户端调用远程函数，不等待远程函数返回结果，继续执行后续操作 远程函数执行完毕后，通知客户端 3. 基于HTTP的通信技术 Web Service 优点：跨平台，跨语言，跨网络 缺点：效率低，不支持异步调用 RESTful 优点：效率高，支持异步调用 缺点：不支持跨语言，跨网络 4. 基于消息队列（MOM）中间件的通信技术 优势 异步通信，提高系统的并发性 解耦，提高系统的可扩展性 削峰填谷，提高系统的可靠性 通信模式 消息队列 一对一（一个队列，一个消费者） 一对多（一个队列，多个消费者） 发布/订阅 一对多，广播 投递模式 At Most Once 消息可能会丢失，但不会重复投递 At Least Once 消息不会丢失，但可能会重复投递 Exactly Once 消息不会丢失，不会重复投递 缓存模式 持久化 消息持久化到磁盘 非持久化 消息不持久化到磁盘 三、 模型问题 1. 设计分布式系统的挑战 1.1 不可靠的网络——信道故障 传输延迟的不确定性 网络断裂 丢包 乱序 1.2 不可靠的节点 部分节点失效 单点失效 1.3 不可靠的时钟 2.分布式系统的模型 2.1 节点故障模型 fail-stop模型 节点失效后，不会再次恢复 fail-stop-restart模型 节点失效后，会再次恢复 byzantine模型 节点失效后，会再次恢复，但是恢复后的节点可能会发生任意行为 2.2 链路模型 任意链路 丢包、重复包、内容篡改、伪造、乱序、传输延迟抖动 有主动攻击者存在的情况 一般损失链路 只存在丢包、重复包、乱序和传输延迟抖动 链路会发生断裂（Partition），但断裂持续时间是有限的 可靠链路 发送者发出的每个消息都可以被正确接收 但是： 存在传输延迟抖动 接收到消息的顺序可能和发送顺序不一致 可靠FIFO链路 发出的每个消息都可以被正确接收并且不会乱序 如何基于弱假设链路实现强假设链路 如何基于“任意链路” 实现“一般损失链路”？ 利用纠错码、HASH函数、消息认证码、加密算法等手段； 利用SSL/TLS/HTTPS协议 如何基于“一般损失链路” 实现“可靠链路”？ 发送者持续地尝试重传数据包，直到收到ACK； 利用数据包序列号等手段实现去除重复数据包 如何基于“可靠链路”实现“可靠FIFO链路”？ 利用数据包序列号，对收到的数据包进行排序，然后按序列号由小到大依次向应用层投递 2.3 时间同步模式 同步模式 消息传输延迟不超过已知的上限 节点以已知速度执行算法 异步模式 消息传输延迟没有上限 节点在运行期间可能会暂停任意长的时间 部分同步模式 系统大部分时间工作在同步模式； 但在有限时间段（该时间段长度不可预知）内工作在异步 模式； 四、 时钟问题 1. 物理时钟 1.1 单调钟的概念 按照一定频率持续自增； 其绝对值无意义，相对值表示延时或时间差； Java：System.nanoTime() 1.2 墙钟的概念 和日常生活中的日历、天文事件对应的时钟 世界墙钟标准：协调世界时（Coordinated Universal Time） 可能会发生倒流现象（NTP时钟校正、闰秒） System.currentTimeMillis() （1970-1-1 午夜 0点以来的秒数 1.3 NTP实现时钟同步的原理 Cristian算法 客户端发送请求包，以其本地时钟T_1为时间戳 服务器在收到请求T_2及其本地时钟 服务器发送一个带有其本地时钟T_3和T_2的包 客户端在本地对其接收服务器响应的时间戳T4T_4 目标：将时钟校正为 T_3 + ?_{resp} ?_{resp} = \frac{(T_2 - T_1) + (T_3 - T_4)}{2} 2. 逻辑时钟 2.1 Lamport时钟 Happen-Before关系 如果事件a和b是同一个节点（单进程/线程）中的两个事件,事件a发生在事件b之前，那么a \to b 如果a事件是 “节点P_1发送消息m到P_2”，b事件是“节点P_2接收消息m”，那么a \to b 如果a \to b且b \to c，那么a \to c(传递性) 如果a ↛ b且b ↛ a，那么a和b是并发事件 Lamport时钟 每个节点维护一个逻辑时钟，初始值为C_i 每个节点在执行一个事件生（消息产生、消息发送、消息接收都是事件）时，将逻辑时钟加1 每个节点在发送消息时，将逻辑时钟加1，并将当前逻辑时钟作为消息的时间戳 每个节点在接收消息时，将逻辑时钟更新为“当前逻辑时钟”和“消息时间戳”中较大的值加1 2.2 向量逻辑时钟 基本算法 设分布式系统包含 n 个节点N_1,N_2,...,N_n，节点N_i的向量时钟T形式为： T = (T_1,T_2,...,T_n) 其中T[i] = T_j表示节点N_i的逻辑时钟,T[j]表示N_i所知道的关于节点N_j的最大标量时钟值 向量时钟的更新 节点N_i在执行一个事件时，将自己的标量时钟自增； 节点N_i在发送消息时，将当前向量时钟T作为消息的时间戳； 当收到其它节点发送的消息<m,T_m>时，节点N_i将自己的向量时钟T更新为： T[j] = max(T[j],T_m[j]) T[i] = T[i] + 1 优缺点 优点 可以检测出因果关系 缺点 向量时钟的长度随节点数目增加而增加，不适合大规模系统 2.3 向量时钟的应用 全序广播 因果排序广播 五、 分布式存储 1. 复制（多副本）技术 1.1 多副本复制带来的收益和挑战 收益 提供冗余 应对节点失效 提高吞吐率 改善访问性能 挑战 硬件成本 保持一致性困难 1.2 主从技术复制 单主复制 一个领导者，多个从属者 优点：简单 缺点：主节点成为瓶颈 同步复制: 领导者将每个写操作发送给所有从属者，直到所有从属者都确认写操作后，领导者才能确认写操作 异步复制： 领导者将每个写操作发送给所有从属者，但不等待从属者确认写操作，而是立即确认写操作 链式复制： 从属者将写操作发送给其他从属者，而不是领导者，形成一个链式结构 混合复制： 部分从属者采用同步复制，部分从属者采用异步复制 多主复制 无主复制 2. 分布式系统一致性模型 2.1 一致性模型的概念 多个客户端同时访问分布式系统，系统应该保证客户端看到的数据是一致的 2.2 强一致性（线性一致性） 分布式系统对外提供的服务，与单机系统对外提供的服务一致，即客户端看到的对系统的操作是与物理世界真实发生的顺序一致的 2.3 最终一致性和弱一致性 最终一致性 系统保证在没有新的更新操作时，系统最终会达到一致状态 适用于读操作远远多于写操作的场景 弱一致性 系统不保证在没有新的更新操作时，系统最终会达到一致状态 适用于读操作远远多于写操作的场景 2.4 CAP定理 CAP定理指出，对于一个分布式系统来说，不可能同时满足以下三点,最多只能同时满足两点 一致性（Consistency） 所有节点在同一时间具有相同的数据 可用性（Availability） 保证每个请求不管成功或者失败都有响应 割舍分区容错性（Partition tolerance） 系统中任意信息的丢失或失败不会影响系统的继续运作 3. 分布式共识协议 3.1 共识协议的作用 利用共识协议，分布式系统可以在不同节点之间达成一致，从而保证分布式系统的一致性 多副本主从复制 异步通信 容错 3.2 复制状态机的概念 状态机 状态机是一个抽象的数学模型，它包含一组状态和一组操作，每个操作都将状态从一个状态转换为另一个状态 目标：让所有节点的状态机保持一致 用处：某节点的状态机失效，可立即切换到另一个节点的状态机 实现： 每个节点维护一个日志，日志中记录了所有状态机执行的操作 利用共识协议，让所有节点的日志保持一致 3.3 共识协议和分布式一致性的关系 共识协议是分布式一致性的基础 一致性是对用户的承诺 共识协议是实现一致性的手段 3.4 按容错模型分类 失效停止模式共识协议 最多允许f = (n-1)/2个节点失效 Paxos Raft 过程： Leader接收客户端请求，存入日志 将新增日志复制给其他节点 确认日志复制成功，提交日志，执行日志中的命令 Leader选举过程： Leader失效 Follower发现Leader失效，发起选举 超过半数节点投票给某个Follower，该Follower成为新的Leader 修改朝代号，通知其他节点 Zab 拜占庭模式共识协议 原理：通过多数派原则，保证系统的一致性 PBFT VFT 4. 分区（分片）技术 4.1 分区带来的收益和挑战 收益 提高系统的可扩展性 提高系统的可靠性 提高系统的性能 挑战 数据分布不均匀 跨分区查询 事务处理 4.2 分区技术的分类 按主键范围分区 将主键的值按范围划分到不同的分区 均匀分区 将主键的值按范围均匀划分到不同的分区 优点：容易实现点查询，范围查询，排序等操作 缺点：不适合数据分布不均匀的场景 不均匀分区 将主键的值按范围不均匀划分到不同的分区 优点：可处理数据偏斜，热点查询 缺点：需要全局索引，导致查询多了一次网络开销 哈希分区 确定性，随机性，无碰撞性 简单哈希分区 将主键的值通过哈希函数计算，得到哈希值，再通过哈希值对分区数取模，得到分区号 一致性哈希分区 将主键的值通过哈希函数计算，得到哈希值，再通过哈希值对分区数取模，得到分区号 优点： 可处理数据分布不均匀，热点查询； 不用全局索引，减少网络开销 不用事先知道数据分布情况 缺点： 效率低，需要多次哈希计算 在分区数变化时，数据迁移量大 物理储存少时容易出现偏斜和热点问题 4.3 分区技术带来的挑战 分布式事务概念(ACID) 原子性（Atomicity） 事务是一个不可分割的工作单位，事务中的操作要么全部成功，要么全部失败 一致性（Consistency） 事务执行前后，系统的状态保持一致 隔离性（Isolation） 事务的执行不会相互影响 持久性（Durability） 事务执行成功后，对系统的影响是永久的 4.4 分区和复制组和使用 节点内有多个分区，每个分区有多个副本 每个节点充当某些分区的领导者，其他分区充当从属者 4.5 HDFS分布式文件系统 HDFS系统架构 NameNode(主节点) 负责管理文件系统的命名空间，维护文件系统的元数据 DataNode(从节点) 负责管理文件系统的数据块，维护文件系统的数据块副本 HDFS工作机制 读操作 客户端向NameNode发送读请求， NameNode返回数据块所在的DataNode列表 客户端直接从最近的DataNode读取数据 写操作 客户端向NameNode发送写请求 NameNode根据负载均衡策略，返回数据块所在的DataNode列表，共3个 客户端将3个数据节点构成一个流水线，将第一个数据块写入流水线 再向NameNode获取下一个数据块对应的3个DataNode列表 数据复制方法 cd /home/aweip/Software/Distribute/hadoop/hadoopspark/ docker-compose up -d docker-compose down ssh -p 2222 root@localhost start-dfs.sh cd /root/share/mapreduce hadoop fs -mkdir /input mvn clean mvn package hadoop fs -put ./grades.txt /input hadoop jar ./target/AvgGradeStudent.jar com.org.xidian.MapReduceAvgGradeStudent /input/grades.txt /output1 hadoop fs -cat /output1/part-r-00000 cd ../mapreduce2 mvn clean mvn package hadoop jar ./target/AvgGradeClass.jar com.org.xidian.MapReduceAvgGradeClass /input/grades.txt /output2 hadoop fs -cat /output2/part-r-00000 cd ../mapreduce3 mvn clean mvn package hadoop fs -put ./child-parent.txt /input hadoop jar ./target/FatherSon.jar com.org.xidian.MapReduceFatherSon /input/child-parent.txt /output3 hadoop fs -cat /output3/part-r-00000
摸不到的颜色 是否叫彩虹 看不到的拥抱 是否叫做微风 一个人 想着一个人 是否就叫寂寞 命运偷走如果 只留下结果 时间偷走初衷 只留下了苦衷 你来过 然后你走后 只留下星空 那一年我们望着星空 有那么多的灿烂的梦 以为快乐会永久 像不变星空 陪着我 猎户 天狼 织女光年外沉默 回忆 青春 梦想何时偷偷陨落 我爱过 然后我沉默 人海里漂流 那一年我们望着星空 未来的未来从没想过 当故事失去美梦 美梦失去线索 而我们失去联络 这一片无言无语星空 为什么静静看我泪流 如果你在的时候 会不会伸手 拥抱我 细数繁星闪烁 细数此生奔波 原来所有 所得 所获 不如一夜的星空 空气中的温柔 回忆你的笑容 彷佛只要伸手 就能触摸 摸不到的颜色 是否叫彩虹 看不到的拥抱 是否叫做微风 一个人 习惯一个人 这一刻独自望着星空 从前的从前从没变过 寂寞可以是忍受 也可以是享受 享受仅有的拥有 那一年我们望着星空 有那么多的灿烂的梦 至少回忆会永久 像不变星空 陪着我 最后只剩下星空 像不变回忆 陪着我
1. 验光 网配智锐除了基本度数和散光数据，还需要测瞳宽瞳高以及倾斜角，倾斜角需要佩戴镜框去使用专门的机器进行测量。我个人是先在网上购买了镜框，然后去西安一家有蔡司VTS1000设备的眼镜店（地址：西安MOMOPARK写字楼14楼-1403室）验光，其实店里的镜框其实也挺便宜，和网上差的不多，也推荐在店里选购，还能自己去试戴。 2. 网配 这一步比较胡来，在闲鱼上找了一家看起来销售量挺大的店家（江苏盐城），报价够便宜就下单了。将验光单和瞳高倾斜角年龄这些数据发给他，再将眼镜架寄给他所提供的地址（2.20店家签收）。 后续我大概等待了快两周，收到店家发来的快递，里面包含这些东西： 眼镜 两个蔡司镜片袋 智锐青春亚洲版优化光度单（打印时间为2.24） 卡尔蔡司光学（广州）发货单（打印时间为2.24） 看起来店家应该是将镜片镜框邮寄到广州进行加工，再寄回盐城，最后再寄给顾客。 蔡司定制片盾形防伪标识 镜片袋防伪码 3. 体验 新镜片还在适应中，其实也没有那种一眼惊艳，毕竟只是个眼镜。 体验比较明显的是视野好像变大了。智锐说是对视野进行了优化，看远景给人一种超广角的感觉（还有种地狱可能性是度数配高了，凹透镜把东西拉远了），现在还在适应中...... 其次是有些偏黄，没防蓝光镜片那么夸张，但是能感知到。