供自己总结学习,也希望可以帮到有疑惑要解答的伙伴们,一起进步,一起努力吧!
文章目录
一、HTTP是什么?
1.基本概念
HTTP,全称Hype Text Transfer Protocol,超文本传输协议;HTTP是一个简单的请求-响应协议,它通常架构再TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
2.HTTP协议的主要特点
无状态
HTTP协议是无状态的,HTTP协议自身不对请求和响应之间的通信状态进行保存,任何两次请求之间都没有依赖关系。直观地讲,就是每个请求都是独立的。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事物,确保协议的可伸缩性,而特意将HTTP协议如此设计。
简单快速
在用户向服务器发送请求时,只需要传送请求方法和路径即可,不需要发送额外过多的数据。常用的请求方法有:get(获取资源)、post(传输资源)、put(更新资源)、head(获得报文头部)、delete(删除资源)。每种方法规定了客户与服务器联系的类型不同。并且由于HTTP协议结构较为简单,使得HTTP服务器的程序规模较小,因此通信速度很快。
灵活
HTTP协议对数据对象并没有要求,允许传输任意类型的数据对象。对于正在传输的数据类型,HTTP协议将通过Content-Type进行标记。
无连接
无连接是指对于连接加以限制,每一次的连接只会对应一个请求进行处理,当服务器对客户的请求处理完毕并收到客户端的应答后,就会直接断开连接。HTTP协议采用这种方式可以大大节省传输时间,提高传输效率。
二、HTTP报文的组成部分
1.请求报文
请求报文包括请求行、请求头、空行以及请求体。
① 请求行
请求行由请求字段、URL字段和HTTP协议版本字段3个字段组成,他们用空格分隔。
②请求头部
请求头部由关键字/值对组成,每行一对,关键字和关键值用英文冒号“:”分隔。请求头部通知服务器关于客户端请求的信息,典型请求头有:
User-Agent: 产生请求的浏览器类型。
Accept: 客户端可识别的内容类型列表。
Host: 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。
③空行
它的作用是通过一个空行,告诉服务器请求头部到此为止。
④请求数据
若方法字段是GET,则此项为空,没有数据。若方法字段是POST,则通常在此处放置的就是需要提交的数据。
2.响应报文
和请求报文相似,响应报文包括:状态行、响应头、空行以及响应体。
①状态行
状态行由HTTP协议版本、状态码、状态码描述三部分构成,他们之间由空格隔开。
状态码由3位数字组成,第一位标识响应的类型,状态码都是三位数字,分为5大类共33种。常用的5大类状态码如下:
- 1xx表示通知信息的,如请求收到了或正在进行处理。
- 2xx表示成功,如接受成功或知道了。
- 3xx表示重定向,表示要完成请求还必须采取进一步的行动。
- 4xx表示客户端的错误,如请求中有语法错误或不能完成。
- 5xx表示服务器端的错误,如服务器失效无法完成请求。
常用状态码如下:
状态码 | 含义 |
---|---|
100 | 请求已经接收,客户端可以继续发送请求 |
101 | 服务器已经收到并且理解了客户端的请求 |
200 | 一切正常 |
204 | 请求成功,无资源可返回 |
206 | 范围请求,请求范围内资源正常返回 |
301 | 永久重定向 |
302 | 暂时重定向,URL可能还会改变 |
400 | 请求存在语法错误 |
401 | 请求需要有通过HTTP认证的认证信息 |
403 | 禁止访问 |
404 | 资源没找到,not found |
500 | 服务端处理请求发生了错误,或web应用存在某些bug或临时的故障 |
503 | 服务器过载或者临时维护 |
504 | 网关超时,代理服务器等待应用服务器响应时的超时 |
②响应头
一般情况下,响应头会包括以下甚至更多的信息。
Location: 服务器返回给客户端,表示客户应当到哪里去提取文档;
Server: 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Vary: 标识不可缓存的请求头列表。
Connection: 连接方式。
对于请求端来讲:close是告诉服务端,断开连接,不用等待后续的求请了。keeplive则是告诉服务端,在完成本次请求的响应后,保持连接,等待本次连接后的后续请求。
对于响应端来讲:close表示连接已经关闭。keeplive则表示连接保持中,可以继续处理后续请求。Keep-Alive表示如果请求端保持连接,则该请求头部信息表明期望服务端保持连接多长时间(秒),例如300秒,应该这样写Keep-Alive: 300
③空行
最后一个响应头之后就是空行,用于告诉请求端以下内容不再是响应头的内容了
④响应内容
服务器端返回给请求端的文本信息。
三、HTTP方法POST和GET的区别
虽然HTTP方法包括GET、POST、HEAD、PUT、DELETE等,但我们日常用到的基本是POST和GET居多。
- GET在浏览器回退时是无害的,而POST会再次提交请求
- GET产生的URL地址可以被收藏,而POST不可以
- GET请求会被浏览器主动缓存,而POST不会,除非手动设置
- GET请求只能进行URL编码,而POST支持多种编码方式
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
- GET请求在URL中传送的参数是有长度限制的,而POST没有限制
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
- GET参数通过参数URL传递,POST放在Request body中
四、什么是持久连接 ?
HTTP协议采用“请求-应答”模式,当使用普通模式,即非Keep-Alive模式时,每个请求/应答客户和服务器都要新建立一个连接,完成后立即断开连接(HTTP协议为无连接的协议)
当使用Keep-Alive模式(又称持久连接,连接重用)时,Keep-Alive功能使客户端到服务端的连接持续有效,当出现对服务器的后续请求时,Keep-Alive功能避免了建立或者重新建立连接。
五、什么是管线化?
HTTP管线化 (HTTP pipelining)是将多个HTTP请求(request)整批提交的技术,而在发送过程中不需先等待伺服端的回应。
在使用持久连接的情况下,某个连接上消息的传递类似于
请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3
而管线化则是在某个连接上的消息变成了类似这样
请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3
HTTP管线化的基本原理
- 管线化机制通过持久连接完成,仅 HTTP/1.1支持此技术
- 只有GET和HEAD请求可以进行管线化,而POST则有所限制
- 初次创建连接时不应启动管线机制,因为对方(服务器)不一定支持HTTP/1.1版本的协议
- 管线化不会影响响应到来的顺序
- HTTP/1.1要求服务器端支持管线化,但并不要求服务器端也对响应进行管线化处理,只是要 求对于管线化的请求不失败即可
- 由于上面提到的服务器端问题,开启管线化很可能并不会带来大幅度的性能提升,而且很多 服务器端和代理程序对管线化的支持并不好,因此现代浏览器如Chrome和Firefox默认并未开 启管线化支持