软件工程师需要了解的网络知识:从铜线到HTTP(一)—— 前言
写作目标
本文面向中国互联网届众多的“应用软件工程师”,确切地说,面向 web 后端工程师(Java、PHP),web 前端工程师,移动开发工程师(iOS、Android)。本文将从铜线讲起,一路讲到 HTTP,为大家剖析出一个真实的“网络”。
写作由来
内容来源
前两天我给一个要跳槽的做 iOS 的哥们儿讲了几个小时的网络,给他的面试铺路,在讲之前,我就意识到了这次的内容如果能够整理一下将会是一套丰富的面向软件工程师的网络教程。
为什么是我
我装系统起家,从自己搭建网站开始了解 PHP 技术,大学期间通过做外包成了一名 web 全栈,毕业后创业因为招不到满意的 iOS 于是自己动手写 Swift——当时 Swift 刚刚发布半年,基础库匮乏而且还有缺陷,于是我自己造了一堆轮子,其中就有网络库,于是我对 HTTP 有了深入的理解(实际上超级简单没啥好深入的),又搞了 HTTPS pinning,加上我自己做后端和运维,自己申请、购买、部署证书,对 HTTPS 有了一些了解;后来再次创业自己搭建办公室网络,对路由器、交换机、网关、DHCP、DNS 等的概念有了亲身体会,加上我偶尔也会从我买了不看的书堆中找出《图解 HTTP/TCP,IP/网络硬件》啥的看一看,加上这次讲解的机会,终于融会贯通了。
说说融会贯通
大学时候我对计算机的理解融会贯通的点在“编译”,最近的融会贯通在于我看了神书《CS:APP》,对计算机系统又有了更深入的理解:硬件和操作系统是密切配合的;当前 x86_64 PC 的性能大部分来自于“缓存” + “乐观” 的概念。以后有机会的话我会写文章分享一下我的理解。
本文约定
本系列文章中,我们将进行如下几个重要约定:
- 本文目标是让软件工程师了解网络各层的本质,而不是事无巨细什么都讲
- 有些部分我将会用打比方的形式讲解,目的是让读者更容易理解,而不是每个细节都完全是真实情形
- 如果有我理解的不对的地方欢迎在评论里指出