当前位置: 首页 > news >正文

读书笔记整理--网络学习与概念整合

🌐 IP地址与网络基础

IP地址就像快递单上的地址,是网络中设备的“门牌号”。IPv4地址有32位,最多约43亿个。过去我们学A、B、C类地址划分,现在更常用的是CIDR方式。

为了支持更多设备,网络被分为**广域网(WAN)**和**局域网(LAN)**。公网IP用于WAN,私有IP用于LAN。通过NAT技术,一个公网IP可以代表多个私有设备,大大扩展了地址容量。

家庭网络通常使用`192.168.xx.xx`这样的C类私有地址,所以你家的IP大多是192.168开头的。

---

🔁 NAT与内网穿透

IPv4地址不够用?NAT(网络地址转换)路由器让整个内网共享一个公网IP,极大节省地址资源。

普通NAT只改IP地址,容易冲突;更常用的是**NAPT**,同时修改IP和端口号。

NAT也带来一个问题:公网无法直接访问内网服务。**内网穿透**技术解决了这个问题,让你在公司也能访问家里的电脑。

---

📡 ICMP与网络连通性

我们常用`ping`测试网络是否通畅,它其实是基于**ICMP协议**的封装。ICMP是网络层协议,不是传输层。

ICMP报文分为**查询报文**和**差错报文**,用Wireshark抓包可以看到详细信息。注意:`ping`不通不代表网络完全不可用,有些设备会关闭ICMP响应,但不影响TCP/UDP通信。

---

🛠️ 网络设备演进史

- 两台电脑用网线直连即可通信。
- 设备多了用**集线器**,但它会广播,效率低。
- **交换机**(数据链路层)能学习MAC地址,减少广播。
- 互联网规模下,交换机不够用,**路由器**(网络层)登场,通过网段定位路径。

现在家里很少用集线器和独立交换机,路由器通常集成了交换机功能,电脑接上路由器,再通过光猫就能上网。

---

🔌 Socket与TCP/UDP

**Socket**是一套网络连接的数字标识符。

- `sock`在内核,`socket fd`在用户空间。
- 内核通过`sock`结构体实现网络传输,用户通过`socket fd`操作网络。
- 服务端用**四元组**(源IP、源端口、目标IP、目标端口)区分客户端连接。

**TCP**有重传、流量控制、滑动窗口、拥塞控制等机制,保证可靠传输,但速度相对慢。

**UDP**无连接、无复杂控制,通常更快。但有些项目(如《王者荣耀》的KCP)在UDP上实现自定义重传机制。

> 注意:UDP+重传时,若数据包太大且未分段,丢一个分片就要重传整个包,这时TCP反而可能更快。

---

🔄 TCP连接管理:挥手、自连接与同时打开

- 四次挥手中,FIN包可能由主动close或进程被杀触发。
- 大量`FIN_WAIT_2`状态?可能是对端不close。
- `close()`关闭收发,`shutdown()`可单独关闭一方。
- 挥手可能合并为三次,甚至出现**自连接**(自己连自己,挥手两次)。
- 两个客户端也能直接建立连接,称为**TCP同时打开**(四次握手)。

这些场景虽不常用,但能帮你理解TCP的灵活性。

---

🧠 TCP连接队列:半连接 vs 全连接

- `listen()`时会创建两个队列:**半连接队列(SYN队列)** 和 **全连接队列(Accept队列)**。
- 第三次握手前连接在半连接队列,完成后移到全连接队列。
- `accept()`只是从全连接队列取一条连接,不参与握手过程。
- 半连接队列是哈希表,全连接队列是链表。
- 队列满时可能丢包或发RST,可设置`tcp_syncookies`应对SYN Flood攻击。

客户端没有这两个队列,但有一个全局哈希表管理连接,支持自连接和同时打开。

---

🚨 RST复位报文:异常连接的“杀手”

- RST是TCP标志位,用于异常关闭连接。
- 应用层读/写时才会感知到RST,常见错误如“Connection reset by peer”。
- RST发出后不需确认,丢了对方可能不知道,但重传或keepalive会触发新RST。
- 序列号不在窗口内的RST会被静默丢弃。
- 故意构造合法RST可实现**RST攻击**(请勿模仿)。

---

🧩 粘包问题:TCP与UDP的差异

- TCP是字节流,无边界,可能粘包。
- 接收端需根据应用层协议解析消息边界。
- 关闭Nagle算法不能根本解决粘包。
- UDP是数据报,有明确边界,无粘包问题。
- IP层会分片,但不管内容,也不存在粘包。

> TCP发10次,收可以分100次读;UDP发10次,收必须分10次收。

---

🧩 分段 vs 分片

- TCP分段用**MSS**,IP分片用**MTU**。
- TCP分段后,IP层通常不用再分片,重传也只需传小段。
- MSS根据MTU计算,可动态调整。
- IPv6禁止中间设备分片,只能在端到端进行。
- **PMTU发现**可探测路径MTU,TCP可靠,UDP可能丢包。

---

🚪 连接不存在的端口

- 连接一个IP正确但端口不存在的主机,对方会回复RST。
- 如果目标机器有防火墙,可能收不到RST,只能不断重试SYN。

---

🌐 HTTP与Nginx

- HTTP状态码:200成功,4xx客户端错误,5xx服务端错误。
- Nginx做反向代理和负载均衡,客户端不关心后端是谁。
- 后端服务崩溃时,Nginx可能收到RST,返回**502 Bad Gateway**。
- 502是Nginx生成的,后端可能无日志,需查Nginx日志或监控服务状态。

---

🔁 HTTP vs RPC

- TCP是无边界的数据流,HTTP和RPC都是在TCP之上定义的应用层协议。
- RPC是一种调用方式,gRPC、Thrift是具体实现。
- RPC不一定基于TCP。
- 过去HTTP用于B/S,RPC用于C/S,现在界限模糊。
- 很多RPC性能优于HTTP/1.1,但HTTP/2.0也有很强竞争力。

---

🔄 WebSocket:全双工通信利器

- TCP是全双工,但HTTP/1.1是半双工。
- WebSocket支持全双工,适合服务端主动推送(如网页游戏)。
- WebSocket与Socket无关,只是名字像。
- 它先通过HTTP握手升级,之后使用WebSocket格式通信。

---

📬 DHCP:动态获取IP地址

- 插上网线后,计算机会通过DHCP获取IP、掩码、网关等。
- 四个阶段:Discover → Offer → Request → ACK。
- 曾连过的话可跳过Discover。
- DHCP是应用层协议,基于UDP(支持广播)。
- 获取IP后会发无偿ARP,确认无冲突才使用。

---

🔐 HTTPS与TLS

- 非对称加密基于大数取模和欧拉定理,公钥加密只有私钥能解。
- HTTPS = HTTP + TLS,主流是TLS 1.2。
- TLS握手四次,涉及两对非对称密钥(服务器 + CA)。
- 理解三个随机数(Client/Server Random、Pre-Master Secret)有助于掌握流程。

---

## 🌍 DNS:高并发的分布式系统

- DNS是层次化、缓存丰富的分布式系统,设计思路值得借鉴。
- 通过DHCP或手动配置获取DNS服务器。
- 根域服务器有13组IP,国内有很多镜像,用户可就近访问。
- DNS可用UDP或TCP,小于512字节用UDP。

---

## 🛣️ 任播技术

- 同一个IP对应多个服务器,路由器选最近路径。
- 任播可实现负载均衡和高可用,但不能替代Nginx。

---

 🔒 SSH:安全的远程登录

- 早期用telnet,明文传输不安全。
- SSH分两阶段:交换信息生成对称密钥 → 加密通信。
- 支持密码登录和公钥登录(推荐后者)。
- 使用时注意检查服务器指纹,避免中间人攻击。

---

 🔁 回环地址与本地地址

- `127.0.0.1`是回环地址,`localhost`默认解析到它。
- ping回环地址或本机IP都不会出网卡,数据在本地网络栈处理。
- 服务监听`0.0.0.0`时,可用`127.0.0.1`或本机IP访问。

---

🧭 路由与ECMP

- 路由器根据目标IP匹配路由表,选最优路径。
- 默认网关用于无匹配时。
- 多条路径成本相同时,称为等价路径。
- **ECMP**可同时利用多条路径,提高带宽利用率。
- 同一连接的数据包走同一路径,减少乱序。

---

 📦 网络丢包:不可避免但可管理

- 网络链路长,丢包难免。
- TCP重传保证传输层可靠,但应用层需自己实现业务确认。
- 接口延迟高或失败时,可用`ping`或`mtr`检查丢包。

---

 🖥️ Unix Domain Socket:本机进程通信利器

- 用于本机进程间通信,不走网络栈,性能更高。
- 比localhost通信更轻量,适合高性能服务。

---

🎚️ QoS:服务质量调度

- QoS通过优先级调度保证网络体验。
- IP头中的DSCP字段标记服务质量等级。
- 拥塞时TCP通常优先级高于UDP,但音视频等UDP流也可能被优先。
- 基于UDP的应用可换端口、加前向纠错,规避QoS限制。

---

📦 序列化与反序列化

- 常见方案:XML、JSON、Protobuf、Thrift。
- XML适合复杂结构和可读性要求高的场景。
- JSON轻量、易读,广泛使用。
- Protobuf、Thrift性能高,适合大数据和性能敏感场景。

---

🔍 Protobuf详解

- 数据以键值对形式组织:tag + value。
- tag包含字段序号和类型信息。
- 数组通过重复tag表示。
- 数字用Varints编码压缩。
- 嵌套结构体像“俄罗斯套娃”。
- 默认值不序列化,节省空间。

---

 💾 文件存储与CDN

- 文本数据存MySQL,缓存用Redis。
- 视频、图片等文件用OSS存储,CDN加速。
- CDN回源时可能比直连更慢。
- CDN优势:就近调度 + 缓存重复文件。
- 内网服务+低频访问文件可不接CDN。

---

🤔 遗留思考题

> `mtr`命令是如何知道到达目标地址路径上每一跳路由器的IP地址的?

http://www.dtcms.com/a/494337.html

相关文章:

  • 老铁推荐个2021网站好吗wordpress 入口文件
  • 前端自动化部署全流程(Jenkins + Nginx)
  • 音视频处理(一):什么决定了你的音色?声音的三要素
  • python+uniapp基于微信小程序的助眠小程序
  • ELK运维之路(Filebeat第二章-7.17.24)
  • (未成功)Chrome调试避免跳入第三方源码(设置Blackbox Scripts、将目录添加到忽略列表、向忽略列表添加脚本)
  • 网站建设毕业答辩问题学建设网站首页
  • 大模型在企业云计算领域的核心应用能力要求
  • CloudDM:一站式数据库开发管理工具
  • 适合用struts2做的网站批量发布网站
  • Azure OpenAI 错误码处理完整指南
  • NuxtJS从0到1开发SSR项目-添加Nuxt UI
  • 如何检查本地是否存在 Docker 镜像 ?
  • 查询工程建设项目的网站泉州网站制作平台
  • 单序列和双序列问题——动态规划
  • 【建模与仿真】基于TPE-SVM的乳腺癌诊断可解释人工智能方法
  • 2.5、物联网设备的“免疫系统”:深入解析安全启动与可信执行环境
  • 【小白笔记】理解 PyTorch 和 NumPy 中的张量(Tensor)形状变化unsqueeze(0)
  • 消息中间件选型的艺术:如何在RocketMQ、Kafka、RabbitMQ中做出正确决策
  • Java 反射机制核心类详解:Class、Constructor、Method、Field
  • 如何建立一个网站查询数据韶关市住房和城乡建设管理局网站
  • 【CSS 技巧】实现半透明边框的正确方式 —— 使用 background-clip: padding-box
  • CSS学习笔记(一):Flex布局全攻略
  • 【CSS 技巧】CSS 多层阴影(box-shadow)炫酷边框效果详解
  • Flink Data Source 理论与实践架构、时序一致性、容错恢复、吞吐建模与实现模式
  • 深度学习领域的重要突破:YOLOv3 目标检测技术解析
  • 工作事项管理小工具——HTML版
  • 快速上手 Tailwind CSS:一份现代化的样式解决方案
  • 【文档】部署开源项目 mayfly-go
  • asp.net网站很快吗界面设计与制作主要学什么