蛮荆

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

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 这么难学?

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。