[Python学习日记-75] 计算机基础与网络
简介
计算机基础
什么是网络编程
计算机网络
简介
本篇主要介绍的计算机基础是浓缩的,这是因为我们主要学习的是 Python,而 Python 主要是为了开发应用程序的,并不会用它来开发操作系统和嵌入式程序(因为这两类软件都更加偏向于底层,通常会使用 C、C++ 来进行开发),所以并没有全面的介绍计算机系统基础知识,介绍的更多的是我们平时使用的 PC 和服务器,而且会更加偏向于介绍应用软件与操作系统、PC 与 服务器之间的联系,当然因为是网络编程,所以开发人员对于网络要有基本的认识是非常重要的一件事。
计算机基础
电脑目前已经是走进千家万户的状态了,身边的人几乎没有人说自己完全没见过电脑,但是除了计算机行业的从业者或者是爱好者外基本都只是停留在上网冲浪的阶段,而我们作为开发人员应该更加深入的了解计算机是如何组成以及上面所搭载的计算机软件是如何与硬件进行交互的。
计算机系统(Computer System)是指用于数据管理的计算机硬件、软件及网络组成的系统。它是按人的要求接收和存储信息,自动进行数据处理和计算并输出结果信息的机器系统。人们在谈及计算机系统时,一般指由硬件子系统和软件子系统组成的系统简称为计算机。而将连接多个计算机以实现计算机间数据交换能力的网络设备,则称之为计算机网络,简称网络。
计算机系统可划分为硬件(子系统)和软件(子系统)两部分。硬件由机械、电子元器件、磁介质和光介质等物理实体构成,例如处理器(含运算单元和控制单元)、存储器、输入设备和输出设备等。软件是一系列按照特定顺序组织的数据和指令,并控制硬件完成指定的功能。可将计算机软件进一步分为系统软件和应用软件,系统软件是指支持应用软件的运行,为用户开发应用软件提供平台支撑的软件,而应用软件是指计算机用户利用计算机的软、硬件资源为某一专门的应用目的而开发的软件。典型的计算机系统组成如下图
从存在形式上看,计算机硬件是有形的,而软件是无形的;从计算机功能来看,硬件与软件的界限正在逐渐模糊。在不同的应用场合,基于设计考虑,某些功能可能由硬件实现,也可能由软件实现。比如,较典型的可编程逻辑,它在设计阶段可作为软件对待,但运行中则是以逻辑门的物理形态而存在。
众所周知,我们如果想要播放一个电影,而我们的电影应该是存在硬盘里面的,然后调用到应用软件里面进行播放的,那么中间这个调用的动作应该是由谁来进行的呢?没错就是由操作系统来执行的,以暴风影音为例过程如下:用户打开暴风音影,双击打开相应电影,暴风音影接收到输入,调用操作系统对应接口,然后操作系统操作硬盘指针到指定的扇区读取相应的数据,最后操作系统返回结果给暴风影音,这样就成功打开电影了。
在这个过程当中我们很明显的可以看出,操作系统就是一个相当于中介这样的角色。有的小伙伴就有个疑问了,我们可以不通过操作系统,让应用程序直接操作硬件吗?行,但是不建议,应用程序想要操控硬件的时候是不是要用专门的语言代码(C、C++、汇编...)来对操控,这样除了要开发应用程序外我们还需要额外开发一个控制器程序来操控硬件,结构如下图所示
在这里你可以把控制器看作是应用程序开发的一个子功能,不过现在又面临一个问题,当我们想要再开发多一个 Office 的应用程序来解决文档编辑的问题时我们还要在开发应用程序的同时还要兼顾开发相应的控制器来操控硬件,这样应用程序才能成功的应用在这堆硬件上。我们不妨往前看一看会发现,Office 和暴风音影这两个不同功能的应用程序对于硬件的操控上面却有着很多的相同点,例如都会从硬盘里面读写数据,都会在显示器上面输出信息。那这就说明了在开发这两个不同功能的应用程序的控制器上面存在着重复造轮子的事情,而且开发控制器并不是一件简单的事。所以慢慢的人们就把各类的控制器功能整合起来,这就变成了我们现在所能看到的操作系统。而我们开发应用程序只需要直接调用操作系统预先给我们做好的接口即可,并不需要我们再进行控制器的开发。到这里我们对于目前的计算机系统有了个初步的认识,并且知道了应用程序并不能直接操控硬件,而是需要通过操作系统进行操控,这点在往后的开发当中非常重要。
什么是网络编程
网络编程是指通过计算机网络进行数据传输和通信的编程技术。它涉及到在网络上建立连接、发送和接收数据、实现网络通信协议等方面的开发工作。这类开发我们经常能碰到,包括你现在在看的博客和平常用的微信也是网络编程的一种,常见的网络架构模式有 B/S(Browser/Server,浏览器到服务器)和 C/S(Client/Server,客户端到服务器)。
C/S 架构是一种传统的网络架构模式,相对于 B/S 架构而言有性能、离线工作、客户端自由度高等优势,在 C/S 架构中,客户端和服务器端都需要编写相应的代码。客户端开发常用的开发语言有 Java、C#、C++ 等,主要负责用户界面设计、用户交互逻辑、数据展示等任务;服务器端开发常用的编程语言有 Java、C#、Python 等,主要负责接收和处理客户端的请求,进行数据存取、业务逻辑处理等任务。
B/S 相对于 C/S 而言是 C/S 的改进型,有跨平台、维护方便、数据安全性高等优势,在 B/S 架构当中可以分为前后端开发,前端开发涉及到了多种技术,包括但不限于 HTML、CSS、JavaScript 等,主要负责页面设计、用户交互、数据展示等任务;后端开发会涉及到 Java、C#、Python 等,主要负责处理用户请求、数据存取、业务逻辑处理等任务。
而我们在后面的学习当中将会先以写出 C/S 架构的软件为目标,我们先来了解一下 C/S 架构是如何运作的,如下图所示
结合上图和上文,我们知道想要开发一个 C/S 架构的软件则需要开发出两个软件,即客户端软件和服务器端软件,而中间通过网络来进行通信。既然需要通过网络来通信那就一定会用到一个硬件,那就是网卡了,从计算机基础的介绍我们得知应用程序是通过操作系统来操控硬件的,所以这里的客户端和服务器端都是通过自己的操作系统来操控网卡发送数据到网络的,而在这其中网络到底是什么呢?而作为应用程序开发人员也不需要了解太深入(关于网络的搭建等等的都是网络工程师干的活),我们只需要了解一些应用层和传输层的传输协议即可。
计算机网络
计算机网络是利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,并依靠网络软件及通信协议实现资源共享和信息传递的系统。计算机网络技术主要涵盖通信技术、网络技术、组网技术和网络工程等四个方面。而作为应用开发人员我们接触比较多的是组网技术当中的网络协议,这是因为我们在编程的时候会通过调用这些协议来进行网络通信。
一、网络的发展
纵观计算机网络发展,其大致经历了诞生、形成、互联互通和高速发展等4个阶段。
1、诞生阶段
20世纪60年代中期之前的第一代计算机网络是以单个计算机为中心的远程联机系统,典型应用是由一台计算机和全美范围内2000多个终端组成的飞机订票系统,终端是一台计算机的外围设备,包括显示器和键盘,无 CPU 和内存。随着远程终端的增多,在主机之前增加了前端机(FEP)。当时,人们把计算机网络定义为“以传输信息为目的而连接起来,实现远程信息处
理或资源共享的系统”,这样的通信系统已具备网络的雏形。
2、形成阶段
20世纪60年代中期至70年代的第二代计算机网络,是以多个主机通过通信线路互联起来为用户提供服务。它兴起于20世纪60年代后期,典型代表是美国国防部高级研究计划局协助开发的 ARPANET。主机之间不是直接用线路相连,而是由接口报文处理机(IMP)转接后互联的。IMP 和它们之间互联的通信线路一起负责主机间的通信任务,构成了通信子网。通信子网互联的主机负责运行程序,提供资源共享,组成资源子网。这个时期,网络概念为“以能够相互共享资源为目的互联起来的具有独立功能的计算机之集合体”,形成了计算机网络的基本概念。
3、互联互通阶段
20世纪70年代末至90年代的第三代计算机网络是具有统一的网络体系结构并遵守国际标准的开放式和标准化网络。ARPANET 兴起后,计算机网络发展迅猛,各大计算机公司相继推出自己的网络体系结构及实现这些结构的软硬件产品。由于没有统一的标准,不同厂商的产品之间互联很困难,人们迫切需要一种开放性的标准化实用网络环境,因此产生了两种国际通用的最重要的体系结构,即 TCP/IP 体系结构和国际标准化组织的 OSI 体系结构。
4、高速发展阶段
20世纪90年代至今的第四代计算机网络,由于局域网技术发展成熟,出现光纤及高速网络技术,整个网络就像一个对用户透明的庞大的计算机系统,发展为以因特网(Internet)为代表的互联网。
二、网络协议
在介绍互联网协议之前我们先来举个例子,在中国每个地方都有自己的方言,例如广东有粤语,福建有闽南话,西藏有藏语等等,以前每个地方的人都只会说自己的方言,在本地生活可能没什么困难的,但是一涉及到需要出省的时候就出现语言不通的困难了,这个时候就轮到普通话出场了;普通话作为全国统一的语言,即一个统一的语言标准,可以说去到哪里大家都能听得懂对方讲话,这样国内不同地方的人相互交流那就没什么问题了,但是世界那么大你总想出去看看吧,每个国家都有类似的情况,这时候英语就登场了;英语目前作为全球通用语言来使用,即一个全球统一的语言标准,也就是说理想情况是全球所有人都应该会英语。然而现实世界总是没有那么理想的,全球人不是人人都会英语,全国人也不是所有人都会普通话,不过在计算机世界就不是这样一个说法了,特别是在特别强调互联互通的网络世界。我们将现实世界中的语言系统映射到网络世界当中,网络协议就是现实世界当中的英语,简单来说就是全世界所有计算机的网络连接都需要遵循网络协议才能进行互联互通。而网络协议当中分为了两种模型和两种协议集,即开放系统互联参考模型(OSI/RM)、TCP/IP(Transmission Control Protocol / Internet Protocol)参考模型和 OSI 协议集、TCP/IP 协议集。
1、开放系统互联参考模型
开放系统是指遵从国际标准的、能够通过互连而相互作用的系统。系统之间的相互作用只涉及系统的外部行为,而与系统内部的结构和功能无关。国际标准化组织(International Standard Organization,ISO)公布了开放系统互连参考模型(OSI/RM)。OSI/RM 为开放系统互连提供了一种功能结构的框架。OSI/RM 是一种分层的体系结构,参考模型共有7层(所以也被叫做 OSI 7层模型),分层的基本想法是每一层都在它的下层提供的服务基础上提供更高级的增值服务,而最高层提供能运行分布式应用程序的服务。这样,通过分层的方法将复杂的问题分解,并保持层次之间的独立性。OSI/RM 的网络体系结构如下图所示
1.1 应用层
应用层在 OSI 7层模型中是为应用软件提供接口,使应用程序能够使用网络服务,我们所写的 Python 程序通常就是运作在这一层,常见的应用层协议:http(80)、https(443)、dns(53)、ftp(20/21)、smtp(25)、pop3(110)、telnet(23)。
1.2 表示层
表示层是对数据进行解码和编码、加密和解密、压缩和解压缩的,常见的格式有:
- 图片:jpg、gif...
- 音频:mp3、wma、aac...
- 视频:mp4、avi...
1.3 会话层
会话层负责建立、管理和终止表示层实体之间的会话连接,以及在设备或节点之间提供会话控制,协调通信过程,并提供3种不同的方式来组织它们之间的通信,分别为:单工、半双工、全双工。
1.4 传输层
传输层负责建立端到端的连接,保证报文在端到端之间的传输。它拥有服务点编址、分段与重组、连接控制、流量控制、差错控制的功能。在传输层当中只有两个协议,即 TCP 和 UDP,TCP 和 UDP 将会在后面介绍 TCP/IP 协议集的时候进行详细介绍。
传输层主要负责的就是端口号,一个端口号就代表了一个应用程序,而一个 IP 地址就拥有 65535个端口,而端口号也是有不同的类型的,类型分类如下
- Well Know Ports:0~1023,已划分给特定协议,不能随意使用
- Registered Ports:1024~49511,可以有限地去使用
- Private / Dynamic Ports:49512~65535,可以随意使用
关于 TCP/UDP 常用端口列表:
- Service Name and Transport Protocol Port Number Registry
- TCP/UDP 常用端口列表(中文)
当客户端对服务器端进行访问时源端口(客户端)随机分配,客户端使用的源端口号一般为系统中未使用的且大于1023的端口;目的端口(服务器端)使用知名端口(例如80、443之类的),目的端口号为服务器端应用服务的进程,即一个端口号就可以代表了一个应用程序。
1.5 网络层
网络层是为网络设备提供逻辑地址(例如IP),从而进行路由选择、维护路由表,并负责将分组数据从源端传输到目的端,在这一层的代表就是路由器和三层交换机。
IP 目前有两个版本,分别为 IPv4(32位)和 IPv6(128位) ,其 IP 报头如下
- TTL:生存周期,每经过一次路由将会减1,TTL值为0则丢弃该数据包
常见的 IP 协议有:ICMP(1)、OSPF(89)、EIGRP(88) 。
IP 地址就像是你所住大楼的地址,当客户端对服务器端进行访问时,客户端的 IP 地址可以是随便一个,而服务器端的 IP 地址一定是要固定的,不然客户端将会无法访问服务器端。
1.6 数据链路层
数据链路层是在不可靠的物理链路上,提供可靠的数据传输服务,把帧从一跳(结点)移动到另一跳(结点),在这里面主要涉及到 MAC 地址与 IP 地址之间的相互转换,在这里面涉及到的协议就是 ARP 和 RARP,前者是从 IP 地址转换为 MAC 地址,而后者则是反过程,即从 MAC 地址转换为 IP 地址。它拥有组帧、物理编址、流量控制、差错控制、接入控制,在这一层的代表就是交换机。
1.7 物理层
物理层负责把逐个的比特从一跳(结点)移动到另一跳(结点)。它可以定义接口和媒体的物理特性(线序、电压、电流),定义比特的表示、数据传输速率、信号的传输模式,定义网络物理拓扑(网状、星型、环型、总线型等拓扑),在这一层的代表就是集线器。
2、OSI 协议集
国际标准化组织除了定义开放系统互连(Open System Interconnection,OSI)参考模型,还开发了实现7个功能层次的各种协议和服务标准,通称为 OSI 协议。与其他协议一样,OSI 协议是实现某些功能的过程描述和说明。每一个 OSI 协议都详细地规定了特定层次的功能特性 OSI 协议集如下表所示
网络分层 | 协议集 | |||||
---|---|---|---|---|---|---|
应用层 | VT | DS | FTMA | CNIP/CMIS | MHS | ANS.1 |
ACSE,RTSE,ROSE,CCR | ||||||
表示层 | OSI 表示层协议 | |||||
会话层 | OSI 会话层协议 | |||||
传输层 | TP0,TP1,TP2,TP3,TP4 | |||||
网络层 | ES-IS,IS-IS | |||||
X.25 PLP | CLNP | |||||
数据链路层 | IEEE 802.2 | HDLC PAP-B | ||||
物理层 | 802.3 802.4 802.5 FDDI | RS-232 RS-449 X-21 V.35 ISDN |
常见协议如下:
3、TCP/IP 协议集
TCP/IP(Transmission Control Protocol / Internet Protocol)作为 Internet 的核心协议,已被广泛应用于局域网和广域网中,TCP/IP 的主要特性为逻辑编址、路由选择、域名解析、错误检测和流量控制以及对应用程序的支持等。TCP/IP 是个协议族,主要包括因特网协议(IP)、传输控制协议(TCP)、用户数据报协议(UDP)、虚拟终端协议(TELNET)、文件传输协议(FTP)、电子邮件传输协议(SMTP)、网上新闻传输协议(NNTP)和超文本传送协议(HTTP)等8个。
而 TCP/IP 参考模型其实就是把 OSI 7层模型中用户层面(应用层、表示层、会话层)都整合为一个应用层,以及数据链路层和物理层都整合为网络接口层,故总层数为4层,也被称为 TCP/IP 4层模型,分别为应用层、传输层、网际层和网络接口层。TCP/IP 4层模型也是现在实际使用最多的模型,在后面的学习中主要用到的也是这一个模型。
对于网络访问层,在 TCP/IP 参考模型中并没有详细描述,只是指出主机必须使用某种协议与网络相连。网际层是整个 TCP/IP 体系结构的关键部分,其功能是使主机可以把分组发往任何网络,并使分组独立地传向目标。传输层使源端和目的端机器上的对等实体可以进行会话。这一层定义了两个端到端的协议:传输控制协议(TCP)和用户数据报协议(UDP)。
3.1 TCP
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它负责在网络中可靠地传输数据,并提供流量控制、拥塞控制和错误恢复等功能。使用 TCP 的应用有:Web 浏览器、电子邮件、文件传输程序等。
有一个关于 TCP 的一个笑话:
A:我想听一个 TCP 的笑话
B:你好,你想听 TCP 的笑话么?
A:嗯,我想听一个 TCP 的笑话 。
B:好的,我会给你讲一个 TCP 的笑话。
A:好的,我会听一个 TCP 的笑话 。
B:你准备好听一个 TCP 的笑话么?A:嗯,我准备好听一个 TCP 笑话
B:Ok,那我要发 TCP 笑话了。大概有10 秒,20个字 。
A:嗯 ,我准备收你那个10秒时长,20个字的笑话了。B:抱歉,你的连接超时了。你好,你想听 TCP 的笑话么 ?
不知道你 get 到这个笑话的笑点没有,在这个笑话当中可以感受到 A 和 B 之间在不停地反复确认,TCP 就是会有这个特征,这也是为什么它会被称为可靠的原因之一,我们先来看看 TCP 头部的组成,如下
- URG(Urgent):表示紧急指针有效,需要尽快处理
- ACK(Acknowledgment):表示确认号有效,ACK=1 通常表示这是一个确认数据段
- PSH(Push):表示推送数据,当PSH被设置时,接收方应该尽快将接收到的数据交给应用层进行处理
- RST(Reset):表示复位连接,通常在连接遇到问题时,重置连接用于重新建立
- SYN(Synchronize):表示发起连接,在建立连接时,通信双方会通过发送和接收 SYN 标志来进行握手
- FIN(Finish):表示结束连接,在关闭连接时,通信双方会通过发送和接收 FIN 标志来进行握手
TCP 在数据传输前需要建立一个连接,并且在数据传输完成后需要断开连接。而这里的建立连接就涉及到了 TCP 三次握手了,而传输完成后的断开连接则涉及到 TCP 四次释放,如下图所示
TCP 三次握手过程如下:
TCP 四次释放过程如下:
在数据传输过程中,TCP 会将数据分成多个小的数据包,并按顺序发送到目标主机。如果有数据包丢失或损坏,TCP协议会重新发送丢失的数据包,确保数据的完整性。但是网络难免会发生波动,所以 TCP 拥有滑动窗口机制来应对该状况,使得 TCP 能够根据实际网络状况动态地调整传输速率,并保证数据的可靠性和完整性,具体过程如下
滑动窗口机制的基本思想是发送方维护一个发送窗口,其中包含已发送但未收到确认的数据,发送窗口的起始位置由发送方维护的一个变量来表示。接收方维护一个接收窗口,其中包含已收到但未被接收方应用程序处理的数据,接收窗口的起始位置由接收方维护的一个变量来表示。发送方根据接收方的窗口大小来决定发送数据的数量和速率。一旦接收方收到数据并进行确认,接收窗口的起始位置就会向前滑动,表示已接收的数据已经被接收方应用程序处理。然后发送方再根据收到的确认数来进行发送,这样就能保证接收方时刻都有数据在缓冲区待处理,从而减少网络波动的影响。
由于滑动窗口机制的存在,发送端和接收端都有一个窗口大小的值,表示可以发送或接收的数据的数量。所以在传输过程中 TCP 还会存在窗口确认的过程,接收端通过向发送端发送确认窗口大小的值,来告知发送端自己当前的接收能力。具体过程如下图所示
3.2 UDP
UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的、不可靠的(尽力传递)传输层协议。它与TCP相比,没有建立连接和断开连接的过程,也不提重传机制、供流量控制和拥塞控制等功能,并且只提供基本的传输层功能,不过它因为数据包头较小而且没有网络管理流量,所以可以提供低开销数据传输。使用 UDP 的应用有:域名系统(DNS)、视频流、IP语音(VoIP)、简单网络管理协议(SNMP)、动态主机配置协议(DHCP)、路由信息协议(RIP)、简单文件传输协议(TFTP)、网络游戏等。
3.3 数据的分段和重组
为保证所传输数据的大小符合传输介质的限制要求,并确保不同应用程序发出的数据能在介质中多路传输,TCP 和 UDP 处理数据段的方式都会不同。
TCP:
TCP 的数据段重组是指在接收端将分散的 TCP 数据段重新组装成完整的数据流的过程。在这个过程当中将会使用序列号,其是为了应对在传输的过程中可能会使才分后的数据段到达的先后顺序不同导致的乱序,过程如下图所示
UDP:
UDP 的数据段重组仅仅是将接收到的数据按照先来后到的顺序转发到应用程序,过程如下图所示
4、ISO/OSI 模型与 TCP/IP 模型的对比
ISO/OSI 模型 | TCP/IP 协议 | TCP/IP 模型 | |||||
---|---|---|---|---|---|---|---|
应用层 | 文件传输协议 FTP | 远程登录协议 Telnet | 电子邮件协议 SMTP | 网络文件服务协议 NFS | 网络管理协议 SNMP | 应用层 | |
表示层 | |||||||
会话层 | |||||||
传输层 | TCP | UDP | 传输层 | ||||
网络层 | IP | ICMP | ARP RARP | 网际层 | |||
数据链路层 | Enternet IEEE 802.3 | FDDI | Token-Ring/IEEE 802.3 硬件层 | ARCnet | PPP/ SLIP | 网络接口层 | |
物理层 | 硬件层 |
如上表所示,TCP/IP 分层模型由4个层次构成,即应用层、传输层、网际层和网络接口层。网际层定义的协议除了 IP 外,还有 ICMP(Internet Control Message Protocol)、ARP(Address Resolution Protocol)和 RARP(ReverseAddress Resolution Protocol)等几个重要协议。应用层的协议有 NFS(Network File Serve)、Telnet、SMTP(Simple Mail Transport Protocol)、SNMP(Simple Network Management Protocol)和 FTP(File Transfer Protocol)等。
Internet 的地址主要有两种表示形式:域名格式和 IP 地址格式。域名和 IP 地址是一一对应的。其中 IP 协议版本号为4的,称之为 IPv4;IP 协议版本号为6时,称之为 IPv6。
WWW(World Wide Web)也称万维网,是指在因特网上以超文本为基础形成的信息网。它采用统一的资源定位器(Uniform Resource Locator,URL)和图文声并茂的用户界面,可以方便地浏览 Internet 上的信息和利用各种网络服务。互联网常用的服务包括域名服务(Domain Name Server,DNS)、WWW 服务、E-mail 电子邮件服务、FTP 文件传输服务、Telnet 远程登录服务、Gopher 等等。
三、网络的运作
在客户端和服务器端之间通过网络传输的过程如下
在 OSI 7层模型当中数据包是经过从上到下层层封装后才能通过传输介质来进行传输的,每一层都把上层的协议包当成数据部分,加上自己的协议头部,组成自己的协议包。当客户端进行数据封装时,具体过程如下图所示
当服务器端接收到数据包后也会逐层进行解封装,具体过程如下图所示