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

推荐订阅源

Martin Fowler
Martin Fowler
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
The Cloudflare Blog
WordPress大学
WordPress大学
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
C
Check Point Blog
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
V
V2EX
F
Fortinet All Blogs
B
Blog
大猫的无限游戏
大猫的无限游戏
N
Netflix TechBlog - Medium
B
Blog RSS Feed
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

蛮荆

如何获取更多的免费服务器 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
计算机网络到底难学在哪里?
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 这么难学?