#### 第8章:
#### 应用层
应用层是网络体系结构的最高层。在传输层为应用进程提供端到端通信服务的基础上,不同网络应用的应用进程之间有着不同的通信规则,因此在传输层协议之上还需要设有应用层协议。`每一个应用层协议都是为了解决某类应用问题`,通过位于不同主机的多个进程之间的通信和协同工作来解决问题。
应用层协议有标准化和非标准化的,非标准化是定制的,可以理解为在标准化之上(标准化是基础)。
#### 8.1 域名系统
只有应用层软件才直接使用域名系统,用户只是间接而不是直接使用域名系统。
因特网使用两种地址:`IP地址`和`物理地址`。两种地址使用不同的格式,处于不同的层次。
IP地址是因特网内的一种全局性通用地址,用于IP层及其以上层次的高层协议中,目的是屏蔽物理细节。由于采用了IP地址,因特网的任意一对主机的上层软件才能通信。
由于IP地址32位(255,255,255,255。2的8次方,4个一共32位)太抽象,所以以一种字符型的主机命名机制`域名系统`来处理。
计算机网络中主机标识符分为三大类:名字、地址、路径。而计算机网络需要把IP地址映射到一个域名上。
`DNS`域名系统是一个联机分布式数据库系统。是专门用来存储、查找、相应这个映射关系的。
DNS将域名解析到IP地址的过程是:
1. 当主机A的一个进程需要把主机名解析为IP地址时,该应用进程作为DNS的一个用户调用解析程序,以UDP用户数据报的方式把带解析的域名放在DNS请求报文中发送给本地域名服务器(运行DNS程序)。
2. 本地域名服务器在数据系统中查找到域名后,在回答报文中把对应的IP送回。
这样主机A找到了需要请求的主机B的IP地址,向主机B继续请求网络通信。
##### 域名结构
[www.baidu.com](www.baidu.com)
www是三级域名
baidu是二级域名
com是顶级域名
1. 国家顶级域名:按照国家划分。cn表示中国,us表示美国,uk表示英国。目前有296个顶级域名
2. 通用顶级域名:按照组织机构划分,和地区无关。有20个
例如(但也不一定对应,比如com不一定是商业组织):
edu教育机构,cat使用加泰隆人的语言和文化团体
com商业组织, coop合作团体
gov政府部门, pro拥有证书的专业人员
.......
3. 国家二级域名由该国自行确定注册。
4. 三级域名有公司个人自行确定注册。
##### 域名服务器
1. 根服务器。它是最重要的域名服务器,是最高层次的域名服务器。根服务器知道所有顶级域名服务器的域名和IP地址。
2. 顶级域名服务器。它负责管理在该顶级域名服务器注册的所有二级域名的域名服务器。
3. 权限域名服务器。它是负责一个区的域名服务器。
4. 本地域名服务器。主机A输入某个域名想要请求主机B时候,第一个请求就是发往本地域名服务器。
##### 域名解析
域名解析包括域名到IP的正向解析和IP到域名的逆向解析。由分布在因特网上的许多域名服务器协同完成。
域名解析采用两种方案查询策略:`递归查询`和`迭代查询`
主机A希望知道主机B的IP地址或者域名
递归查询:
1. 主机A向本地域名服务器发送查询请求
2. 本地域名服务器向根服务器查询
3. 根服务器向顶级域名服务器查询
4. 顶级域名服务器向权限域名服务器查询
5. 权限域名服务器返回给顶级域名服务器
6. 顶级域名服务器返回给根服务器
7. 根服务器返回给本地域名服务器
8. 本地域名服务器返回给主机A
迭代查询:
1. 主机A向本地域名服务器发送查询请求
2. 本地域名服务器向根服务器查询
3. 根服务器返回顶级域名给本地域名服务器
4. 本地域名服务器向顶级域名服务器查询
5. 顶级域名服务器返回二级域名给本地域名服务器
6. 本地域名服务器向权限域名服务器查询
7. 权限域名服务器向本地域名服务器返回三级域名
8. 本地域名服务器返回给主机A
所有域名在域名服务器中都是有高速缓存的,而且是最新的。这样才能保证快速响应给主机。
保持最新的技术:
1. 权限服务器为域名IP映射添加生存时间。
2. 为每一项内容设置一个计时器,保持定期更新。
#### 8.2 万维网
万维网是一个超媒体系统,是超文本系统的扩展。
`超文本`是一个包含指向其他文档连接的文本。
万维网一般采用浏览器/服务器模式(B/S),与用户/服务器模式(C/S)比较
1. 将重心放到了服务器上,浏览器只负责解析
2. 随时根据应用的变化更改服务器相关内容
3. 便于应用到英特网环境,扩大了应用范围
4. 浏览器的普及程度高,削减了培训开支
##### 统一资源定位符URL
因特网上`资源`是指可以访问的任何对象。包括文字、图片、视频、目录、文件、声音等,以及与因特网相连的任何形式的数据。
URL是对因特网上资源的位置和访问方法的一种简洁的表示方法。相当于访问因特网上任何资源文件的指针。
形式为:
://:/路径
例如
[http://123.54.68.15:80/public/index.php](http://123.54.68.15:80/public/index.php) 访问到了PHP文件
[http://123.54.68.15:80/images/picture1.jpg](http://123.54.68.15:80/images/picture1.jpg) 访问到了图片
ftp://192.168.1.3:2121 应用层ftp协议连接到这个主机
......
#### 8\. 3 超文本传送协议HTTP
超文本传送协议是万维网的核心
HTTP的特点:
1. 面向事务。事务是指一系列不可分割的信息交换。
2. HTTP是无连接的,尽管使用了传输层面向连接的TCP。也就是说虽然使用TCP,但在交换HTTP报文之前,并不需要建立HTTP连接(应用层这一级不需要交换连接,试着理解下,传输层TCP有了连接,HTTP只需要想发送信息的时候发送信息,而不需要保持连接)。
3. HTTP是无状态的。服务器无记忆功能,并不记得曾经为客户服务的次数。这种无状态特性简化了服务器的设计,使得服务器更容易支持大量并发的HTTP请求。
另外HTTP协议还具有双向传输、能力协商、支持高速缓存和代理服务器的特点。
HTTP采用立即交付,客户发送给服务器的命令是嵌入在请求报文中,服务器返回的内容或其他信息则嵌入在响应报文中。报文格式受MIME类型影响(比如类型是jpg图片,是txt、json类型文本文件,是MP3音频等)。
假设用户拟访问Web服务器A上的一个页面,其URL是
[http://www.mysamples.com/show/index.html](http://www.mysamples.com/show/index.html)
该页面包含了指向Web服务器B上内容的一个超链接。
其过程是:
1)客户端浏览器根据用户输入的URL向DNS查询[www.mysamples.com](www.mysamples.com)的IP地址
2)浏览器根据DNS返回的IP地址,与服务器数熟知的端口80建立TCP连接
3)浏览器向服务器提交HTTP请求,内含取文件命令: GET/show/index.html
4)基于该请求的内容,服务器找到相应的文件,并根据文件的扩展名,形成一个MIME类型的HTTP回答报文,送回给浏览器,服务器释放本次TCP连接
5)根据HTTP回答报文首部,浏览器按照某种方式显示该文件内容。如果该文件种有之类,浏览器随时发送新请求以获得有关类容(面向事务特性)。
2-4步HTTP的一次操作,称为HTTP的一次事务。HTTP的报文是在TCP三次握手的第三次的数据发送的(TCP连接的一二次握手为了建立连接,第三次确认建立连接时候伴随HTTP数据)。显然这是一种花费在TCP上的开销。万维网客户与服务器每一次建立TCP连接都需要分配缓存和变量则是另一种开销。尤其是服务器为多个客户服务时,这种负担更重。
为了解决这种负担,HTTP1.1使用了`持续连接`概念。持续连接是指万维网服务器在发送响应后仍在一段时间内保持这段连接,以使用同一用户与该服务器可以在这条连接上传送后续的HTTP请求报文和响应报文。HTTP1.1把持续连接作为默认连接。
HTTP1.1使用持续连接有两种方式:
1. 非流水线
发送请求报文,等待响应报文后再发送下一个请求报文。
2. 流水线
发送请求报文,不用等待响应报文发送下一个请求报文。
##### HTTP报文格式
HTTP有请求报文和响应报文
请求报文:
1. 请求行(必须)
2. 首部(必须)
3. 主体(部分情况)
响应报文:
1. 状态行(必须)
2. 首部(必须)
3. 主体(部分情况)
`请求行`:
由请求类型、URL和HTTP版本三个部分组成
常用请求类型:GET、POST、HEAD(读取文档首部)、PUT(由服务器向客户发送一些信息)、TRACE(用于进行环测的报文回送)、CONNECT(用于代理服务器)、OPTION(询问关于可用选项的信息)、DELETE(删除URL所标识的资源)
`状态行`:
由HTTP版本、状态码、状态短语组成
状态玛由3位数字组成,五大类,供33种。1xx表示对请求的通知信息;2xx表示请求成功;3xx表示把客户重定向到另一个URL;4xx表示客户端出现异常;5xx表示服务端出现异常。
例如:
HTTP/1.1 202 Accepted (接受)
HTTP/1.1 400 Bad request (错误的请求)
HTTP/1.1 404 not found (找不到)
`首部`:
是客户与服务器间交换的附加信息,用来给服务器,浏览器和报文主题加以说明。
首部可以包含多条首部行。
首部行有4种类型:`通用首部`、`请求首部`、`响应首部`、`主体首部`。
通用首部用来给出关于报文的通用信息。
请求首部指明客户的配置和优先使用的文档格式。
响应首部指明服务器的配置和相关请求的特殊信息。
主体首部给出文档主题的信息。
请求报文可包含通用首部、请求首部、主体首部
响应报文可包含通用首部、响应首部、主体首部
`主体`(包含要发送或接收的文档):
HTTP请求示例:
~~~
GET /download/index.html HTTP/1.0
Accept : text/plain
Accept : text/html
Accept : image/gif
空格(首部和主体间必须有空格)
没有主体
~~~
第一行是请求类型、URL、HTTP版本号;后面几行是可以接受的文档类型
HTTP响应示例:
~~~
HTTP/1.0 200 Document follows
Server:CERN/3.0
Content-type:text/html
Content-length:3260
空格(首部和主体间必须有空格)
<head><title>welcom to network world</title></head>
.....
~~~
第一行显示HTTP版本号、请求成功、返回信息;第二行表示服务器软件是CERN/3.0;第三行表示文档类型是text/html;第四行只是文档长度是3260B;接着是空格和请求的文档。
##### 代理服务器
代理服务器是一台计算机,它把最近一些请求和响应的副本保存在高速缓存中。
在有代理服务器的情况下,客户发送HTTP请求给代理服务器。代理服务器检查它的高速缓存。如果发现这个请求和暂存在高速缓存的请求相同,就直接返回响应。如果没有缓存所需的请求,代理服务器将请求发送给相应的服务器。最终代理服务器获得所需的响应,把它存在高速缓存中以备后用。
代理服务器可在客户端、服务端工作、也可以在中间系统中工作。
##### Cookie、Session万维网站点识别功能
HTTP是无状态的,但实际使用中却希望万维网站点具有识别用户的功能。于是使用了Cookie或Session。
Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Cookie存储在用户端,Session存储在服务端