2.1 应用层协议原理
2.1.1 网络应用程序体系结构
研发网络应用的程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。
例如:
-
Web应用程序
-
客户:浏览器程序(进程)
-
服务:Web服务器程序(进程)
-
-
P2P文件共享
- 每个主机的程序(进程)都是类似的
2.1.2 进程通信
进程与网络之间的接口
进程通过套接字(socket)向网络发送和接收报文,套接字是同一台主机内应用层与运输层之间的接口。
进程寻址
- 目标主机的地址(IP地址)
- 目标主机中进程(接收套接字)的标识符(端口号)
- web服务器:80
- 邮件(SMTP)服务器:25
2.1.3 可供程序选择的运输层(协议)服务
可靠数据传输
发送进程只需要将数据传进套接字就可以,完全相信数据能无差错的送到目的地。
吞吐量
进程间传输数据的比特率
因为其他会话将共享沿着该网络路径的带宽,并且因为这些会话将到达和离开,该吞吐量会随时间波动。这导致了另一个传输层的服务:传输层协议保证以特定的速率提供可用的吞吐量。
定时
例如:发送套接字发送的数据到达接受套接字不迟于100ms
安全性
是否对传输的数据加密
2.1.4 因特网提供的运输服务
TCP 服务
面向连接服务
在应用层数据流动之前,TCP让客户和服务器相互交换传输层信息。这个所谓握手的过程提醒服务器和客户,让他们为大量分组到来做好准备。握手之后,一个TCP连接就在两个套接字之间建立了。应用程序结束发报之后,必须拆除连接
可靠的数据传输服务
进程能够依靠TCP无差错的传输数据
UDP服务
它是一种轻量级传输协议,只提供必要的服务,UDP是无连接的,因此在通信之前没有握手的过程。UDP不保证数据完整,有序的到达。
安全性
安全套接字层(Secure Sockets Layer, SSL), SSL不是与TCP和UDP在同一层次的第三种运输协议, 他是在应用层实现的,如果一个应用程序要使用SSL,它需要在客户端和服务端包括SSL代码。 SSL有自己的套接字API。就是传输之前将数据加密一下,再传给运输层,接收需要SSL解密。
2.1.5 应用层协议
2.2 Web与HTTP
Web是一个应用,HTTP是他的应用层协议
2.2.1 HTTP概况
- Web页面:一个HTML基本文件以及几个引用对象,比如一个页面通过URL引用5个图片。
- Web浏览器:IE,Chrome
- Web服务器:Tomcat
HTTP是一个无状态协议,同一个用户连续请求同一个页面,服务器会老老实实的发送两次,不会因为客户短时间访问过就不再发送
2.2.2 非持续连接和持续连接
非持续连接
我们看看在非持续连接情况下,从服务器向客户传送一个Web页面的步骤。假设该页面含有一个HTML基本文件和10个JPEG图形
- HTTP客户进程在端口号80发起一个到服务器的TCP连接
- HTTP客户经套接字向该服务器发送一个HTTP请求报文。
- HTTP服务器接收该请求报文,从其存储器中检索出对象在一个 HTTP 响应报文中封装对象,并通过其套接字向客户发送响应报文。
- HTTP服务器进程通知TCP断开该TCP连接。
- HTTP客户接收响应报文,TCP连接关闭。该报文指出封装的对象是一个HTML文件,客户从响应报文中提取出该文件,检查该HTML文件,得到对10个JPEG图形的引用。
- 对每个引用的JPEG图形对象重复前4个步骤。
这个过程一共发起了11次TCP连接,比较浪费时间,
持续连接
在采用HTTP 1.1持续连接的情况下,服务器在发送响应后保持该TCP连接打开。在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。特别是,一个完整的Web页面(上例中的HTML基本文件加上10个图形)可以用单个持续TCP连接进行传送。更有甚者,位于同一台服务器的多个Web页面在从该服务器发送给同一个客户时,可以在单个持续TCP连接上进行。对对象的这些请求可以一个接一个地发出,而不必等待对未决请求(流水线)的回答。一般来说,如果一条连接经过一定时间间隔(一个可配置的超时间隔)仍未被使用,HTTP服务器就关闭该连接。
2.2.3 HTTP报文格式
HTTP 请求报文
GET /somedir/page.html HTTP/1.1 请求行
Host: www.someschool•edu 首部行
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
-
请求行
- 方法
- URL字段
- HTTP版本字段
-
首部行
- Host:指明对象所在的主机
- Connection:close : 不使用持续连接,要求服务器发送完请求的对象后就关闭连接
- User-agent:指明用户代理,即浏览器类型(Mozilla/5.0 Firefox浏览器),服务器可以根据不同的浏览器发送对象的不同版本
- Accept-language:表示用户想得到该对象的语法版本。
然而,你可能已经注意到了在首部行(和附加的回车和换行)后有一个“实体体” (entity body)。使用GET方法时实体体为空,而使用POST方法时才使用该实体体。当用户提交表单时,HTTP客户常常使用POST方法,例如当用户向搜索引擎提供搜索关键词时。使用POST报文时,用户仍可以向服务器请求一个Web页面,但Web页面的特定内容依赖于用户在表单字段中输入的内容。如果方法字段的值为POST时,则实体体中包含的就是用户在表单字段中的输入值。
HTTP响应报文
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tuer 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ..•)
-
状态行
- 协议版本
- 状态码
- 相应状态信息
-
首部行
- Connection:close : 同请求报文
- Date:服务器发送响应报文的时间
- Server:指明服务器类型(Apache),与请求报文的User-agent对应
- Last-Modified:对象最后修改的时间
- Content-Length:被发送对象的字节数
- Content-Type:实体体的对象是HTML文本
-
实体体
-
补充:状态码
- 200 0K:请求成功,信息在返回的响应报文中。
- 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
- 400 Bad Request: 一个通用差错代码,指示该请求不能被服务器理解。
- 404 Not Found:被请求的文档不在服务器上。
- 505 HTTP Version Not Supported :服务器不支持请求报文使用的HTTP协议版本。
2.2.4 用户与服务器交互:cookie
这个过程描述的形象一点:你第一次去一个俱乐部(访问一个网站),这个俱乐部会在俱乐部会员名单里加上你的名字(后台数据库为你创建一个唯一的cookie),并给你一个带号码的胸章(cookie),这样,以后你每次去找个俱乐部,只要带上胸章,这个俱乐部就会为你提供会员才有的服务,比如个性化广告。
2.2.5 Web缓存(服务器)
- Web缓存器:通常是ISP购买和安装,目的是减少一个机构(局域网)到因特网的通讯量,从而降低带宽,节省费用。
- 原理:局域网中的用户想要访问Web初始服务器中的数据,用户可以设置访问缓存器,如果缓存器中有这些数据,则直接高速返回给用户,否则,由缓存器访问初始服务器,把得到的数据再返回给用户,同时,在缓存器上存一个备份,方便用户下次访问。
2.2.6 条件GET方法
用户向缓存器请求对象,正好缓存器中有这个对象,这时候,缓存器会向初始服务器发送一个条件GET方法
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine•com
If-Imodified-since: Wed, 9 Sep 2015 09:23:24
If-Imodified-since
是表明该对象最后一次修改时间,初始服务器收到请求后,会检查对象是否在这个时间之后修改过,如果修改过,就正常返回这个对象,否则,返回
HTTP/1.1 304 Not Modified
Date: Sat, 10 Oct 2015 15:39:29
Server: Apache/1.3.0 (Unix)
(empty entity body)