2020年5月22日 下午3:21
问题总结:
- 都 2019 年了,还问 GET 和 POST 的区别
- 总结:
- GET 用于获取信息,是无副作用的,是幂等的,且可缓存
- POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存
- 几个错误的传说:
- GET 方法参数写法是固定的吗?
- POST 方法比 GET 方法安全
- GET 方法的长度限制是怎么回事?
- POST 方法会产生两个 TCP 数据包?
- 总结:
- 什么是队头阻塞?为什么pipelining会操作队头阻塞?
- 什么是队头阻塞?
- 从名字上就可以看出来:其中的“队”指的是队列。队列有先进先出(FIFO),对应到client端就是:先发出去的,我要先收到返回的相应。
- 为什么pipelining会操作队头阻塞?
- 管道化要求服务端按照请求发送的顺序返回响应(FIFO),原因很简单,HTTP请求和响应并没有序号标识,无法将乱序的响应与请求关联起来。
- 也就是说client端需要知道那个请求被相应了,由于没有需要标识,就只能按顺序来默认了(真是够笨的!)
- 客户端需要保持未收到响应的请求,当连接意外中断时,需要重新发送这部分请求。
- 管道化要求服务端按照请求发送的顺序返回响应(FIFO),原因很简单,HTTP请求和响应并没有序号标识,无法将乱序的响应与请求关联起来。
- 管道化是多有的请求都可以是使用的技巧吗?
- 只有幂等的请求才能进行管道化,也就是只有GET和HEAD请求才能管道化,否则可能会出现意料之外的结果
- 什么是幂等性?
- 一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。
- 换句话说就是,幂等方法不应该具有副作用(统计用途除外)
- 幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同
- 什么是队头阻塞?
- 为什么叫多路复用?它为什么可以解决队头阻塞问题?
- 为什么叫多路复用?
- 将多个请求复用同一个tcp链接中
- 它为什么可以解决队头阻塞问题?
- 要回答这个问题,首先我们需要从上面的:为什么pipelining会操作队头阻塞?开始分析
- 引起队头阻塞的根本原因是传递消息的没有序号标识
- 于是,我们就给每个消息一个序号标识不就行了吗?
- 对,并且在http2.0中还进一步的将消息进行的切割,让他的粒度更加的小变成了帧,每个帧都有一个序号,标识他在某个消息中的顺序。
- 每个帧在传输是属于一个数据流,而一个连接上可以存在多个流,各个帧在流和连接上独立传输,到达之后在组装成消息,这样就避免了请求/响应阻塞。
- 为什么要切分为更小的粒度,帧?
- 因为这样就可以让server端,在接受消息的时候可以同时接收到多种消息,即使每个消息只有一部分。
- 这样做的好处是类似于消息并发传递的感觉,而不是传完一个消息再传另外一个,由于这样做到了消息的并发传递,那么也实现了队头阻塞中所指的消息为单位阻塞在队列中。

- 上面也回答了:如何实现多路复用?
- 要回答这个问题,首先我们需要从上面的:为什么pipelining会操作队头阻塞?开始分析
- 为什么叫多路复用?
- 在使用了帧、流的技巧之后,队头阻塞依然还会发生?
- 当我们把多个需要传递的消息切碎,然后通过tcp进行传递给服务端,虽然这是没有了消息这个概念,因为消息切成了帧。但是这里的帧由于是使用tcp进行传递的,tcp本身实现的滑动窗口确认机制依然会造成帧的阻塞。
- 这不过这个阻塞是在帧的粒度下,而不是在消息的粒度下。
- 什么是队头阻塞以及如何解决_网络_weixin_34364071的博客-CSDN博客
http的发展
【Http】队头阻塞(Head of line blocking)多路复用(Multiplexing) - 是谁扭曲了时空 - 博客园
- 图中第一种请求方式,就是单次发送request请求,收到response后再进行下一次请求,显示是很低效的。
- 于是http1.1提出了管线化(pipelining)技术,就是如图中第二中请求方式,一次性发送多个request请求。
- 而在持久连接的基础上,HTTP1.1进一步地支持在持久连接上使用管道化(pipelining)特性。
- 管道化允许客户端在已发送的请求收到服务端的响应之前发送下一个请求,借此来减少等待时间提高吞吐;如果多个请求能在同一个TCP分节发送的话,还能提高网络利用率。
- 但是因为HTTP管道化本身可能会导致队头阻塞的问题,以及一些其他的原因,现代浏览器默认都关闭了管道化。
- 然而pipelining在接收response返回时,也必须依顺序接收,如果前一个请求遇到了阻塞,后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。这种情况就如图中第三种,第一个请求阻塞后,后面的请求都需要等待,这也就是队头阻塞(Head of line blocking)。
- 为了解决上述阻塞问题,http2中提出了多路复用(Multiplexing)技术,Multiplexing是通信和计算机网络领域的专业名词。http2中将多个请求复用同一个tcp链接中,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。也就是将每个request-response拆分为了细小的二进制帧Frame,这样即使一个请求被阻塞了,也不会影响其他请求,如图中第四种情况所示。