http和https有什么区别
http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份
tips:
- 对称性加密:加密和解密的密钥一样
- 非对称性加密: 需要两个密钥(公钥+私钥)使用公钥进行加密的数据只有对应的私钥才能解密
- http是超文本传输协议,浏览器利用这一协议就可以访问各种网站了。
- ssl指Secure Sockets Layer 安全套接层,是一种保证网络数据传输安全和完整的安全协议。
- https是在http规则的基础上又加了一层加密协议的超文本传输协议,s 指代 Secure Socket Layer 安全套接字层
http传数据大致是这样的:
http协议封装好的数据包 -> tcp/ip -> 服务器
缺点:数据包中途可能被窃取或者被篡改,被冒认访问
https大致流程是这样:
http协议封装好的数据包 + ssl加密 -> tcp/ip -> 服务器
缺点:虽然安全,但是开销变大了,传输速度也变慢了。
https步骤:
- a. 浏览器发起https请求
- b. 传输证书
- c. 浏览器解析证书
- d. 传送加密信息
- e. 服务器解密信息
- f. 传输加密后的信息
- g. 浏览器解密信息
WebSocket与http协议有什么关系?
http:
http协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。当需要即时通讯时,通过轮询方式(即在特定的时间间隔不断请求服务器,如1秒),由浏览器向服务器发送Request请求,然后将最新的数据返回给浏览器。简单的RESTful应用程序使用HTTP协议,它是无状态的。
缺点:
会导致过多不必要的请求,浪费流量和服务器资源,每一次请求、应答,都浪费了一定的流量在相同的头部信息上
WebSocket:
webSocket解决了http协议的缺点。在webSocket中只需要服务器和浏览器通过http协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。几乎所有的实时应用程序(如交易、监控、通知)服务都使用WebSocket在单个通信通道上接收数据。
webSocket与http相同点:
1、都是一样基于TCP的,都是可靠性传输协议。
2、都是应用层协议。
webSocket与http不同点:
1、webSocket是双向通信协议,模拟socket协议,可以双向发送或接受信息。http是单向的。
2、WebSocket是需要浏览器和服务器握手进行建立连接的。而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接。
webSocket与http的联系:
websocket在建立链接时是使用http协议的,链接一旦建立后,数据传输不需要http协议
一图以蔽之就是:
http请求要3次握手与4次挥手到底发生了什么事儿?
因为HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议.
建立TCP连接时会发生:三次握手(three-way handshake)
- client> server[SYN]
- server> client[SYN, ACK]
- client> server[ACK] ??,请说人话!!
3次握手是为了确保双方都知道对方收到了信息
关闭TCP连接时会发生:四次挥手(four-way handshake)
- client> server[FIN]
- server> client[ACK]
- server> client[FIN]
- client > server[ACK]
client等了一下没有收到server的返回,就关闭连接,server在收到client最后一句话时直接关闭连接
几个报文的标识的解释:
SYN: synchronization(同步)
ACK: acknowledgement(确认:告知已收到)
FIN: finish(结束)
http请求的get 和post有什么区别
| 请求方法 | GET | POST |
|---|---|---|
| 参数位置 | url中 | Request body |
| 参数长度 | 受制于url的长度,过长的参数会丢失 | (理论上)无限制 |
| 参数编码 | ASCII 编码 | (理论上)无限制 |
| 后退/刷新页面 | 不重复提交,回退无害 | 重复提交,回退有害 |
| 安全性 | 参数暴露在链接中,不安全 | 相对安全 |
| 缓存 | 可以缓存 | 不可缓存 |
| 书签 | 可收藏为书签(因为可以直接浏览器访问) | 不可收藏 |
| 历史 | 参数保留在浏览器的历史中 | 不会保留在浏览器历史 |
| 请求包数量 | 1个tcp数据包 (http header+data同时发送,服务器响应200 OK) | 2个(先发送http header,服务器响应100 continue 后再发送body data,服务器响应200 OK) |
前端请求跨域的解决方法
- 使用反向代理,将第三方的接口地址映射成本地的地址,前端只要调用本地的地址,就可以请求到第三方的数据了,比如,nginx提供的反向代理服务就很稳定,只要修改下nginx.conf文件就可以,
# 如后端api接口都通过gateway/进行访问,则nginx的配置如下
# 当本地访问localhost[:port]/gateway/xxx的时候,请求便会被代理到
# https://182.xxx.xxx.xxx:xxx/gateway/地址,实现同域访问
location /gateway/ {
proxy_pass https://182.xxx.xxx.xxx:xxx/gateway/;// 远程地址
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
- 修改浏览器配置,如chrome --disable-web-security--user-data-dir (不推荐)
- 使用jsonp 设置dataType: 'jsonp',但只支持get请求(不完美)
- CORS ,可以在服务端增加一个响应头Access-Control-Allow-Origin来告诉浏览器支持获取就可以了(需要服务端配合),参考:
Access-Control-Allow-Origin是HTML5中定义的一种解决资源跨域的策略,通过服务器端返回带有Access-Control-Allow-Origin标识的Response header,用来解决资源的跨域权限问题。
设置方法:
response.setHeader("Access-Control-Allow-Origin", "*"); // 支持所有域名访问资源
response.setHeader("Access-Control-Allow-Origin", "https://182.xxx.xxx.xxx:xxx/");
//支持指定域名地址访问
- 在nginx配置文件里面设置add_header ,参考:
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
etag off;
add_header Cache-Control "no-cache, no-store";
proxy_pass http://localhost:[port]; #port为本地服务端口
}
http2 的多路复用了解一下
- HTTP2 采用二进制格式传输,取代了 HTTP1.x 的文本格式,二进制格式解析更高效。
- 多路复用代替了 HTTP1.x 的序列和阻塞机制,所有的相同域名请求都通过同一个TCP连接并发完成。
- 在 HTTP1.x 中,并发多个请求需要多个 TCP 连接,浏览器为了控制资源会有 6-8 个 TCP 连接都限制。
- HTTP2 中同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接而带来的延时和内存消耗。
- 单个连接上可以并行交错的请求和响应,之间互不干扰
- 对Header头压缩,传输体积小
- 服务端推送,服务端能够更快的把资源推送给客户端
优势:
- 降低服务器压力
- 提升网站访问速度
- 保护网站安全
常见的HTTP状态码
http状态码(HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码,分为几类:消息(10x)、成功(20x)、重定向(30x)、请求错误(4xx)、服务器错误(5xx/6xx) 大多数情况看到5字头前端可以甩锅了🤭,常用的有以下:
| 状态码 | 含义 | 解释 |
|---|---|---|
| 100 | Continue | 此状态用于通知客户端请求已收到一部分,还没拒绝,你可以继续发,如前文所说的post请求过程中 |
| 200 | OK | 服务器已成功处理了请求。 通常表示服务器提供了请求的网页/内容 |
| 201 | Created | 请求成功并且服务器创建了新的资源 |
| 202 | Accepted | 服务器已接受请求,但尚未处理 |
| 203 | Non-Authoritative Information | 服务器已成功处理了请求,但返回的信息可能来自另一来源 |
| 204 | No Content | 服务器成功处理了请求,但没有返回任何内容 |
| 205 | Reset Content | 充值内容 |
| 206 | Partial Content | 服务器成功处理了部分get请求 |
| 300 | Multiple Choices | 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择 |
| 301 | Moved Permanently | 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 |
| 302 | Move Temporarily | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 |
| 303 | See Other | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 |
| 304 | Not Modified | 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 浏览器缓存策略中会使用此状态码 |
| 305 | Use Proxy | 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 |
| 307 | Temporary Redirect | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 |
| 400 | Bad Request | 服务器不理解请求的语法 |
| 401 | Unauthorized | 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应 |
| 403 | Forbidden | 服务器拒绝请求,通常用于未授权访问 |
| 404 | Not Found | (最常见)服务器找不到请求的网页 |
| 405 | Method Not Allowed | 禁用请求中指定的方法,如后端用POST,前端用了GET |
| 406 | Not Acceptable | 无法使用请求的内容特性响应请求的网页 |
| 407 | Proxy Authentication Required | 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理 |
| 408 | Request Timeout | 服务器等候请求时发生超时 |
| 409 | Conflict | 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息 |
| 410 | Gone | 如果请求的资源已永久删除,服务器就会返回此响应 |
| 411 | Length Required | 服务器不接受不含有效内容长度标头字段的请求 |
| 412 | Precondition Failed | 服务器未满足请求者在请求中设置的其中一个前提条件 |
| 413 | Request Entity Too Large | 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力 |
| 414 | Request-URI Too Long | 请求的 URI(通常为网址)过长,服务器无法处理 |
| 415 | Unsupported Media Type | 请求的格式不受请求页面的支持 |
| 416 | Requested Range Not Satisfiable | 如果页面无法提供请求的范围,则服务器会返回此状态代码 |
| 417 | Expectation Failed | 服务器未满足"期望"请求标头字段的要求 |
| 500 | Internal Server Error | 服务器遇到错误,无法完成请求 |
| 501 | Not Implemented | 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码 |
| 502 | Bad Gateway | 服务器作为网关或代理,从上游服务器收到无效响应 |
| 503 | Service Unavailable | 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态 |
| 504 | Gateway Timeout | 服务器作为网关或代理,但是没有及时从上游服务器收到请求 |
| 505 | HTTP Version Not Supported | 服务器不支持请求中所用的 HTTP 协议版本 |
| 600 | Unparseable Response Headers | 源站没有返回响应头部,只返回实体内容 |