HTTP和HTTPS的区别
HTTP | HTTPS | |
---|---|---|
说明 | 超文本传输协议,网络层协议 | HTTP+SSL |
证书 | 不需要 | 需要 |
信息传输方式 | 明文 | 密文(SSL加密) |
端口 | 80 | 443 |
连接 | 无状态 | 有状态 |
安全性 | 不安全 | 安全 |
HTTP1.0和HTTP1.1的区别
- http1.0中浏览器与服务器只保持短暂的连接,浏览器的每次请求都与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求
- 而http1.1则提供永久性连接
- http1.1中增加Host请求头字段后,实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点
- http1.1提供身份认证(基于口令的基本认证方式)
HTTP协议执行过程概述
- 客户端与服务器建立连接(通过TCP协议)
- 客户端向服务器发送请求(请求报文格式)
- 服务器向客户端发送响应信息(响应报文格式)
HTTP请求的一次完整过程
- 建立 TCP 连接(之前可能还有一次DNS域名解析)
- 三次握手建立TCP完成后,客户端向服务器发送请求命令,比如 GET https://www.baidu.com?name=xx&addr=xx HTTP1.1
- 客户端发送请求头信息,发送完了header后会接着发送一个空白行,GET请求没有数据,POST请求要发送body数据
- 服务器接收到以上信息后,开始处理业务,处理完有了结果以后,服务器开始应答
- 服务器返回响应头信息,发送完response header以后,再发送一个空白行
- 然后服务器向客户端发送数据
- 发送完了服务器四次挥手关闭 TCP 连接
请求报文格式
图解:
实例:
- 请求行
- 格式:请求方式 请求url 请求协议/版本
- 示例:GET /login.html HTTP/1.1
- 请求头
- 格式:请求头名称:请求头值(多组key-value对)
- 请求空行
- 作用:空行,用于分割请求头和请求体
- 请求体
- 用于封装POST请求消息的请求参数
- 只有使用POST方式的请求才有请求体
响应报文格式
图解:
实例:
- 状态行
- HTTP版本号 状态码 状态值 换行符
- 响应头
- 响应头名称:响应头值(多组key-value对)
- 响应空行
- 空行,用于分隔响应头和响应体
- 响应体
- 存放响应的数据
请求报文和响应报文中的知识点
请求方式
请求报文中的请求行包含请求方式部分,HTTP协议有8种请求方式,常用的有2种(GET和POST)
- GET
- 请求参数在请求行中,在url后
- 请求的url长度是有限制的(请求能携带的参数较少)
- 不太安全
- 高效
- 会在浏览器的地址栏显示数据内容
- POST
- 请求参数在请求体中
- 请求的url长度没有限制(请求能携带的参数较多)
- 相对安全
- 不高效
- 不会在浏览器的地址栏显示数据内容
- PUT
- 向指定资源位置上传其最新内容
- DELETE
- 请求服务器删除Request-URL所标识的资源
- OPTIONS
- 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
- HEAD
- 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息
- TRACE
- 回显服务器收到的请求,主要用于测试或诊断
- CONNECT
- HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
GET和POST方法的区别
- get重点在从服务器上获取资源,post重点在向服务器发送数据
- get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?“连接,多个请求数据间用”&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的
- Get受URL长度限制,传输的数据量小,但效率较高;Post可以传输大量数据,所以上传文件时只能用Post方式
- get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;post较get安全性较高
- get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码;post支持标准字符集,可以正确传递中文字符
请求头
常见的请求头:
- User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息(用于解决浏览器兼容性问题)
- Referer:告诉服务器,我(当前请求)从哪里来。可以用于防盗链或统计工作
- Accept:支持的数据类型
- Accept-Encoding:支持的编码格式
- Accept-Language:语言环境
- Cache-Control:缓存控制
- Connection:请求完成是断开还是保持连接
响应头
常见的响应头:
- Allow:服务器支持哪些请求方法
- Content-Encoding:文档的编码方法
- Content-Length:内容长度
- Concent-Type:后面的文档属于的MIME类型
- Date:当前的GMT时间
- Expires:应该在什么时候认为文档已过期而不再缓存它
- Last-Modified:文档的最后改动时间
- Location:客户应当到哪里去提取文档
- Refresh:浏览器应该在多少时间之后刷新文档(单位:秒)
- Server:服务器名字
- Set-Cookie:设置和页面关联的Cookie
- WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息
响应状态码
状态码分类:
- 1xx:信息,服务器收到请求,需要请求者继续执行操作
- 2xx:成功,操作被成功接收并处理
- 3xx:重定向,需要进一步的操作以完成请求
- 4xx:客户端错误,请求包含语法错误或无法完成请求
- 5xx:服务器错误,服务器在处理请求的过程中发生了错误
常见状态码:
- 200:请求成功
- 301:永久重定向,资源被永久转移到其他URL
- 302:临时重定向(重定向时会改变method:把POST改为GET)
- 307:临时重定向(不会改变method)
- 400:错误的请求
- 401:未被授权,需要身份验证
- 403:请求被拒绝
- 404:请求的资源不存在
- 500:内部服务器错误
- 502:网关错误,收到了上游响应但无法解析
- 503:服务器暂时无法使用
- 504:上游响应超时
HTTP相关面试题
HTTP的缓存机制
HTTP的缓存分为两种,都通过HTTP响应头控制缓存:
- 强制缓存:再次请求时,无需再向服务器发送请求
- 协商缓存:再次请求时,需要向服务器校验新鲜度,如果资源是新鲜的,就返回304,从浏览器获取资源
HTTP长连接与短连接
- 短连接:在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话
- 长连接:从HTTP/1.1起,默认使用长连接,用以保持连接特性。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接
- 本质:HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接
http的无状态无连接的含义
- 无连接:服务器处理完客户的请求,并收到客户的应答后,即断开连接
- 无状态:每个请求都是独立的,服务器不知道客户端是什么状态
HTTP是无状态协议,应如何保存用户的状态?
HTTP是无状态协议,即不保存状态,也就是HTTP协议自身不对请求和响应之间的通信状态进行保存。保存用户状态使用的是Session机制,Session的主要作用就是通过服务端记录用户的状态。服务端给特定的用户创建特定的 Session之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个Session,过了时间限制,就会销毁这个Session)。Session保存在服务端,一般保存在内存或数据库中。通过在Cookie中附加一个Session ID的方式实现Session跟踪。如果Cookie被禁用了,就利用URL重写把Session ID直接附加到URL路径的后面。
Cookie的作用是什么?与Session的区别是什么?
- 概述:Cookie和Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样
- 作用:Cookie一般用来保存用户信息
- 区别:
- Cookie一般用来保存用户信息,Session一般用来通过服务器端记录用户的状态
- Cookie数据保存在客户端,Session数据保存在服务器端
- 相对来说Session安全性比Cookie高(因为Session存储在服务器端)
URI和URL的区别
- URI:统一资源标志符,可以唯一标识一个资源
- URL:统一资源定位符,可以提供该资源的路径
- 区别:URL是一种具体的URI,不仅唯一标识资源,而且提供定位该资源的信息
HTTP优化方案
- TCP复用:TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能;而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。
- 内容缓存:将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
压缩:将文本数据进行压缩,减少带宽 - SSL加速(SSL Acceleration):使用SSL协议对HTTP协议进行加密,在通道内加密并加速
- TCP缓冲:通过采用TCP缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。
keep-alive的作用
在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.0中以及HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive。
keep-alive的优点:
- 较少的CPU和内存的使用(由于同时打开的连接的减少了)
- 允许请求和应答的HTTP管线化
- 降低拥塞控制 (TCP连接减少了)
- 减少了后续请求的延迟(无需再进行握手)
报告错误无需关闭TCP连接