Http协议概念介绍
Http(Hyper Transfer Text Protocol),即超文本传输协议,是客户端浏览器或其他程序与web服务器之间的应用层通信协议。在Internet上的Web服务器存放的都是超文本信息,客户端需要通过Http协议传输需要获取的超文本信息。
Http包含命令和传输信息,不仅可以用于web访问,也可以用于其他因特网/内联网系统之间的通信,从而实现各类应用资源超媒体访问的集成。
Http协议特点
- 支持客户/服务器模式:Http协议由两部分程序实现, 一部分是客户端程序,另一部分是服务器程序,通过交换Http报文进行会话。
- 简单快速:客户端向服务器请求服务,只需传递请求方法和路径。由于Http协议比较简单,故Http服务器的程序规模较小,通信速度快。
- 灵活:Http允许传输任意类型的数据对象,正在传输的类型由Content-Type标记(请求头参数)。
- 无连接:Http协议限制每次连接只能处理一个请求。服务端处理用户请求,并受到用户应答后,即断开连接,这种方式可以节省传输时间。
- 无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端给服务器发送 HTTP 请求之后,服务器根据请求,向客户端发送数据。但是,发送完并不会记录任何信息。这意味着每个请求都是独立的,Keep-Alive 没能改变这个结果。
Http协议工作模式
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。
HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP请求/响应的步骤如下:
- 客户端连接到web服务器
一个Http客户端(通常是浏览器)与Web服务器的HTTP端口(默认为80)建立一个TCP(套接字)连接。 - 客户端向服务器发送Http请求
通过TCP(套接字),客户端向web服务器发送一个Http请求报文,一个Http请求报文由请求行、请求头部、空行和请求数据4部分组成。 - 服务器接受请求并返回Http响应报文
web服务器解析请求报文,并定位请求资源。服务器将资源填充到TCP套接字,最后由客户端读取。一个响应报文由状态行、响应头部、空行和响应数据4部分组成。 - 释放TCP连接
Web服务器主动关闭TCP套接字,释放TCP连接;客户端被动关闭TCP套接字,释放TCP连接。 - 客户端浏览器解析HTML内容
客户端(浏览器)首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据,根据Html语法对其进行格式化,并在浏览器窗口中显示。
Http协议之请求头
Http请求头由四部分组成,分别为请求行、请求头、空行和请求正文等。
请求行
请求行主要由请求方法字段、Url字段和Http协议版本字段三部分组成,他们之间用空格分隔。如GET index.html 1.1。
- 请求方法主要由八种,分别为GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT和OPTIONS等。具体如下:
GET:向特定的资源发出请求。
POST:向指定资源提交数据进行请求(例如提交表单或者上传文件),数据被包含在请求数据中。POST请求可能导致新的资源创建或者已有资源被修改。
HEAD:向服务器请求与GET请求相一致的相应,但相应体不会被返回。HEAD方法可以在不必传输整个相应内容的时候使用,可以获取包含在相应消息头中的元信息。
PUT:向指定资源位置上传最新内容。
DELETE:请求服务器删除Request-Uri所标识内容。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
请求头
请求头由key-value键值对组成,每对构成一行,键和值由:分隔。请求头通知服务器有关客户端请求的信息。
典型的请求头有Host、User-Agent、Accept、Accept-Encoding、Accept-Language、Connection、Referer、Cookie等。此外访问一些Url的时候还会有一些其他头信息,此处不一一列举。
- Host:
作用:用于指定被请求资源的Internet主机和端口号,通常由Http Url中提取出来。
1)host字段可以是域名,也可以是IP地址,host字段域名/IP后可跟端口号,例如www.baidu.com:8080。
2)http协议1.0版本中host字段可以缺失,http协议1.1版本中host字段不可缺失,但是值可以为空。
3)http相应头中不包含host字段。 - User-Agent:
作用:通知服务器,客户端所使用的操作系统类型以及浏览器的名称和版本。 - Accept:
作用:通知服务器端,浏览器端可以接受的媒体类型。 - Accept-Encoding:
作用:申明浏览器端可以接受的编码,通常指定压缩方法,是否支持压缩。 - Accept-Language:
作用:申明浏览器端可以接受的语言,如big5、gb2312或gbk等。 - Connection:
作用:
1)值为keep-alive,当一个request完成后,客户端和服务器之间用于传输Http数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这条已经建立的连接。
2)值为close,当一个request完成后,客户端和服务器之间用于传输Http数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。 - Referer:
作用:浏览器向服务器发送请求时,Referer会告诉服务器是从哪个页面链接过来的,服务器根据Referer值获得一些有用信息。比如从百度上链接到我的服务器,我的服务器就可以从Http Referer中统计每天有多少请求来自于百度。 - Cookie:
作用:用来存储一些用户信息以便服务器辨别用户身份,比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证你是否是合法用户。
请求正文
请求头与请求正文之间有一行空行,这个空行表示请求头已经结束,接下来是请求正文。请求正文主要包含用户提交的查询字符串信息和表单数据等,以key-value的形式存放。
Http协议之响应头
Http响应头由四部分组成,分别为状态行、响应头、空行和响应正文等。
状态行
状态行主要由三部分组成,分别为Http协议版本号、状态码和状态代码的文本描述等。如HTTP/1.1 200 OK。
状态码由三位数字组成,其中第一个数字定义了响应的类别,且有五种取值的可能。具体信息如下:
1**:表示请求已经接受,可以继续处理。
2**:表示请求已经被成功接受、理解和处理。
3**:表示重定向,若想完成请求需要进一步请求,一般接下来的请求链接为响应头Location字段对应的值。
4**:客户端错误,指请求出现语法错误或者请求无法达成。
5**:服务器端错误,表示服务器无法对请求做出处理。
常见状态码以及状态描述有如下几个:
200:客户端请求成功。
400:客户端请求出现语法错误,服务器端不能理解该请求。
401:指请求未经授权,该状态码需要与www-Authenticate配合使用。
403:服务器收到请求,但是拒绝提供服务。
404:请求资源未找到或者不存在,例如输入了错误的Url则会返回404状态码。
500:服务器发生不可预期的错误。
503:指服务处于不可用状态。
响应头
响应头由key-value键值对组成,每对构成一行,键和值由:分隔。响应头是服务器对客户端通知的响应信息。
典型的响应头有Server、Content-Encoding、Content-Type、Content-Length、Connection、Date、Expires、Location、Refresh、Set-Cookie、WWW-Authenticate等。此外还会有一些其他响应头信息,此处不一一列举。
- Server:
作用:指服务器名字,一般由Web服务器自己设置。 - Content-Encoding:
作用:指文档的编码。 - Content-Type:
作用:指文档的MIME类型。默认为text/plain,由servlet设置。 - Content-Length:
作用:指响应内容的长度。 - Connection:
作用:同请求头Connection。 - Date:
作用:指服务器返回内容的时间,由servlet设置。 - Expires:
作用:指文档的过期时间(缓存时间)。 - Location:
作用:表示客户端应该去何处提取文档,该字段与状态码302配合使用。 - Set-Cookie:
作用:设置与页面相关联的cookie。 - WWW-Authenticate:
作用:指客户端应该在Authorization头中提供的类型信息,与401状态码配合使用。
响应正文
响应头与响应正文之间有一行空行,这个空行表示响应头已经结束,接下来是响应正文。响应正文是服务器针对客户端提交的请求返还给客户端的文本信息,通常指html代码。