Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【网络】HTTP和HTTPS #17

Open
Tracked by #6
swiftwind0405 opened this issue Mar 1, 2020 · 2 comments
Open
Tracked by #6

【网络】HTTP和HTTPS #17

swiftwind0405 opened this issue Mar 1, 2020 · 2 comments
Labels

Comments

@swiftwind0405
Copy link
Owner

swiftwind0405 commented Mar 1, 2020

image


HTTP(HyperText Transfer Protocol),超文本传输协议,是一个基于TCP实现的应用层协议。

image

HTTP的请求方法

GET: 获取URL指定的资源;
POST:传输实体信息
PUT:上传文件
DELETE:删除文件
HEAD:获取报文首部,与GET相比,不返回报文主体部分
OPTIONS:询问支持的方法
TRACE:追踪请求的路径;
CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信。主要使用SSL和TLS将数据加密后通过网络隧道进行传输。

HTTP应答状态码

状态码 类别 描述
1xx Informational(信息性状态码) 请求正在被处理
2xx Success(成功状态码) 请求处理成功
3xx Redirection(重定向状态码) 需要进行重定向
4xx Client Error(客户端状态码) 服务器无法处理请求
5xx Server Error(服务端状态码) 服务器处理请求时出错

image

HTTP2

优势:

  • 多路复用:在一个TCP连接中将所有请求并发完成。
  • 服务端推送:服务端可以在客户端确认需要资源(js css)之前把资源推送到客户端,而不是客户端解析了HTML之后再做请求
  • 数据流优先(Stream priority):HTTP/2采用二进制格式传输数据,而不是HTTP/1.x的那种文本格式。
  • 报头压缩:HTTP/2对报头采用 HPACK 算法进行压缩后传输,节省流量。
  • 强制加密:虽然加密不是强制的,但是多数浏览器都是通过TLS(HTTPS)实现的HTTP/2

二进制分帧层 (Binary Framing Layer)

在应用层与传输层之间增加一个二进制分帧层,以此达到在不改动 HTTP 的语义,HTTP 方法、状态码、URI 及首部字段的情况下,突破HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。在二进制分帧层上,HTTP2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中 HTTP1.x 的首部信息会被封装到 Headers 帧,而我们的 request body 则封装到 Data 帧里面。
image

多路复用

对于 HTTP/1.x,即使开启了长连接,请求的发送也是串行发送的,在带宽足够的情况下,对带宽的利用率不够,HTTP/2.0 采用了多路复用的方式,可以并行发送多个请求,提高对带宽的利用率。
image

HTTPS

HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。
TLS/SSL全称安全传输层协议Transport Layer Security,是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上不需要对HTTP页面进行太多的改造。

image

详细的工作流程:

image

图解HTTPS基本原理
image

参考资料

@swiftwind0405 swiftwind0405 changed the title 【Day07】HTTPS 【Day07】HTTP和HTTPS Mar 1, 2020
@swiftwind0405
Copy link
Owner Author

HTTP2的部分还需要深入了解

@swiftwind0405 swiftwind0405 changed the title 【Day07】HTTP和HTTPS 【网络】HTTP和HTTPS Apr 29, 2020
@swiftwind0405
Copy link
Owner Author

swiftwind0405 commented Dec 1, 2020

面试问题

get 和 post 的区别

标准答案:

  • GET请求参数放在URL上,POST请求参数放在请求体里
  • GET请求参数长度有限制,POST请求参数长度可以非常大
  • POST请求相较于GET请求安全一点点,因为GET请求的参数在URL上,且有历史记录
  • GET请求能缓存,POST不能

更进一步:

  • 其实HTTP协议并没有要求GET/POST请求参数必须放在URL上或请求体里,也没有规定GET请求的长度,目前对URL的长度限制,是各家浏览器设置的限制。GET和POST的根本区别在于:GET请求是幂等性的,而POST请求不是\

幂等性,指的是对某一资源进行一次或多次请求都具有相同的副作用。例如搜索就是一个幂等的操作,而删除、新增则不是一个幂等操作。

由于GET请求是幂等的,在网络不好的环境中,GET请求可能会重复尝试,造成重复操作数据的风险,因此,GET请求用于无副作用的操作(如搜索),新增/删除等操作适合用POST。

HTTP常见请求/响应头及其含义

通用头(请求头和响应头都有的首部)

字段 作用
Cache-Control 控制缓存 public:表示响应可以被任何对象缓存(包括客户端/代理服务器)private(默认值):响应只能被单个客户缓存,不能被代理服务器缓存no-cache:缓存要经过服务器验证,在浏览器使用缓存前,会对比ETag,若没变则返回304,使用缓存no-store:禁止任何缓存
Connection 是否需要持久连接(HTTP 1.1默认持久连接) keep-alive / close
Transfer-Encoding 报文主体的传输编码格式 chunked(分块) / identity(未压缩和修改) / gzip(LZ77压缩) / compress(LZW压缩,弃用) / deflate(zlib结构压缩)

请求头

字段 作用
Accept 告知(服务器)客户端可以处理的内容类型 text/html、image//*
If-Modified-Since 将Last-Modified的值发送给服务器,询问资源是否已经过期(被修改),过期则返回新资源,否则返回304 示例:If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
If-Unmodified-Since 将Last-Modified的值发送给服务器,询问文件是否被修改,若没有则返回200,否则返回412预处理错误,可用于断点续传。通俗点说If-Unmodified-Since是文件没有修改时下载,If-Modified-Since是文件修改时下载 示例:If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT
If-None-Match 将ETag的值发送给服务器,询问资源是否已经过期(被修改),过期则返回新资源,否则返回304 示例:If-None-Match: "bfc13a6472992d82d"
If-Match 将ETag的值发送给服务器,询问文件是否被修改,若没有则返回200,否则返回412预处理错误,可用于断点续传 示例:If-Match: "bfc129c88ca92d82d"
Range 告知服务器返回文件的哪一部分, 用于断点续传 示例:Range: bytes=200-1000, 2000-6576, 19000-
Host 指明了服务器的域名(对于虚拟主机来说),以及(可选的)服务器监听的TCP端口号 示例:Host:www.baidu.com
User-Agent 告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本 User-Agent: Mozilla/ () ()

响应头

字段 作用
Location 需要将页面重新定向至的地址。一般在响应码为3xx的响应中才会有意义 Location:
ETag 资源的特定版本的标识符,如果内容没有改变,Web服务器不需要发送完整的响应 ETag: "<etag_value>"
Server 处理请求的源头服务器所用到的软件相关信息 Server:

实体头(针对请求报文和响应报文的实体部分使用首部)

字段 作用
Allow 资源可支持http请求的方法 Allow: ,示例:Allow: GET, POST, HEAD
Last-Modified 资源最后的修改时间,用作一个验证器来判断接收到的或者存储的资源是否彼此一致,精度不如ETag 示例:Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT
Expires 响应过期时间 Expires: ,示例:Expires: Wed, 21 Oct 2020 07:28:00 GMT

HTTP/1.0和HTTP/1.1有什么区别

  • 长连接: HTTP/1.1支持长连接和请求的流水线,在一个TCP连接上可以传送多个HTTP请求,避免了因为多次建立TCP连接的时间消耗和延时
  • 缓存处理: HTTP/1.1引入Entity tag,If-Unmodified-Since, If-Match, If-None-Match等新的请求头来控制缓存,详见浏览器缓存小节
  • 带宽优化及网络连接的使用: HTTP1.1则在请求头引入了range头域,支持断点续传功能
  • Host头处理: 在HTTP/1.0中认为每台服务器都有唯一的IP地址,但随着虚拟主机技术的发展,多个主机共享一个IP地址愈发普遍,HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会400错误

介绍一下HTTP/2.0新特性

  • 多路复用: 即多个请求都通过一个TCP连接并发地完成
  • 服务端推送: 服务端能够主动把资源推送给客户端
  • 新的二进制格式: HTTP/2采用二进制格式传输数据,相比于HTTP/1.1的文本格式,二进制格式具有更好的解析性和拓展性
  • header压缩: HTTP/2压缩消息头,减少了传输数据的大小

说说HTTP/2.0多路复用基本原理以及解决的问题

HTTP/2解决的问题,就是HTTP/1.1存在的问题:

  • TCP慢启动: TCP连接建立后,会经历一个先慢后快的发送过程,就像汽车启动一般,如果我们的网页文件(HTML/JS/CSS/icon)都经过一次慢启动,对性能是不小的损耗。另外慢启动是TCP为了减少网络拥塞的一种策略,我们是没有办法改变的。
  • 多条TCP连接竞争带宽: 如果同时建立多条TCP连接,当带宽不足时就会竞争带宽,影响关键资源的下载。
  • HTTP/1.1队头阻塞: 尽管HTTP/1.1长链接可以通过一个TCP连接传输多个请求,但同一时刻只能处理一个请求,当前请求未结束前,其他请求只能处于阻塞状态。

为了解决以上几个问题,HTTP/2一个域名只使用一个TCP⻓连接来传输数据,而且请求直接是并行的、非阻塞的,这就是多路复用

实现原理: HTTP/2引入了一个二进制分帧层,客户端和服务端进行传输时,数据会先经过二进制分帧层处理,转化为一个个带有请求ID的帧,这些帧在传输完成后根据ID组合成对应的数据。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant