惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 布谷鸟过滤器 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading 布谷鸟过滤器 Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式
计算机网络到底难学在哪里?
2022-01-22 · via 蛮荆

计算机网络到底难学在哪里?

2022-01-22 计算机网络

概述

图片来源: https://www.escotal.com/osilayer.html

无论是 OSI 7 层协议,还是 TCP/IP 4 层协议,网络通信过程中,每一层都被其下一层完全封装,传输层 TCP/UDP 协议封装应用层数据,网络层 IP 协议封装传输层数据 (TCP 数据帧 / UDP 数据报) …,发送方层层封装,到了接收方再层层解封。

问题

作为应用开发者,为什么看了很多经典书籍,仍然感觉网络是雾里看花,没有日常开发写代码那么直观?

计算机网络经典书籍列表

这个问题可以从 “微观” 和 “宏观” 两个层面来回答。


1. 微观

首先,代码在 (非分布式的) 大部分情况下 (未爆出 Bug 之前) 是所见即所得的,但是网络通信过程是透明的,看不见,摸不着,开发者做的大部分工作无非就是两件事情:

  1. 服务端程序只需要绑定/监听端口,接收来自客户端的连接并业务逻辑代码
  2. 客户端程序只需要连接远程服务端程序暴露出来的 IP 地址 + 端口号 二元组,处理业务逻辑代码

其次,开发者日常使用的都是编程语言内置的标准库或者成熟的开源库,生产环境 (现实条件) 也不允许从零开始去实现组件库,当然,更加不可能从零开始读一遍 Linux TCP/IP 协议栈的源代码 (毕竟大学考完试 == C 语言归零)。

再者,相对单纯写业务代码,网络编程是一个较为综合的技术栈,开发者很难直接观察到通信中数据包的传输过程,必须掌握专门的工具(如 tcpdump, Wireshark),并理解对应的各层网络协议的报文格式,而学完了这些,才是编写网络程序的开始 …

最后,单单传统计算机网络教材上的标准 OSI 或 TCP/IP 模型,就够人头大的了,各个协议报文、路由、子网、NAT、VPN、等理论还没想明白呢,又出现了新兴的 SDN、DPDK、eBPF, XDP 等,以及云原生时代下的 Kubernetes 中更为复杂的 CNI、Ingress、ServiceMesh 等网络场景。

普通人的时间和精力都有限,面对不断涌现的新技术,跟也跟不上,学又学不会,另外再来点网络焦虑八股文,成功引发排斥心理,最后的最佳选择当然是躺平。


2. 宏观

首先,应用开发者都是基于所在公司业务编写代码,缺乏解决网络问题的场景和机会,难以形成底层技术的长期积累,自然而然陷入 “杂而不精” 的尴尬局面。

人无法真正精通接触不到的技能,任何领域都一样。

这也就从另一个角度证明,怎么才能学好?没有什么好办法,无非就是多看,多想,多练而已。

这里以网络为例简单来说,可以深入理解理论的前提下,动手写代码 -> 网络抓包 -> 发现问题 -> 对比理论 -> 不断调试 -> 解决问题 -> 循环往复 -> 融会贯通

其次,知识的时效性。及时是学术论文,很多内容也已经滞后甚至毫无价值,更别说书籍 (甚至翻译书籍),技术更新日新月异,任意一点细枝末节都足以产生一篇博士论文了,所以还是要多看英文资料。

再者,好的项目总是有限的,有 “挑战性, 技术含量” 的项目就那么点,不可能每个人都能接触到,不信可以去问问各大厂做基础设施研发的,是不是基本只要两类人:资深开发 VS 应届生 (培养)。

最后,所谓技术的掌握,基础问题和本质问题。

开发者需要学习的是整个领域内的核心知识,想要精通网络,就不能仅仅把目光停留在网络层面上,更要深入理解操作系统、数据结构、硬件、通信甚至物理方面的知识点。

即使是应用开发者,也不要把自己定位成 “纯” 应用 “开发者”。

当然,你可能会说,我不搞网络,换到其他领域不就可以了么?然后你发现很快就会遇到类似下面的问题:

  • 为什么操作系统这么难学?
  • 为什么数据库这么难学?
  • 为什么编译器这么难学?
  • 为什么 XXX 这么难学?