在前面分别介绍了网路层和运输层的功能以及其相关的一些协议。由以往的叙述可知,数据在网络中传输的真正是应用进程。我们的运输层为应用进程提供了端到端的通信服务。但是不同的网络应用的应用进程之间,还需要不同的通信规则。因此我们还需要了解到运输层之上的应用层以及在应用层上所对应的一些协议。
目录
一、应用层详解
应用层为我们提供每个应用进程之间的通信提供某种严格的规则。也就是说每个应用层协议都是为了解决某一类应用问题,而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的 。
应用层协议应当定义为:应用进程交换的报文类型,如请求报文和响应报文;
各种报文类型的语法,如报文中的各个字段及其详细描述;
字段的寓意,既包含在字段中的信息的含义;
进程何时、如何发送报文,以及对报文进行响应的规则;
在应用进程中存在很多的协议,包括FTP文件传送协议、SMTP简单邮件传送协议、DNS域名解析协议以及HTTP超文本传送协议等。关于应用层着重介绍HTTP和DNS两种协议。
二.HTTP超文本传送协议
HTTP协议定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看HTTP是面向事务的应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
(一)了解万维网的大致工作过程
每个万维网网点都有一个服务器进程,他不断的监听TCP的端口80,以便发现是否有浏览器向它发出连接建立请求。一旦监听到了这一事件,服务器进程就和浏览器建立TCP连接,建立连接之后,浏览器向万维网发送出浏览某个页面的请求,服务器接着就会返回所请求的页面作为响应。最后,在响应结束之后就会释放TCP连接。在浏览器和服务器之间的请求和响应的交互,必须按照某种规定的格式和遵循一定的规则。这些规则就是我们的超文本传输协议HTTP。
(二)HTTP基础
HTTP规定了在HTTP客户与HTTP服务器之间的每次交互,都由一个ASCII码串构成的请求和一个类似的通用互联网扩充。并且HTTP报文通常都使用TCP连接传送。
1、HTTP协议的特点
HTTP协议本身是无连接的、无状态的不可靠的。
但是HTTP使用了面向连接的TCP作为传输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。而HTTP本身的无连接的,这就是说,虽然HTTP使用了TCP连接。但通信双方在交换HTTP报文之前不需要先建立HTTP连接。HTTP是无状态的是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同,因为服务器不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
2、HTTP的长连接和短连接
我们通过下图来简单看一下请求一个万维网文档所需要的时间:
由上图可以看到,请求一个万维网文档所需的时间是该文档的传输时间加上两倍往返时间RTT。由此可以看出,HTTP的主要缺点就是每请求一个文档就要两倍的RTT的开销。如果一个主页上有很多链接的对象需要依次进行链接,那么每一次链接都要导致2*RTT的开销。另一种开销就是万维网客户和服务器每一次连接建立新的TCP连接都要分配缓存和变量。特别是万维网服务器往往要同时服务于大量客户的请求,所以这种非连续连接也称为短连接会使万维网服务器的负担很重。所以我们一般采用的是连续性连接也称为长连接。
短连接:web客户端和web服务器之间的一个TCP连接只能为一个HTTP请求服务,当处理完客户的一个HTTP请求之后,web服务器就(主动)将TCP连接断开;
长连接:多个HTTP请求可以使用同一个TCP连接,长连接在编程上稍微复杂一些,但性能上却有很大提高。
(三)HTTP的报文结构
1、HTTP中有两类报文:
请求报文:从客户向服务器发送请求报文;
响应报文:从服务器到客户的回答;
2、两种报文格式:
如下图所示是两种报文的格式:
由于HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的。HTTP的报文都由三部分组成,可以看出,这两种报文的不同区别在开始行;
开始行:用于区分请求报文和响应报文;
首部行:用来说明浏览器、服务器或报文主体的一些信息;
实体主体:在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段;
(1)请求报文段
以下是HTTP请求报文的一些方法:
方法(操作) | 意义 |
OPTION | 请求一些选项信息 |
GET | 请求读取由URL所标志的信息 |
POST | 给服务器添加信息(例如:注释) |
HEAD | 请求读取由URL所标志的信息的首部 |
PUT | 在指明的URL下存储一个文档 |
DELETE | 删除指明的URL所标志的资源 |
TRACE | 用来进行回环测试的请求报文 |
CONNECT | 用于代理服务器 |
一个完整的请求报文段的例子:
GET /dir/index.htm HTTP/1.1 请求行使用了相对URL
Host: www.xyz.edu.cn 此行是首部的开始。这行给出主机的域名
Connection: close 告诉服务器发送完请求的文档后就可释放连接
User-Agent: Mozilla/5.0 表明用户代理是火狐浏览器Firefox
Accept-Language: cn 表示用户希望优先得到中文版本的文档
请求报文的最后一行还有一个空行
(2)响应报文段
响应报文的第一行就是状态行,状态行包括三项内容,即HTTP的版本,状态码,以及解释状态码的简单短语。
状态码都是三位数字的,分为五大类,这五类状态码都是以不同的数字开头的:
1XXX表示通知信息,如请求收到了或正在进行处理;
2XXX表示成功,如接受知道了;
3XXX表示重定向,如完成请求还必须采取进一步的行动;
4XXX表示客户的差错,如请求中有错误的语法或不能完成;
5XXX表示服务器的差错,如服务器失效无法完成请求;
下面三种是最常见到的状态:
HTTP/1.1 202 Accepted {接受}
HTTP/1.1 400 Bad Request {错误的请求}
HTTP/1.1 404 Not Found {找不到}
(3)Linux下关于http的一些命令:
Service httpd status 查看状态
Service httpd start 开启
Service httpd stop 停止
(四)HTTP与HTTPS的区别
1、HTTP是超文本传输协议,是互联网上应用最为广泛的一种协议。所有的www文件都必须遵循这个标准;而HTTPS是以安全为目标的HTTP通道,简单的说就是HTTP的安全版本。用于安全的HTTP数据传输。
2、https协议需要到CA申请证书,一般免费的证书较少,因而需要一定费用
3、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
4、http和https使用的是去安全不同的连接方式,用的端口也不一样,前者是80,后者是443.
5、http的连接很简单,是无状态的 ;https协议是由ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
(五)cookie
HTTP是无状态的,这样做虽然简化了服务器的设计,但是在实际工作中万维网站点却常常希望能够识别用户。因此服务器需要记住用户的身份,使它可以接着访问某些页面。这里,我们就会用都cookie技术,规定了万维网站点可以利用cookie来跟踪用户。在这里cookie表示在HTTP服务器和客户之间传递的状态信息。
Cookie的工作过程:
(1)当用户A浏览某个使用Cookie的网站时,该网站的服务器就为A产生一个唯一的标识码,并以此作为索引在服务器的后端数据库中产生一个项目。接着在A的HTTP响应报文段中添加一个叫做set-cookie的首部行。这里的“首部字段名”就是“set-cookie”,而后面的“值”就是赋予该用户的“识别码”。
(2)当A收到这个响应时,其浏览器就在它管理的特定cookie文件中添加一行,其中包括这个服务器的主机名和set-cookie后面给出的识别码。当A继续浏览这个网站时,每发送一个HTTP请求报文,其浏览器就会从其cookie文件中取出这个网站的识别码,并放到HTTP的请求报文的cookie首部行中:cookie:31d4d96e407aad42
(3)于是,这个网站就能够跟踪用户A在该网站的活动。需要注意的是,服务器并不需要知道这个用户的真实姓名以及其他信息。但是服务器知道31d4d96e407aad42在什么时候访问了哪些页面,以及访问页面的顺序。
(4)如果A在几天后再次访问这个网站,那么他的浏览器会在其HTTP请求报文中继续使用首部行cookie:31d4d96e407aad42,而这个网站会根据A过去的访问记录进行推送。
(六)会话的作用
总的来讲会话是为了保持服务器和用户间的信息。
关于会话的概念,原理,实现等等具体的可以跳转到链接:
https://blog.csdn.net/xiaoxik/article/details/73297351
本文不过多叙述。
本文参考书籍:《计算机网络》第七版 谢希仁