在计算机诞生之初,它们的体积非常庞大,它们常常被摆放在一个很大的房间内,这些房间通常都装有玻璃墙,你可以透过玻璃欣赏这个神奇的电子物种。一般来说,只有大学或者大型研究机构才会拥有先进的电子计算机,如果你需要通过这些大型计算机完成一些工作,需要走进机房,面对面的和它交流。现在看来,通过这些奇迹工作很不方便,但在当时来说,代表了最先进的科技实力。
随着PC的迅猛发展,以及计算机网络的诞生,很快这些计算机就被连接在了一起,你再不需要走进机房面对面和它交流了,通过远程就可以和他们交流了。当然,早期的计算机网络也是来源于大学和科研机构。然而计算机技术的发展真是太过迅猛了,经过短短几十年,从最早的专业科研机构的计算机网络,到现在的移动互联网、物联网,手机、家电、交通工具都实现了互联。
2.什么是网络编程我们今天所讨论的网络编程是指编写特定的应用程序,使得接入到计算机网络中的设备能够相互通信。网络设备之间的通信,需要程序员设计好特定的协议,然后通过编程语言实现这些协议,最终由计算机设备来执行。在计算机网络的发展过程中,通用的、基础的网络协议已经被实现在计算机操作系统中,通常叫做网络协议栈。而操作系统为程序员提供了网络相关的API,通常把它叫做Socket。为此,网络编程也叫Socket编程、套接字编程。
任何事物的发展都有它的起源和历史,现在我们了解一下Socket的发展史。
3.Socket发展史我们现在以及今后所讨论的Socket都叫做Berkeley(伯克利)Socket,是由加州大学伯克利分校的计算机系统研究小组发布的。从历史上来看,BerkeleySocket是随着4.xBSD(BerkeleySoftwareDistribution)操作系统一起发布的。BSD操作系统最早是在贝尔实验室的UnixV6之上增加了一些新的功能,或者是一些优化,所以不是完全自己实现的,这个版本就是BSD1。从BSD1开始,中间经历了好几个版本,直到BSD4.2开始支持了TCP/IP软件。关于BerkeleySocket的发布历史年表,如下:
4.2BSD()第一个包含TCP/IP的版本。
4.3BSD()对TCP/IP的支持更加完善。
4.3BSDTahoe()支持慢启动、拥塞避免等。
4.3BSDReno()支持TCP头部预测、SLIP头部压缩等。
4.4BSD()支持多播、长肥管道修改等。
由于BSD是基于ATT的UNIX发布的,核心代码都是ATT的UNIX,所以受限于ATTLicense。伯克利的研究人员决定开发可以自由发布的系统,所以在4.3BSDTahoe基础之上,对系统中原有ATT的源码进行重写,发布了BSDNet/x系列,它的历史年表如下:
BSDNet/1()针对网络部分进行移植。
BSDNet/2()对系统中网络以外的组件进行了移植,
BSDNet/3()也叫4.4BSD-Lite,是一个系统功能比较完善的版本,符合BSDlicense的规定。后来出现的OpenBSD、FreeBSD都是基于4.4BSD-Lite修改的。
4.为什么要学习网络编程现代人的生活已经离不开网络,不知道你是否体会过不带手机、家里不能上网的心情。不管你在意还是不在意,网络就在你身边,如影随形。想象一下,现代社会如果没有网络又会是什么状况呢?
当然,作为一名程序员,就算你不需要编写网络程序,但也应该理解网络通信原理。各种网络中间件、分布式框架、微服务框架,其中很大一部分工作都是在处理网络通信的逻辑,要想学习这些中间件不懂网络通信是很难学好的。另外,一些知名的网络库,它里面包含了许多优秀的设计理念和编程技巧,也是非常值得研读的,对于个人技术能力的提升具有很大的帮助。
5.如何学习网络编程要想学习网络编程,需要学习计算机网络基础知识。比如,TCP/IP协议栈工作原理,分组在路由器中的存储、转发原理,可靠协议TCP的工作原理,不可靠协议UDP的工作原理等。
由于网络协议栈的发展是离不开操作系统的,所以需要学习操作系统的基础知识,比如进程、线程的基本概念。
学习编程必须要动手实践,只有当你亲自上机调试一些程序,你才能体会的更深刻,掌握的更牢固。
最后,你需要学会使用tcpdump和Wireshark这两个抓包工具,这俩个工具是解决很多网络相关问题的利器,可以说是开发人员工具箱里面必备工具。tcpdump是linux系统自带的工具,而Wireshark是具有图形界面的工具,一般在Windows系统上使用。同时,要学会应用ipconfig、netstat等网络工具。
本系列文章的所有示例代码路径: