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