HTTP协议
即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
HTTP默认的端口号为80,HTTPS的端口号为443
特点
HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议的主要特点可概括如下:
1、支持客户/服务器模式。支持基本认证和安全认证。
2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4、HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。
5、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
流程
HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。
在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。一个重要的概念是面向连接,即HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。
具体可以通过抓包工具查看(wireshark)
HTTP的报文结构
HTTP有两类报文
- 请求报文-从客户端向服务器发送请求报文
- 响应报文-从服务器到客户的回答
由于HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCII码串,因而每个字段的长度都是不确定的
开始行,用于区分是请求报文还是响应报文,请求报文的开始行叫做请求行,而在响应报文中的开始行叫做状态行。在开始行的三个字段之间都以空格分隔开,最后的“CR”和“LF”分别代表回车和换行。
首部行,用来说明浏览器,服务器,或报文主题的一些信息。首部可以有好几行,但也可以不使用。在每个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”,整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
实体主体,在请求报文中一般不用这个字段,而在响应报文中也可能没有这个字段。
请求报文的第一行只有三个内容,即方法,请求资源的url,以及HTTP的版本
常用的几种方法
方法(操作) | 意义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求读取由URL所标志的信息 |
HEAD | 请求读取由URL所标志的信息的首部 |
POST | 给服务器添加信息(例如,注释) |
PUT | 在指明的URL下存储一个文档 |
DELETE | 删除指明的URL所标志的资源 |
TRACE | 用来进行环回测试的请求报文 |
CONNECT | 用于代理服务器 |
每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行。
状态行包括三项内容,即HTTP的版本,状态码,以及解释状态码的简单短语
状态码(Status-Code)都是三位数字的,分为5大类,这5大类的状态码都是以不同的数字开头的。
1xx表示通知信息,如请求收到了或正在进行处理
2xx表示成功,如接受或知道了
3xx表示重定向,如要完成请求还必须采取进一步的行动
4xx表示客户的差错,如请求中有错误的语法或不能完成
5xx表示服务器的差错,如服务器失效无法完成请求
以下三种状态行在响应报文中是经常见到的
HTTP/1.1 202 Accepted{接受}
HTTP/1.1 400 Bad Request{错误的请求}
HTTP/1.1 404 Not Found{找不到}
若请求的网页转移到了一个新的地址,则响应报文的状态行和一个首部行就是下面的形式
HTTP/1.1 303 Moved Permantly{永久性的转移了}
Location: http://www.xxx.xxx/xx/index.html{新的URL}
在服务器上存放用户的信息
HTTP是无状态的,这样简化了服务器的设计,在实际工作中,一些站点却希望能识别用户。例如购物,一个顾客要购买多种商品,当他把选好的一件物品放入购物车,还要继续浏览和选购其他物品,因此,服务器需要记住用户的身份,使他接着选购的东西能够放入同一个购物车内,这样便于集中结账,有时某些站点也可能想限制某些用户的访问,要做到这点,可以在HTTP中使用Cookie,表示在HTTP服务器和客户之间传递的状态信息。
Cookie是这样工作的,当A浏览某个使用Cookie的网站时,该网站的服务器就为A产生一个唯一的识别码,并以此作为索引,在服务器的后端数据库中产生一个项目,接着在给A的HTTP响应报文中添加一个叫做Set-cookie的首部行。这里的首部字段名就是“Set-cookie”而后面的“值”就是赋予该用户的“识别码”。
当A收到这个响应时,其浏览器就在他管理的特定Cookie文件中添加一行,其中包括这个服务器的主机名和Set-cookie后面给出的识别码,当A继续浏览这个网站时,每发送一个HTTP请求报文,其浏览器就会从其Cookie文件中取出这个网站的识别码,并放到HTTP请求报文的Cookie首部行中