Internet
的整个体系结构,符合TCP/IP
协议栈,应用层在协议栈的最上层。
本节主要知识点为:
- 网络应用的体系结构:网络应用有哪几种体系结构?(客户机/服务器、
P2P
、混合结构)和单机应用有哪些不一样的地方? - 网络应用对底层,传输层、网络层、链路层以及物理层构成的网络基础设施有哪些服务方面的需求?(可靠性、带宽、时延等方面)。
Internet
传输层服务模型提供了什么样的传输服务模型?(TCP/UDP
)。- 具体地介绍几个网络应用及协议(
HTTP
、SMTP
、POP
、IMAP
、DNS
、P2P
)。 - 如何来开发网络应用?(
Socket
编程、TCP
、UDP
)。
网络应用的基本原理
网络应用体系结构
- 网络应用和单机应用相比有哪些本质性区别?
网络应用需要有网络的基础环境,有一部分软件跑在我们自己的计算机上,还有一部分软件和数据信息运行在互联网的某一个地方,这两部分软件又互相交互,才共同构成了一个网络应用。
- 既然网络应用由不同的部分构成的,那它应该采取什么样的体系结构呢?
网络应用经过这么多年的发展,基本形成以下三种体系结构:1. 客户机/服务器结构;2. 点对点结构;3. 混合结构
- 客户机服务器结构:称之为客户机服务器的原因在于功能决策上的划分,服务器对外提供服务,客户机使用服务器所提供的服务。
服务器:7*24小时提供服务;永久性访问地址/域名;利用大量服务器实现可扩展性。服务器往往要为成百上千万的客户机提供服务,并发用户数同时请求服务的可以达到几万,几十万,这往往需要大量的服务器,分布式的技术来实现。客户机:与服务器通信,使用服务器提供的服务;间歇性接入网络;可能使用动态ip地址;不会与其它客户机直接通信。
最直观的就是
Web
应用,服务器端使用Web
软件,客户机使用浏览器。客户端向Web
服务器发出请求,服务器将页面和对象封装成http
响应发回客户端。
- P2P:
P2P
的特点是:没有永远在线的服务器;任意端系统/节点之间可以直接通讯;节点间歇性接入网络;节点可能改变IP
地址。P2P
这种结构平时接触最多的就是文件共享BT
。
P2P
与Web
相比有哪些优点和缺点?:P2P
的最大的优点是高度可伸缩可扩展;缺点是难于实现和管理。
- 混合结构:能否将
P2P
和CS
混合起来使用,使其能够结合两者的优点的同时规避两者的缺点?
在Napster
中文件的传输使用P2P
结构,而文件的搜索采用C/S
结构,集中式。每个节点向中央服务器登记自己的内容,每个节点向中央服务器提交查询请求,查找感兴趣的内容。
网络应用进程通信
上一小节从宏观,体系结构上认识了网络应用。这一小节深入了解网络应用的构成。网络应用由不同的部分构成,有些运行在PC
机上,有的运行在远端的服务器上。而两者显然需要正确的协作,才能够完成其功能,保证网络性能。这就需要本机的网络进程和服务器端的网络进程之间需要通信。这就是网络应用的核心,本质上是网络进程之间正确的通信,然后完成功能。
进程为主机上运行的程序。同一主机上运行的进程之间如何进行通信?这一块由操作系统进程间的通信机制提供。不同主机上运行的进程如何通信?这个依靠的是消息交换,或者称之为报文交换。在消息交换或报文交换中我们有客户机进程(发起通信的进程)、服务器进程(等待通信请求的进程)。那么在P2P
架构的应用中是否存在客户机进程和服务器进程之分?也是有的,P2P
中也会有消息交换,所以也会有发起通信的进程和等待通信请求的进程。不同的进程之间的通信实际上是依靠的一个叫套接字的机制(Socket
)。这是操作系统提供的一种抽象,他把网络的硬件基础设施和网络协议栈(链路层、网络层、传输层)抽象为Socket
。
进程通过套接字来使用下层协议栈所提供的服务,比如TCP
。这样进程间的通信就通过Socket
发送/接收消息。将其类比于寄信Socket
就像是门一样,发送方将消息送到门外的某个信箱里面去,然后依赖于(门外的)传输基础设施,将消息传到接收方所在主机,并送到接收方门外,接收方从门外获取消息。
所以说传输基础设施是进程间通信所依赖的东西。它由网络协议栈构成,由操作系统提供,相当于是操作系统提供的网络编程API
。如果我们要开发网络应用,我们就需要调用这些API
,网络应用的开发也被称作Socket
编程。Socket
处理传输一些消息,还可以对底层网络协议进行一些选择和设置。
网络应用之间依靠的是消息传输。那消息发出去之后,底层的传输基础设施如何正确无误的送到目标进程?这里就会有一个进程的标识问题,可以称为寻址。
寻址问题:不同主机上的进程通信,那么每个进程必须拥有标识符。因为其是不同主机上的,所以第一步是标识主机,标识主机就是依靠一个叫IP
地址的东西。因为主机上会跑很多网络应用,所以只依靠IP
地址是不够的,我们还需要端口号,我们为主机上每一个需要通信的进程分配一个端口号。有一些端口号是被约定的,不能够随便用,比如说80
端口被HTTP Server
占用,Mail Server
占用25
号端口。所以IP地址+端口号唯一标识网络上的进程。
- 应用层协议
具体的消息交换的格式,什么样的顺序等等依靠的是应用层协议。网络应用都应该遵循应用层协议,但是并不是说网络应用只有应用层协议。比如说Web
应用包括浏览器软件,包括服务器软件,还包括html
文件等等,不止是一个http
协议。但是这些软件是要符合http
协议的。所以说网络应用需要符合应用层协议。
应用层协议有公开的协议RFC
(Request For Comments)定义,用公开的协议目的是为了互操作。如果需要知道某个协议的所有信息就需要去都RFC
文档。
除了公开的协议外还有些私有的协议,多数P2P
文件共享应用考虑商业上的竞争就会采用私有协议。
- 内容
一个应用层协议会规定有几种消息,所以会规定消息的类型,比如有请求消息,有响应消息。他也会规定消息的语法(syntax
)格式,比如消息当中有哪些字段(field
),每个字段是如何描述的。下图是HTTP
请求消息的格式:
我们也可以规定字段的语意(semantics
,字段中信息的含义),也会做出关于规则的描述,比如进程应该何时发送/响应消息?又比如进程应该如何发送/响应消息?等等这些规定。
网络应用的需求与传输层服务
计算机网络应用依靠的是不同进程之间的消息交换,依靠的是遵循相同的应用层协议,然后正确进行消息交换,消息交换并不是应用层自己做的,按照TCP/IP
的分层,它是由传输层、网络层、链路层等等共同来提供的传输的基础服务。
所以这里就会引出两个问题:1. 网络应用有这么多种,不同的应用显然对于消息传输的需求不一样,这种不一样如何衡量?2. 底层传输层到底为应用层提供了什么样的服务?
- 网络应用对传输服务的需求
- 第一个方面是关于数据丢失(
data loss
)和可靠性(reliability
)方面的需求。
有一些网络应用是能够容忍一定的数据丢失,比如网络电话,又比如说在线看视频等等。但是有些网络应用要求100%
可靠的数据传输,包括文件传输。
- 另外一个是关于时间方面的要求,有些应用只有在时延足够低的时候才有效,典型的就是网络电话/网络游戏。
- 第三个方面是关于带宽的要求,某些应用只有在带宽达到最低要求时才有效,比如网络视频,如果带宽比较低的话,就是卡的没法看。而某些应用能够适应任何带宽-弹性应用,像
email
。
- Internet提供的传输服务
当我们知道了如何刻画网络应用的需求的时候,我们就可以来看internet
提供了什么样的传输服务?Internet
提供两类传输服务,TCP
服务/UDP
服务。
- TCP服务
TCP
是一种面向连接的服务,也就是说客户机和服务器两者在进行消息交换之前要建立一个连接,这个连接一旦建立起来就是一个全双工的。TCP
是提供可靠的数据传输,它可以把底层的不可靠转变为可靠,能够把数据不丢包、不乱序地传输。TCP
还提供了流量控制功能,能够控制发送方不会发送速度过快,超过接收方的处理能力。TCP
还提供了拥塞控制,当网络负载过重时,能够限制发送方的发送速度。但是TCP
并不提供誓言方面的保障/不提供最小带宽保障。
- UDP服务
UDP
服务是无连接的,也不提供可靠的数据传输,也不提供可靠性保障、流量控制、拥塞控制、延迟保障、带宽保障统统都不保证。这种方式给了应用层极大的发挥空间,给力我们掌控数据传输的一种能力。
Web应用
Web
最基础的构成是网页,但是只有Web
并不会有今天的互联网,另外一个重要的要素是网页之间的互相链接。网页(Web Page
)包含多个对象(objects
),对象是HTML
文件、JPEG
图片、视频文件、动态脚本等。每个网页会有一个基本的HTML文件,在这个文件当中,会包含对其他对象引用的链接。有了这样一个机制,才有了今天的万维网。
在计算机里面,每一个文件都会有一个唯一的路径来区分,互联网上的文件我们也需要对其进行区分,这里就会涉及到对象的寻址(addressing
),也就是Web
对象如何来寻址?如何来标识?依靠的是URL
(Uniform Resoure Locator
,统一资源定位器)。它有一个基本的格式:Scheme://host:port/path
。协议+主机+端口号+路径。这样就能够使得所有的资源都有了唯一的标识符。
HTTP协议
Web
应用所遵循的协议就是http
协议,也叫超文本传输协议(hypertext transfer protocol
)。这个协议采用的是客户机服务器架构。客户是浏览器,主要是请求Web对象,接收Web对象,解析Web对象,展示Web对象。另外一端就是服务器,也叫Web Server
,能够响应客户的请求,生成响应消息,然后把对象发给客户。
最典型的Web
服务器软件就是Apache
软件。Http
协议也有不同的版本。Http
协议所使用的传输层协议是TCP
传输协议。
使用TCP传输服务的流程如下:
- 服务器在
80
端口等待客户的请求; - 浏览器发起到服务器的
TCP
连接(创建套接字Socket
); - 服务器接受来自浏览器的
TCP
连接; - 浏览器(
HTTP
客户端)与Web
服务器(HTTP
服务器)交换HTTP
消息; - 关闭
TCP
连接;
这里要注意:HTTP协议是一个无状态协议,
服务器不维护任何有关客户端过去所发请求的消息
。大体上都是使用无状态的协议,有状态的协议往往更复杂,需要维护状态(历史信息);如果客户或服务器失效,会产生状态的不一致,解决这种不一致代价高。
HTTP连接
Web
应用依靠Http
协议,Http
协议又依赖传输层的TCP
协议。在TCP
的使用上是有两种不同的使用方法的,我们将其称为不同的HTTP
连接类型。1. 非持久性连接(Nonpersistent HTTP
):每个TCP
连接最多允许传输一个对象。HTTP
早起版本使用的方法。2. 持久性连接(Persistent HTTP
):每个TCP
连接允许传输多个对象。
他们之间的区别是什么?二者的工作方式如下图所示:
如果网速比较慢的时候,就会出现先有了网页,然后再加载图片的过程。如果想要对其时间性能进行分析,建立一个简单的时间响应模型来衡量其性能,我们可以对其进行响应时间分析与建模。
开始分析之前先定义一个词,RTT
(Round Trip Time
):从客户端发送一个很小的数据包到服务器并返回所经历的时间。那从浏览器开始,一直到最后得到文件,响应时间可以分解为:1. 发起、建立TCP
连接:1
个RTT
;2. 发送HTTP
请求消息到HTTP
响应消息的前几个字节到达:1
个RTT
;3. 响应消息中所含的文件/对象传输时间;所以获得一个对象的时间是两倍的RTT+文件发送时间
:
上述这种非持久性连接的问题:1. 每个对象需要两个RTT
;2. 操作系统需要为每个TCP
连接开销资源(overhead
),这对服务器来说是一个很大的负担;3.浏览器会打开多个并行的TCP
连接以获取网页所需对象,这个时候给服务器端会造成很大的负担。
改进的办法就是将其改为持久性连接,思路就是发送响应后,服务器保持TCP
连接的打开。细分的话又可以分为:1. 无流水(pipelining
)的持久性连接:客户端只有收到前一个响应后才发送新的请求。每个被引用的对象耗时1
个RTT
。2. 有流水机制的持久性连接:HTTP1.1
的默认选择,客户端只要遇到一个引用对象就尽快发出请求;理想情况下,收到所有的引用对象只需耗时约一个RTT
;