Python高效开发实战:Django、Tornado、Flask、Twisted(第3版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 TCP/IP网络

TCP/IP是Transmission Control Protocol/Internet Protocol的简写,翻译成中文为传输控制协议/互联网络协议。TCP/IP是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式及传送方式。TCP/IP是Internet的基础协议,也是一种计算机数据打包和寻址的标准方法。

2.1.1 计算机网络综述

计算机网络是指将地理位置不同的、具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递。

20世纪90年代后,以Internet为代表的计算机网络得到了迅猛发展,Internet成为世界上最大的计算机网络。Internet主要由主机、线路、交换、路由、调制解调器等设备组成。网络应用开发者无须具体了解Internet的架构及物理细节,把Internet看作由主机和传输设备两部分组成即可,如图2.1所示。

图2.1 Internet抽象图

主机有不同的形式,主要分为两种:服务器和客户端。在Internet中提供服务的主机叫作服务器,如各大门户网站、社交平台等;通过访问服务器从而获得有用信息的主机叫作客户端,如各种家庭计算机和智能手机。

注意:本书所讲的Web编程是指基于Internet网络的应用编程。

1. 网络分层

将数据从一台主机传输到另一台主机是一个复杂的过程,包括信息格式转换、分发、寻址、物理传输等,在这个过程中还要加入多种校验措施以保证传输的正确性。为了使这个过程利于设计并且向开发者隐匿网络细节,计算机网络被分割为不同的层,每一层表示不同的抽象程度和设计目的。每一层的功能相互独立,这使得它们可以仅完成自己的任务,如传输、编码等。Internet是基于TCP/IP网络而搭建的,TCP/IP将网络分为4层结构,分别是应用层、传输层、网络层、接口层,如图2.2所示。

图2.2 TCP/IP网络分层

对TCP/IP网络分层从上到下解释如下。

• 应用层:Application Layer,为用户的进程直接提供服务,应用层负责发送及接收什么数据、如何解释数据、如何呈现数据、如何加密数据等问题,是网络应用程序开发者重点打交道的对象。例如,HTTPS定义了网络间数据加密及认证的标准方法,HTML定义了网页的解析方式等。

• 传输层:Transport Layer,为两个主机的不同端口(Port)之间的通信提供服务。端口是一种在同一主机内的不同通道之间进行寻址的方式。传输层的发送方与接收方在物理上无须相邻。TCP/IP的传输层包括两种协议:TCP和UDP。TCP提供可靠的有序传输,UDP提供非可靠的传输。

• 网络层:Network Layer,为两个主机之间提供通信服务。网络层定义了数据如何被封装为传送包,并且定义了不同主机之间的寻址方式。主要由IP组成,辅以ICMP、IGMP等路由协议。本书的Internet开发者只需了解IP即可。

• 接口层:Link Layer,负责相邻物理设备之间的信息传输。接口层的工作非常多且复杂,它需要完成接口层的数据组装(形成Frame),加入必要的控制和校验数据,并且将二进制数据流(0/1)转换为物理链路上的标准电平(高电平、低电平)。针对不同的物理传输介质,接口层定义了多套标准,并且这些标准随着电子技术的进步而不断发展,如802.3、802.11等。

2. 网络设备

网络设备及部件是连接到网络的物理实体。网络设备的种类繁多且与日俱增。本节的网络设备特指Internet除主机外,仅起网络传输及数据交换作用的设备,具体包括集线器、交换机、网桥、路由器、网关、网络接口卡(NIC)、无线接入点(WAP)、调制解调器、光缆等。开发者无须精通网络设备的原理及配置技术,但需要了解各种设备的作用及其所在TCP/IP的层次。

• 集线器:简称HUB,是接口层设备。集线器是网络互联的最简单设备,它接收并识别网络信号,然后再生信号并将其发送到网络的其他分支上。

• 交换机:即Switcher,是接口层设备,也是网络互联中最常用的设备。它与集线器的差别是,集线器本身不能识别目的地址,而交换机可以。当同一局域网内的A主机向B主机传输数据时,数据包在经过集线器时在网络上是以广播方式传输的,由每一台终端通过地址信息来确定数据包是否属于自己;数据包经过交换机时,交换机会根据Frame目的地址直接发送给B主机所在的链路。因此,在网络中用交换机替换集线器通常能提高网络的整体性能。

• 网桥:Bridge,是接口层设备。网桥通常用于物理异构的网络之间相互连接,如以太网和令牌网之间。

• 路由器:即Router,是网络层设备。路由器是互联网的主要节点设备,通过发送者、接收者的IP地址和路由算法决定数据的收发路径,这一过程叫作“Routing”。

• 网关:Gateway,是一个通用概念,主要指不同网络环境之间的协议转换,一般为应用层设备,如一个专用于数据存储转发的服务器。

• 调制解调器:即Modem,俗称“猫”,是接口层设备,用于连接计算机网络与传统通信网。调制解调器将计算机的数字信号转译成能够在常规电话线中传输的模拟信号。因为模拟信道的传输距离更长,所以长距离的网络传输一般都需要经过调制解调器转接。常见的家用调制解调器包括56k猫、ADSL猫、光纤猫等。

• 无线接入点:即Wireless Access Point,是接口层设备。将有线网络转为无线网络,最常用的无线接入点即WiFi。

• 防火墙:即Firewall,是传输层及应用层的设备。防火墙通常位于不同网络的边界处,主要用于防止恶意程序及数据进入内部网络,或者防止机密信息泄露到广域网中。企业级网络通常用防火墙抵御非法入侵。

3. IP地址

网络地址(Network Address)是一个网络层概念,是互联网上的主机在网络中具有的逻辑地址。Internet上采用IP地址表示网络地址。当前有两种形式的IP地址,即IPv4和IPv6。

IPv4诞生于1982年,随着TCP/IP的发展壮大,缔造了当今的计算机网络通信模式。IP地址是一个32位二进制数的地址,在表达方式上以4个十进制数字表示,如172.16.32.3、10.38.96.243等。从理论上讲,有大约60亿(232)种可能的地址组合,这似乎是一个很大的地址空间。实际上,一个IPv4地址被划分为两部分:网络地址和主机地址。根据网络地址和主机地址的不同位数规则,可以将IP地址分为A(8位网络ID和24位主机ID)、B(16位网络ID和16位主机ID)、C(24位网络ID和8位主机ID)3类,由于历史原因和技术发展的差异,A类地址和B类地址几乎分配殆尽。

由于IPv4的数量限制,IPv6应运而生。IPv6由128位二进制数组成,在表达方式上用8个16进制数字表示,如d23:4334:0:0:23:ade:9853:23。单从数量级上来说,IPv6所拥有的地址容量约是IPv4的8×1028倍,达到2128个。这不但解决了网络地址资源数量的问题,也为除计算机外的设备连入互联网在数量限制上扫清了障碍。然而让人遗憾的是,IPv6自1999年开始分配以来,并没有在互联网上得到广泛应用。目前互联网的主要地址表达方式及其调制仍主要以IPv4为主,但IPv6必将会替代IPv4。

4. 域名

由于IP地址由纯数字组成,很难让人记忆,且不能表达功能、地理位置等附加含义,所以在TCP/IP网络形成不久,标准化组织就定义了域名这种主机地址表达方式。

域名(Domain Name)是一个应用层概念,是由一串用点分隔的名字组成的Internet上某台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置、地理上的域名或有行政自主权的一个地方区域)。域名是一个IP地址的“面具”。一个域名是便于人们记忆和沟通的一组服务器的地址(网站、电子邮件、FTP等)。使用域名作为标记互联网计算机的名称已有30多年的历史,世界上第1个域名是在1985年1月被注册的。

域名中的标号都由英文字母和数字组成,每个标号不超过63个字符,字母也不区分大小写。标号中除连字符(-)外不能使用其他标点符号。级别最低的域名写在最左边,而级别最高的域名写在最右边。由多个标号组成的完整域名总共不超过255个字符。读者所熟知的域名如www.baidu.com、www.sina.com.cn等。

5. URL

URL即统一资源定位符,是用来表示Internet上资源位置的标准。资源位置包括资源所在的主机及其在主机内的访问路径。这里所说的资源是指Internet上任何可访问的对象,包括文本、图像、视频流等。URL的标准形式如下:

其中,协议可以是HTTP、FTP等应用层协议;主机是域名或IP地址;端口是传输层端口号;路径是以“/”分割的主机内的路径;参数是以“&”分割的若干键值对。典型的URL包括http://www.mysite.edu:80/app/search.html?page=1&name=david、ftp://10.45.213.20:21/myfile等。

2.1.2 TCP和UDP

TCP/IP传输层是网络中承上启下的关键一层,向上对应用层提供通信服务,向下将应用信息封装为网络信息。传输层连接主机之间的进程,同一主机中不同进程的网络通信通过端口进行区分,所以传输层为主机提供的是端口到端口的服务。

TCP和UDP是Internet中传输层最重要的两种协议,由于开发者不可避免地要与传输层打交道,因此本节将介绍网络开发所必需的TCP和UDP知识。

1. 端口

这里所说的端口,不是计算机硬件的I/O端口,而是软件级的概念。就像IP地址是网络层的寻址方式一样,端口是传输层的寻址方式。端口是一个16位二进制数表达的正整数,数字范围为0~65535,即一个在网络上通信的主机理论上最多有65535个传输层信道。但由于在操作系统和一些应用中端口也被用作同一主机上不同进程之间的通信,因此通常可用的网络端口数量少于65535个。

应用程序(调入内存运行后一般被称为进程)通过系统调用与某端口建立连接(Binding,绑定)后,传输层传给该端口的数据都被相应的进程所接收,相应的进程发给传输层的数据都从该端口输出。由于TCP/IP传输层的TCP和UDP是两个完全独立的软件模块,因此各自的端口号也相互独立。

注意:TCP和UDP可以在同一主机上使用相同的端口而互不干扰。例如,TCP有一个53号端口,UDP也可以有一个53号端口,两者并不冲突。

每种网络的服务功能都不相同,因此有必要将不同的封包发送给不同的服务来处理,当主机同时开启了FTP与WWW服务时,网络上发来的数据包就会按照端口号来给予FTP服务或者WWW服务。Internet上的很多标准应用层协议有默认的使用端口号,如表2.1所示。

表2.1 常用默认端口号

2. TCP

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。当应用层向TCP层发送用于网间传输的用8位字节表示的数据流时,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它通过网络将包传送给接收端实体的TCP层。TCP的特性总结如下。

• 有序性:为每个数据包编排序号,使接收端能够判断先后到达的次序混乱的数据包的原本顺序。

• 正确性:TCP用一个checksum函数来检验数据是否有错误,在发送和接收时都要计算校验和,这使得接收端能够判断数据是否在传输过程中被破坏。

• 可靠性:发送端采用超时重传及确认机制识别错误或丢失数据,进行重发。

• 可控性:接收端和发送端的网络质量通常不同,TCP采用滑动窗口协议和拥塞控制算法使数据的发送速度达到合理值。

TCP采用面向连接的方式收发数据,在收发数据之前需要先建立连接,在数据传输之后释放连接,如图2.3所示。

图2.3 TCP传输模型

建立连接的三次握手过程如下。

• 建立连接时,客户端发送SYN包到服务器,并进入SYN_SENT状态,等待服务器确认。

• 服务器收到SYN包,反馈给客户端一个SYN+ACK包,此时服务器进入SYN_RECV状态。

• 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,客户端和服务器同时进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

建立连接后双方可互相发送消息,完成后可由任意一方发起关闭连接请求。关闭连接的过程如下。

• 关闭请求方(如客户端)向另一方发送(如服务器)一个带有FIN附加标记的报文段。

• 服务器收到这个FIN报文段之后,并不立即用FIN报文段回复客户端,而是先向客户端发送一个确认序号ACK,同时通知相应的应用程序:对方要求关闭连接,使应用程序做相应的清理工作。

• 服务器的应用程序清理工作完成后,向客户端发送一个FIN报文段。

• 客户端收到这个FIN报文段后,向服务器发送一个ACK,表示连接彻底释放。

3. UDP

UDP(User Datagram Protocol)是一种无连接的传输层协议,提供面向事务的、简单的、不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小,因此UDP能提供更快速、轻量级的传输层控制。UDP的特性总结如下。

• 数据可以随时发送、接收,没有建立、断开连接的过程,因此主机不需要维护复杂的连接状态。

• UDP不保证数据的可靠传输,仅尽最大可能进行发送。

• 没有拥塞控制算法控制收发速度,程序需在应用层自行控制。

• 发送方的UDP对应用程序交付的报文,在添加首部后就向下交付给IP层,既不拆分,也不合并。因此,应用程序需要选择合适的报文大小。

由此不难总结出UDP协议适用的应用场景:吞吐量大(因为只做轻量级控制)、可以承受信息丢失(因为传输不可靠)。在网络状况良好的情况下,UDP的丢包率在实际情况下也非常低,所以仍有很多经典协议采用UDP进行传输,如SNMP、NFS、DNS、BOOTP等。

2.1.3 C/S及B/S架构

C/S,即Client/Server,是当前大多数网络编程所使用的架构模型。通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端,降低系统的通信开销。Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。

B/S,即Browser/Server,是Web兴起后的一种架构模式。B/S使用Web浏览器作为客户端的应用软件,所以B/S可以看作C/S的一种特殊情况。B/S架构是伴随着Internet的兴起而兴起的,是对C/S结构的一种改进,它的主要特点如下。

• 便于部署、维护与升级:主流企业的软件开发流程与方法也从传统瀑布模型转为迭代式敏捷开发。软件系统的改进与升级节奏的加快对系统的快速部署、升级提出了很高的要求。B/S架构的产品明显体现着更为方便的特性,因为B/S系统的所有应用程序都部署在服务器上,一般无须更新客户端软件(即浏览器)。

• 跨平台、开放、对客户端要求低:客户端计算机的软硬件环境千差万别,虽然大多数使用Windows系统,但近年来macOS操作系统也越来越普及,另外也有少数钟情于Linux系统的用户。传统C/S架构需要针对每种操作系统开发相应的客户端程序;而因为每种操作系统都支持Web浏览器,所以基于B/S架构的系统只需开发一套客户端程序。B/S架构的客户端程序部署在服务器端,由浏览器在访问时下载到客户端运行。

• 对安全性的要求较高:由开放性而延伸的一个负面作用就是B/S架构对系统安全性的要求比C/S架构高。B/S架构的系统一般建立在广域网上,面向未知用户,所以开发B/S系统时应该更加关注系统的防攻击、数据加密、备份、防伪造等能力。

在本书要讲解的Python网络框架中,Django、Tornado和Flask均是以B/S架构为主的框架,Twisted主要面向C/S架构系统。