虽然本人是个程序猿,但是在好几场面试的时候面试官都问到了HTTP协议,由于对网络这方面不太熟悉,所以每次都是灰头土脸的出来,现在就总结一下HTTP协议,也为自己加深理解:
1.HTTP协议
1.1 什么是HTTP协议?
HTTP(超文本传输协议),它是一个应用层协议,基于TCP/IP通信协议;
常见的协议分层:
应用层协议:HTTP FTP DNS SMTP POP3 telent
传输层协议:TCP UDP
网络层协议:IP ICMP
1.2 HTTP的工作原理
HTTP协议工作于客户端-服务端架构上,浏览器作为HTTP客户端通过URL向HTTP服务端发送web请求。
三点注意事项:
① HTTP是无连接的:无连接的含义是限制每次连接只能处理一个请求,服务器处理完客户端的请求并收到回复之后立刻断开。(节省传输时间)
② HTTP是媒体独立的:只要客户端和服务端知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送;
③ HTTP是无状态协议:无状态协议指协议对事务处理没有记忆能力。
1.3 HTTP请求消息格式
HTTP请求消息由四部分组成:请求头 + 请求行 + 空行 + 请求体(请求数据)
1.4 HTTP的响应结构
HTTP 响应的三大部分:
① 状态码(Statu Code):描述了响应的状态,可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。
②HTTP头部(HTTP Header):它包含了更多关于响应的信息。比如:头部可以指定认为响应过期时间,或者是用来给用户安全传输实体内容的编码格式。
③主体(Body):它包含看响应的内容。他可以包含HTML代码、图片等,主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成。
1.5 HTTP的请求方法
GET | POST | HEAD | OPTIONS | PUT | PATCH | DELETE | TRACE | CONNECT
上述九个方法的作用:
GET:请求指定的页面信息并返回给实体主体
POST:向指定的资源提交数据进行处理请求。数据被包含在请求体中。
HEAD:类似于GET,只不过返回的响应中没有具体的内容,用于获取报头。
OPTIONS:允许客户端查看服务器性能。
PUT:从客户端向服务端传送的数据取代指定的文档内容。
PATCH:对PUT方法的补充,用来对已知资源进行局部更新。
DELETE:请求服务器删除指定的页面。
TRACE:回显服务器的请求,主要用于测试或诊断。
CONNECT:HTTP1.1中预留能够将连接改为管道方式的代理服务器。
GET和POST的区别:
GET() | POST() | |
---|---|---|
缓存 | 能被缓存 | 不能缓存 |
安全性 | GET的安全性能比较差,因为所发送的数据会显示在URL上 | POST比较安全,参数不会被保存在浏览器历史或者web服务器日志上 |
带参数时报文的区别 | GET方法的参数放在URL中 | POST方法参数放在HTTP的Body中 |
长度限制 | 对于特定的服务器和浏览器对URL的长度有限制 | 各个服务器会对POST提交数据大小进行限定 |
应用场景 | GET多用于请求数据 | POST多用于表单的提交 |
1.6 HTTP隧道
HTTP隧道是一种利用HTTP或者HTTPS把多种网络协议封装起来进行通信的技术,因此HTTP扮演了一个打通用于通信的网络协议的而管道的包装器的角色,把其他协议的请求掩盖成HTTP的请求就是HTTP隧道
1.7 HTTP状态码
当浏览器访问一个网页时,浏览器会向页面所在的服务器发送请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头用于响应浏览器的请求。
常见的HTTP状态码:
- 200 -请求成功
- 301 -资源被永久转移到其他的URL
- 404 -请求的资源不存在
- 500 -内部服务器错误
HTTP状态码分类:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作完成请求 |
4** | 客户端错误,请求包含语法错误或者无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生错误 |
1.8 HTTP1.0的缺点
-
使用“请求-响应”模式,不仅要在请求时需要先建立连接,而且需要客户端向服务端发出请求后服务端才可以服务数据;
-
HTTP1.0规定浏览器和服务器之间只保持短暂的连接,浏览器每次请求都要和服务端建立一个TCP连接,在请求响应完成之后立刻断开,服务器不去跟踪也不会记录。这会造成性能上的缺陷;
-
HTTP1.0最大的问题就是连接无法复用和head of line blocking;
连接无法复用 - 造成系统资源开销和整体延迟都会增大;(在每次请求时都会经历TCP三次握手和慢启动)
.
head of line blocking - 导致带宽无法被充分利用,以及后续健康请求被阻塞;(为了解决holb带来的延迟,pipelining机制产生了,但是只适用于HTTP 1.1)
HTTP 1.1
影响HTTP网络请求的因素主要有两个:带宽和延迟,由于现代网络体系的建设,带宽基本不会影响HTTP请求,所以 延迟 成为了主要因素;
基于上述HTTP 1.0的缺陷,HTTP 1.1做出了如下的改进措施:
措施 | 解释 |
---|---|
支持持久链接 | HTTP 1.0需要使用Connection:keep_alive参数来告知服务端需要建立一个长连接。而在HTTP 1.1中默认支持长连接,可以在一个TCP上传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟 |
请求响应 | HTTP 1.1允许客户端不用等待上次结果的返回,就可以发送下一个请求。但是服务器的回包策略必须按照接收客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分每次请求的响应内容 |
节约带宽 | HTTP 1.1支持只发送header信息的一部分(不带任何body信息)如果服务器认为客户端有权限请求服务器,则返回100;否则返回401; |
Range | HTTP 1.1支持传送内容的一部分。这样客户端只需要请求需要的内容 |
Host头处理 | HTTP 1.1的请求消息和响应消息都支持Host头处理,且请求消息中没有Host头域回报错(400 Bad Request) |
HTTP 2.0
HTTP 2.0在性能上由来很大的提升。下面时HTTP 2.0 的几大特性:
新特性 | 解释 |
---|---|
新的二进制格式 | 应用层(HTTP/2)和传输层(TCP/UDP)之间增加一个二进制分帧层。在不改动HTTP 1.X的语义、方法、状态码、URL 以及首部字段的情况下,解决了HTTP 1.1 的性能限制,改进了传输性能,实现了低延迟和高吞吐量在网络中文件传输最后也会转化为二进制文件传输,所以HTTP 2.0干脆采用二进制的传输格式; |
多路复用 | 即连接共享。每一个request都是用于连接共享机制的,接收方可以根据request的id将request在归属到各自不同的服务器端请求里面 |
header压缩 | HTTP 1.X的header带有大量信息,而且每次都要重复发送。HTTP 2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份encoder filds表,既避免了重复header的传输,又减小了需要传输的大小 |
HTTPS
HTTPS可以理解成HTTP+TLS/SSL+TCP,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL,用于完全的HTTP数据传输;通过使用SSL(HTTP先和SSL通信,SSL在和TCP通信)。HTTPS具有了加密(防窃听)认证(防伪装)和完整性保护(防篡改);