网络编程简介
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 工具,方便问题的分析。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。