为了账号安全,请及时绑定邮箱和手机立即绑定
慕课专栏

目录

索引目录

网络编程32讲

原价 ¥ 58.00

立即订阅
01 开篇词:带你走进网络编程的世界
更新时间:2020-09-16 16:50:58
能够生存下来的物种,并不是那些最强壮的,也不是那些最聪明的,而是那些对变化作出快速反应的。——达尔文

什么是 Socket 编程?

你好,我是陈子兴,是一名老程序员,在音视频实时通讯行业有着十多年从业经验。在接下来的几个月里,我会和你一起学习 Socket 编程相关技术。Socket 编程也叫网络编程,是针对接入网络的各种设备进行编程,从而满足人们学习、工作、生活的需要。我们后续会开发一个 nwchecker 程序,目的是检查网络的连通性,实现结构如下:

图片描述

如图中描述,nwchecker 是一个 C/S 结构的网络应用程序,基本功能就是 Client 定时发出 ping 请求,Server 收到 ping 请求后回复 pong 响应,Client 能够收到服务器的 pong 响应,证明网络状况是良好的。Client 和 Server 的结构是对称的,分为 4 层:nwchecker 应用层、TCP 层、IP 层、Ethernet 层。nwchecker 定义的是应用层协议,即 ping/pong;TCP 是传输层,通过端口号标识一个服务;IP 层代表一个网络主机,通过 IP 地址来寻址;Ethernet 是以太网层,通过 MAC 地址来局域网寻址。关于这些技术概念,本专栏会一一讲到。

在这几十年里,计算机网络技术给整个世界带来了难以想象的变化,真是说不完道不尽啊。从最早只能透过玻璃窗才能看到连接起来的神秘计算机到今天人手一部手机,你可以随时上网娱乐、购物、交易。尤其是近年来移动互联网和物联网的飞速发展,人们的吃、穿、住、用、行已经完全离不开手机了。你有没有因为手机没电而吃不上饭的经历呢?不管你在意还是不在意,网络就在你身边,如影随形。想象一下,现代社会如果没有网络又会是什么状况呢?

网络的重要性毋庸置疑,那么是否每个程序员都需要学习网络编程呢?就作者本人的工作经历来看,不管你的工作是否和网络传输直接相关,最好还是认真学习一下网络编程。如果你有条件,最好研究一个或者多个网络中间件,比如 ACE,libuv 等。接下来,我就谈一下自己的经历和感受吧。

为什么要学习 Socket 编程?

我是 2006 年毕业以后进入华为接入网产品线,从事的是接入网软件开发。在校招面试的时候,面试官考察了 OSI 模型、TCP/IP 参考模型、TCP 三次握手等相关知识。后来在担任 team leader 期间也参加过很多次面试,面试题自然少不了网络相关的知识。比如,TCP 的 TIME_WAIT 状态是怎么产生的,有什么影响?epoll 的基本工作原理是什么?

其实在华为的这段时间内,工作内容可以说是和网络编程没有直接关系。我是在一个基础平台之上做控制协议开发,只需要调用别人提供的 API 即可,并看不到 socket、listen 等 API 调用。然而软件本身是 C/S 架构,经常遇到收不到消息的问题,如何分析解决此类问题呢?这就需要一定的网络知识,需要会使用一些网络分析工具,用以判定网络是否连通、是否有丢包等。

我接触的第一个跨平台网络层中间件是 ACE,它是通过 C++ 语言实现的。ACE 针对网络层进行了面向对象抽象和封装,不仅大量应用了工厂模式、单例模式、代理模式等常用的设计模式,而且针对网络事件提出了特有的 Reactor 模式和 Proactor 模式,充分体现了依赖倒转原则。后来分析过 Linux 内核 2.6.3 网络协议栈,不仅加深了自己对网络协议栈实现的理解,而且学习到了很多设计思想。比如,我在产品设计中借助了 Linux 网络协议栈 sk_buff 的设计思想解决数据包共享的问题。

学习完 ACE 和 Linux 网络协议栈以后,发现分析 libuv、Nginx 等源码会轻松很多。这些开源网络项目实现思想基本是类似的,比如大家都通过 Reactor 模型来实现事件驱动机制。我好像是掌握了内功心法一样,发现多数开源组件的实现是套路相同、招式不同。

总体来讲,学习网络编程不单单是学习网络协议相关知识,更重要的是要学习网络中间件的设计思想和实现思路,这会增加你的技术深度,使你更容易做出正确的方案选择和技术决策。

怎样学习 Socket 编程?

首先,我会和你一起学习 TCP/IP 参考模型中提出的主要协议,比如 TCP 和 UDP。学好这些协议,只是看书是完全不够的,需要动手实践。tcpdump 和 wireshark 是我们最好的老师,在分析协议工作原理的时候,我会和你一起通过 wireshark 抓包,一步一步分析相关协议格式,搞清楚协议的基本工作原理。

其次,我们主要学习 BSD Socket API,像 linux、Mac OS 等 UNIX-Like 系统都是采用 BSD Socket API。Windows 系统的 winsock1 也是采用 BSD Socket API。当然 Windows 系统的 winsock2 是 Windows 风格的 API,本专栏不会涉及。只要我们学好了 BSD Socket API,回头学习 winsock2 会容易很多。我会编写一些小程序来讲解这些 Socket API 具体用法。Socket API 的返回值是非常重要的,不同的返回值往往意味着发生了不同的网络状况,要想编写健壮的网络程序,必须仔细处理这些返回值。

最后,我们一定要熟练应用 tcpdump 和 wireshark 这两个抓包工具。同时,要学会应用 ipconfig、netstat、nload 等网络工具。

所谓学以致用嘛,我们最后一起开发一个网络检测工具,可以检测网络带宽、延迟、抖动、丢包等技术指标。开发这个工具一定要采用事件驱动的 I/O 模型,让我们的小程序有一种高大上的现代感。

Socket 编程要学习哪些内容?

专栏分为介绍篇、基础理论篇、Socket 编程基础篇、Socket 编程高级篇、总结篇,一共是五个部分。每个篇章包含的内容,可以概览下图。

图片描述

后记

工欲善其事必先利其器。学习 Socket 编程一定是少不了做实验,所以需要准备一个 linux 环境,可以安装自己喜欢的发行版。如果你是第一次用 Linux,推荐你用 Ubuntu 最新版。可以在自己的电脑通过 VMware 虚拟机虚拟一台 Linux。

另外需要在 Windows 上安装 wireshark,这是一个非常便于协议分析的图形化工具。在 Linux 上使用 tcpdump 即可,这是系统自带的工具,适合抓包和进行简单的文本化分析。

在学习 Socket 编程的过程中,涉及到协议格式、工作原理,我会做实验抓包分析。希望你能像我一样动起来,亲自去做实验分析,这样会理解的更透,记忆的更牢。

那就让我们一起努力吧!

}
立即订阅 ¥ 58.00

你正在阅读课程试读内容,订阅后解锁课程全部内容

千学不如一看,千看不如一练

手机
阅读

扫一扫 手机阅读

网络编程32讲
立即订阅 ¥ 58.00

举报

0/150
提交
取消