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

推荐订阅源

S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
Arctic Wolf
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
Latest news
Latest news
Help Net Security
Help Net Security
S
Security Affairs
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Help Net Security
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
MongoDB | Blog
MongoDB | Blog
Cyberwarzone
Cyberwarzone
The Last Watchdog
The Last Watchdog
S
Securelist
N
News and Events Feed by Topic
S
Secure Thoughts
F
Fortinet All Blogs
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
M
MIT News - Artificial intelligence
F
Full Disclosure
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
P
Privacy International News Feed
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes

蛮荆

如何获取更多的免费服务器 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 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 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 这么难学?