HTTP系列:HTTP协议

目录

什么是协议

定义

主要特点

版本演进了什么?

长连接和短连接

HTTP请求

协议格式

请求头

GET与POST区别

HTTP响应

如何知道已经传输完成?

每次请求都要建立连接吗?

Http会话的过程?

HTTP 2.0


什么是协议

协议相当于两个需要通过网络通信的程序达成的一种约定, 它规定了报文的交换方式和包含的意义。

定义

浏览器与服务器之间的一问一答的交互过程必须遵循一定的规则这个规则就是HTTP协议

 

功能:用于在服务器和客户机之间传输超文本文件。

 

HTTP构建于TCP/IP协议之上,默认端口号是80。

HTTP是无连接无状态的。

 

主要特点

无连接是每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。后来使用了Keep-Alive技术

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。

HTTP协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。

为了解决HTTP无状态的缺点,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。Cookie在客户端记录状态,比如登录状态。Session在服务器记录状态。

 

版本演进了什么?

HTTP协议的版本分为:1.0和1.1 其区别是:

在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源(短连接),最多同时4个TCP

HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源(长连接),多同时2个TCP

原来根据RF2616的要求,客户端和同一个server之间确实只能建立不超过2个TCP(http 1.1是2个,1.0是4个连接,最新的浏览器都是6个)连接以避免拥塞

 

长连接和短连接

 

HTTP系列:HTTP协议

非持久连接(短连接):每次服务器发出一个对象后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。

持久连接(长连接):服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。HTTP/1.1的默认模式使用带流水线的持久连接。

HTTP系列:HTTP协议

 

HTTP请求

协议格式

http://host[":"port][abs_path]

请求头

(客户端浏览器)http请求由四部分组成,分别是:请求行、消息报头、空行、请求正文

HTTP系列:HTTP协议

HTTP系列:HTTP协议

请求头部后面的空行是必须的。

请求行格式:Method Request-URI HTTP-Version CRLF  

 

Method表示请求方法;

Request-URI是一个统一资源标识符;

HTTP-Version表示请求的HTTP协议版本;

CRLF表示回车和换行。

除了作为结尾的CRLF外,不允许出现单独的CR或LF字符

 

GET与POST区别

(0)GET是幂等,POST是非幂等的

(1)HTTP request请求主要是get和post,get请求参数在请求行里面,post的参数封装在请求体里面

(2)GET方法通常没有消息主体,支持最大1024个字节的查询字符串,POST方法没有限制。POST方法把查询字符串放在消息主体中传输,因此比GET方法支持更多的数据类型。

POST在header里面相比之下多了content-Type 和 Content-Length

post获取不到数据,可以考虑排查传入的value不对

表单:multipart/form-data 

默认:application/x-www-form-urlencoded (中文或特殊字符会对URL进行了转码)

JSON:application/json 

HTML:text/html等 

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

GET 请求指定的页面信息,并返回实体主体。

HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

PUT 从客户端向服务器传送的数据取代指定的文档的内容。

DELETE 请求服务器删除指定的页面。

CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 OPTIONS 允许客户端查看服务器的性能。 TRACE 回显服务器收到的请求,主要用于测试或诊断。

 

DNT

DNT不是2012年才出现的概念。 “禁止追踪”(Do Not Track)是HTTP一个头字段,用户选择了这个字段就可以免于被第三方网站追踪网络痕迹。

NDT现在接受三个赋值:1代表用户不想被第三方网站追踪,0代表接受追踪,null代表用户不置可否。

HTTP响应

(服务器端)HTTP响应也是由四个部分组成,分别是:状态行、消息报头、空行、响应正文

HTTP系列:HTTP协议

HTTP系列:HTTP协议

HTTP系列:HTTP协议

 

 

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

 

1xx:指示信息--表示请求已接收,继续处理

2xx:成功--表示请求已被成功接收、理解、接受

3xx:重定向--要完成请求必须进行更进一步的操作

4xx:客户端错误--请求有语法错误或请求无法实现

5xx:服务器端错误--服务器未能实现合法的请求

 

常见状态码

200 OK      //客户端请求成功

400 Bad Request  //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 

403 Forbidden  //服务器收到请求,但是拒绝提供服务

404 Not Found  //请求资源不存在,例如:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

502、504 (网关超时) 

 

 

如何知道已经传输完成?

使用长连接之后,客户端、服务端怎么知道本次传输结束呢?

1.判断传输数据:是否达到了Content-Length指示的大小;

2.动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。

HTTP系列:HTTP协议

每次请求都要建立连接吗?

持久连接的一个最大的好处是:大大减少了连接的建立以及关闭时延。

Http会话的过程?

  • 建立tcp连接
  • 发出请求文档
  • 发出响应文档
  • 释放tcp连接

 

HTTP 2.0

 HTTP系列:HTTP协议

HTTP 2.0中,同域名下所有通信都在单个连接上完成(多个 HTTP 请求可以在同一个 TCP 连接中并行进行),该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。

多路复用,代替原来的序列和阻塞机制。所有就是请求的都是通过一个 TCP连接并发完成。 HTTP 1.x 中,如果想并发多个请求,必须使用多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制,如下图,红色圈出来的请求就因域名链接数已超过限制,而被挂起等待了一段时间:HTTP系列:HTTP协议