HTTP是一个属于应用层的面向对象的协议,因为其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,通过几年的使用与发展,获得浏览器
不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工做正在进行之中,并且HTTP-NG(Next Generation of HTTP)的缓存
建议已经提出。服务器
1.支持客户/服务器模式。cookie
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法经常使用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不一样。网络
因为HTTP协议简单,使得HTTP服务器的程序规模小,于是通讯速度很快。jsp
3.灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。分布式
4.无链接:无链接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。post
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能网站
致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快。编码
HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的链接方式,HTTP1.1版本中给出一种持续链接的机制,
绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式以下:
http://host[":"port][abs_path]
http表示要经过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path
指定请求资源的URI;若是URL中没有给出abs_path,那么当它做为请求URI时,必须以“/”的形式给出,一般这个工做浏览器自动帮咱们完成。
举个例子:
一、输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
二、http:192.168.0.116:8080/index.jsp
在HTTP链接中报文分为请求(request)和响应(response)两种。每种报文在HTTP首部都有不一样的字段来标识不一样的用途。
HTTP协议使用TCP协议进行传输,在应用层协议发起交互以前,首先是TCP的三次握手。完成了TCP三次握手后,客户端会向服务器发出一个请求
报文。一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。
请求报文的格式以下图抓包所示:
前三行为请求行,其他部分称为request-header。请求行中的method表示此次请求使用的是get方法。请求方法的种类比较多,如option,get,
post,head,put,delete,trace等,经常使用的主要是get,post。Get表示请求页面信息,返回页面实体;post是请求服务器将指定文档做为请求的
url中的从属实体,简单说,咱们经常使用的在网页中填写表单而后申请等动做就是使用了post方法,填写用户名密码登陆站点就使用了post方法,以下图:
方法以后是URI,表示请求的页面地址,图中的“/”表示服务器的根目录。以后是表示http的版本。
请求行以后是请求首部。首部常见的部分有以下几个:
Accept:请求的对象类型。若是是“/”表示任意类型,若是是指定的类型,则会变成“type/”。
Accept-Language:使用的语言种类。
Accept-Encording:页面编码种类。
Accept-Charset:页面字符集。
User-Agent:提供了客户端浏览器的类型和版本。
Host:链接的目标主机,若是链接的服务器是非标准端口,在这里会出现使用的非标准端口。
Connection:对于HTTP链接的处理,keep-alive表示保持链接,若是是在响应报文中发送页面完毕就会关闭链接,状态变为close。
说到这里,须要解释如下字符集和编码的区别。字符集一般对应着一种语言,将语言中的全部字符集合起来就能够视为一种字符集,这样咱们
能够看出,中文并不是是一种字符集,由于中文没法使用一些字符来进行表示;而编码则是将字符转换为计算机所能识别的2进制数的一种方式,例
如常说的unicode,UTF-8,ANSI等等,咱们在访问一些国外网站会出现乱码的缘由就是由于咱们浏览器所使用的编码与页面所使用的编码不能
互相识别。我们常说的BIG5和GB2312都是编码。
当收到get或post等方法发来的请求后,服务器就要对报文进行响应。一样,响应报文也分为两部分。前两行称为状态行,状态行给出了服务
器的http版本,以及一个响应代码。响应代码是服务器根据请求进行查找后获得的结果的一种反馈,共有5大类。分别以一、二、三、四、5开头。
1**表示接收到请求,继续进程,在发送post后能够收到该应答。
2**表示请求的操做成功,在发送get后返回。
3**表示重发,为了完成操做必须进一步动做。
4**表示客户端出现错误。
5**表示服务器出现错误。
其他部分称为应答实体。
其中的server表示服务器软件版本,date标注了当前服务器的时间,connection标明链接关闭,抓包能够发如今响应返回后服务器向客
户端发出fin包单向关闭了链接。Expires表示在某个时间之前能够不用从新缓存该页面,而cache-control表示对页面是否进行缓存。Pragma
的参数no-cache表示对页面不进行缓存。而content-type表示了应答请求后返回的内容类型。Content还有内容长度和内容语言以及内容编
码三个项,其中内容长度只有在请求报文中的connection值为keep-alive时才会用到。
cookie是一种相似缓存的机制,它保存在一个本地的文本文件中,其主要做用是在发送请求时将cookie放在请求首部中发送给服务器,服
务器收到cookie后查找本身已有的cookie信息,肯定客户端的身份,而后返回相应的页面,cookie的方便之处在于能够保持一种已登陆的状态,
例如:咱们注册一个论坛,每次访问都须要进行填写用户名和密码而后登陆。而使用了cookie后,若是cookie没有到达过时时间,那么咱们只需
在第一次登陆时填写信息而后登陆,之后的访问就能够省略这一步骤。
在HTTP协议中,cookie的交互过程是这样的:首先是三次握手创建TCP链接,而后客户端发出一个http request,这个request中不包含
任何cookie信息。
当服务器收到这个报文后,针对request method做出响应动做,在响应报文的实体部分,加入了set-cookie段,set-cookie段中给出
了cookie的id,过时时间以及参数path,path是表示在哪一个虚拟目录路径下的页面能够读取使用该cookie,将这些信息发回给客户端后,客
户端在之后的http request中就会将本身的cookie段用这些信息填充。
若是用户在链接中经过了服务器相应的认证程序,服务器会添加一个cdb_auth到set-cookie中,这个段表示了客户端的认证信息,而客户
端之后在访问过程当中也会将cdb_auth信息写入本身的cookie字段。服务器每次收到http request后读取cookie,而后根据cookie的信息返
回不一样的页面。例如,没有通过认证的客户端在request中不会有cdb_auth,所以服务器读取cookie后,不会将经过认证的客户端的页面返回
给该客户端。