我们现在开发系统(比如用java、php等语言),一般是编写将在多台端系统
上运行的软件。而不是为网络核心设备写应用程序软件。因为在文章一中说过路由器只有三层,链路层交换机只有两层(物理层、数据链路层)。
不同于网络的体系结构(比如说5层因特网体系结构),应用程序体系结构由开发者设计,主流有:客户-服务器体系模式和对等(P2P) 体系结构。
常见有web、电子邮件等待。特征:
为了能够处理海量的请求,一些公司会配备大量主机的数据中心,用于创建强大的虚拟服务器
.(如google、百度、阿里巴巴等)
比如迅视频电话(Skype)
混合的
体系结构。服务器用来跟踪用户的IP地址,但用户到用户的报文在用户主机之间直接发送
自扩展性!
通常不需要太大的服务器基础设施和服务器带宽。多个端系统的程序通信,本质是进程的通信。下面主要关注的是非同一台主机上的进程间的通信
在一堆进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户
,在会话开始时等待联系的进程是服务器
进程和另一个进程之间收发报文必须通过下面的网络。进程通过一个称为套接字(socket) 的软件接口向网络发送报文和从网络接收报文
套接字是一台主机内应用层和传输层之间的接口
,同时socket也被称为应用程序编程接口(API)。开发者可以控制socket在应用层端的一切,对socket在传输层却几乎没有控制权。
对传输层的控制权:
接收进程需要一个地址,一般需要定义如下两种信息
很多网络都提供了不止一种运输层协议。我们在选择时,一般通过四个方面来进行考虑
分组可能在网络中丢包。如果一个协议能够确保由应用程序的一端发送的数据正确、完全地
交付给该应用程序的另一端。则被认为提供了可靠数据传输。
当一个传输层协议不提供可靠数据传输时,则发送程序发送的某些数据可能到达不了接收程序。这可能被容忍丢失的应用(如直播、视频电话、语音)所接收
可用吞吐量就是发送进程能够向接收进程交付比特的速率。
一些运输层协议能够以某种特定的速率提供确保的可用吞吐量。
根据对吞吐量是否由要求,应用分为带宽敏感的应用和弹性应用
即是否能保证通信的延迟在指定范围内
运输层协议是否能够加密由发送进程传输的所有数据,然后接收主机中,运输层协议能够在交给接收进程前解密
上面说的是计算机网络能够提供的通用运输服务。
安全性
TCP和UDP都没有加密机制。这样明文发送很容易在中间链路被嗅探和发现。因此因特网界研制了TCP的加强版
,称为安全层套接字(SSL)。注意SSL并不是在传输层的,而是一种对TCP的加强,是在应用层上
实现的。
udp是一种不提供不必要服务的轻量级运输协议,仅提供最小服务。
tcp和udp都没有定时和吞吐量的功能。但我们仍然可以利用这些协议来构建一个带宽敏感、对延迟敏感的应用。这时因为它们被设计成尽最大可能
对付这种保证的缺乏.
所以说设计还是很重要的。
前面讨论的是如何把报文发送进socket来实现进程通信。但很明显,这些报文也是需要遵循某些规则的,这就引出了应用层协议:定义了运行在不同端系统上的应用程序如何相互传递报文。应用层协议定义了:
应用层协议只是网络应用程序的一部分!
(尽管这部分非常重要)。如Web是一种客户-服务器应用,包括了html协议、web浏览器、web服务器。
Web的应用层协议就是http,是Web的核心。下面介绍一些web术语:
一个文件
,诸如:一个html文件、一张jpeg照片等等,且可以通过url地址寻址http是使用TCP作为传输层协议的,因此不用担心数据丢失问题,也不关注tcp从网络的数据丢失和乱序故障中恢复的细节(这里有一个很重要的思想:就是分层设计。把一个大问题先细分掉,尽量问题之间也要解耦。我们在实现其中一层时,只需要专注这一层的问题,而不要把太多其他问题考虑进来。这不论是在学习时,还是编程中,都非常重要
)
客户端会发出一系列请求并且服务器对每个请求进行响应。应用程序的研制者需要做出一个决定:每个
请求/响应对是经一个单独
的TCP连接发送,还是所有的请求
及其响应经相同的TCP连接
发送。
注意
如果采用非持续连接,这些连接可能是串行也可能是并行的。浏览器一把可以打开5-10个并行的TCP连接,用户也可以设置最大并行连接数。
采用持续连接的好处就是不用每次都建立一个连接,减少了消耗的资源(对于每个连接,客户端和服务端都需要分配TCP的缓冲区和保持TCP变量)
因为之前也学过编程,所以这里简单记录下。
一个请求报文分为三部分
前面小节的高速缓存能提高响应速度,但有一个问题:存放在缓存的对象副本可能是陈旧的。
这时可以使用条件GET来解决。
简单说:当客户端请求代理缓存器时,发现本地已经有缓存了。则会拿着缓存文件的最后一次更新时间,去问真正的服务器:这个文件有没有在指定时间之后修改过。修改过,则返回最新的文件,然后缓存并返回给客户端。没有则响应一个空实体体
的报文(304
),缓存服务器直接返回本地副本。
因特网的电子邮件系统主要由3个主要部分组成:用户代理、邮件服务器、简单邮件传输协议(SMTP)
在邮件服务器上有个队列,这样的话就可以实现重试机制
,用户邮箱是属于邮件服务器的。
是因特网电子邮件中主要的应用层协议。
因为这个技术很老,所以会有一些看上去比较过时的设计
,比如SMTP限制所有报文的体部分只能采用简单的7比特ASCII表示。因此当我们发送多媒体数据时,需要先对原始数据做转码处理
自己的
HTTP响应报文中
,而SMTP是将所有的报文对象放在一个报文
中这里我还是有点困惑?
因为报文里的环境信息都在卡面SMTP握手中声明过了,所以不清楚这里的首部信息是为了干什么?
我的理解是:书上前面的握手协议我们输入的那些信息,在最后会由用户代理封装成一个SMTP报文,然后发送给邮件服务器。
以前都是用户登录到服务器主机,并直接在该主机上运行一个邮件阅读程序来阅读他的邮件的。但今天,邮件访问使用了一种客户-服务器体系结构,即用户通过用户端系统上的客户程序
来阅读电子邮件(比如foxmail).
因为SMTP被设计成将电子邮件从一台邮件服务器推到另一台主机。然而我们的用户代理在运行在PC、手机上的,不可能一直运行着。所以邮件必须发送到邮件服务器,而我们也必须通过一种方式能让用户代理
能从邮件服务器获取新的邮件.因此可以以引入一些特殊的邮件访问协议,如POP3、IMAP
一种极为简单的邮件访问协议。POP3按照3个阶段进行工作:
有两种下载模式
POP3没有
给用户提供任何创建远程文件夹并为报文指派文件夹的方法。
IMAP比POP3复杂的多。将每个报文与一个文件夹联系起来,并且具有允许用户代理获取报文某些部分的命令
现在越来越多的用户使用Web浏览器来收发电子邮件。这时,用户代理就是普通的浏览器,用户和远程有限之间的通信则通过HTTP进行。淡然邮件服务器之间通信肯定还是SMSP。
因特网上的主机有多种方式进行标识。一种方法是用主机名(hostname)
,比如www.baidu.com。这种方式便于人们记忆,但路由器很难处理,无法确认位置。因此主机也可以用IP进行标识。
IP详情会在后面讲到,先简单介绍下:IP(IPV4的)由4个字节组成,字节之间用.
隔开。
对于主机标识,因为人们喜欢主机名,而路由器喜欢ip格式。因此诞生了一种能将主机名到ip地址转换的目录服务。这就是域名系统DNS(Domain Name System
)
DNS定义
分布式数据库
UDP
,服务器是53端口。当使用HTTP\SMTP\FTP协议时,都有可能用到DNS服务将用户输入的主机名转换成IP地址。过程简单的说:就是将地址中的主机名向DNS查询
。
除了进行主机名到IP的转换,其他提供的重要服务
规范主机名
MX记录允许一个公司的邮件服务器别名和Web服务器是用相同的(别名化)主机名
一个主机名可以一个IP地址集合相联系
DNS采用分布式的设计方案。
众多DNS服务器是以层次方式组织的。大致来说,由3种类型:根DNS服务器、顶级域(Top-Level Domain,TLD)DNS服务器和权威DNS服务器。
在DNS服务器层次之外,还有一类本地DNS服务器
,也非常重要。每个ISP都有一台DNS服务器。因此本地DNS服务器是邻近
用户的主机的。本地DNS服务器也起着代理的作用,将DNS请求转发到SND服务器层次结构中。
DNS查询过程如下:(注意:无论查询哪个DNS服务器,都是发送完整的主机名!是DNS服务器自己解析请求报文,然后响应下一层次的DNS服务器IP/目的主机的IP)
有时TLD服务器只知道用于主机的权威DNS服务器的IP地址,所以这时可能会查询多台权威DNS服务器
,最后才能知道主机的IP
前一幅图中DNS的后3个查询时迭代查询。理论上讲,任何DNS查询可以是迭代的也能是递归的。一般就是用前面图中的模式
看了前面,我们发现一次DNS查询可能8份甚至更多的报文产生。这样必定会有大量的时延。为了改善时延并减少因特网中传输的报文数量,DNS广泛使用了缓存技术
在一个请求链中,当某DNS服务器收到一个DNS回答,它能将映射缓存到本地服务器。比如前面图中后3次都是迭代查询,所有一次查询产生了多条缓存记录。(缓存时间一般是两天)
资源记录(RR)
,RR提供了主机名到IP的映射。一条或多条
RR资源记录包含了下列字段的4元组:
(name,value,type,ttl)
name和value的值取决于Type,Type有4种:A\NS\CNAME\MX
DNS的查询会回答报文格式相同。
也就是向注册登记机构
注册域名。
注册域名时,还需要提供基本和辅助权威DNS服务器
的名字和IP地址。注册机构会将这些资源记录(至少有A记录和NS记录)插入所有的TLD服务器。