HTTP请求的构建

  1. 请求行
  • 请求方法,如get post put delete
  1. 首部字段

    • key value,如Accept-Charset 表示客户端可以接受的字符集,防止传过来是另外的字符集,导致乱码出现。

      Content-Type指正文格式,例如进行post请求,如果正文是json就应该将这个值设为json

HTTP请求的发送

面向链接的方式发送,通过stream二进制流的方式传送诶对方,到了tcp层,会把二进制流转化为一个个的报文发给服务器。

发送每个报文对需要对方回应ack,如果没有回应就一直发送,tcp每发送一个报文都需要加上源地址喝目标地址,放到ip头里面,交给ip层传输。

ip层查看目标地址和自己是否是同一个局域网,如果是就发送arp协议请求这个目标地址对应的mac地址,将源mac和目标mac放入mac头发送,如果不在同一个局域网,发送到网管,还需要发送arp协议,获取网关mac,将源mac和网关mac放入mac头发送。

网关收到包发现mac符合,取出目标ip,根据路由协议找到下一跳路由,获取下一跳路由mac,将包发给下一跳路由器。最终到达目标的局域网,这个时候最后一跳发现目标地址在自己的某一个出口的局域网,于是在整个局域网发送arp,得到目标mac地址,将包发出去。

目标及其发现mac地址符合,ip地址符合,解析tcp的头,查看序列号,如果正确就返回一个ack,不是就丢弃。tcp头里有端口号,http服务器正在监听端口号,于是目标机器知道是http服务器这个进程想要这个包,于是将包发送给http服务器。

HTTP返回的构建

状态码这是大家都很熟悉的如200,201,301,302,403,404,500

首部字段key value,如Retry-After,表示告诉客户端应该在多长时间再尝试,content-type 返回的是html还是json,然后后面的发送过程和请求时客户端发送的过程一致。这就是一个正常的http请求和返回的完整过程。

HTTP 2.0

HTTP 1.1 在应用层以纯文本的形式进行通信,每次通信都要带完整的http头,而且不考虑pipeline模式的话,每次过程在实时行和并发性都存在问题。

http2.0 对http的头进行压缩,将每次携带的大量key value在两端建立一个索引表,对相同的头只发送索引表中的索引。

http协议将一个tcp的连接中,切分为多个流,每个流都有自己的id,而且流可以是一个双向的虚拟通道,流也是有优先级别的。http中还有所有的传输消息分割为更小的信息和真,并对他们采用二进制格式编码。

通过这两种机制,http2.0的客户端可以讲多个请求分到不同的流中,将请求内容拆成帧,这些帧可以乱序传送,根据帧首部的流标识符重新组装,根据优先级决定处理哪个流的数据。

比如一个页面要发送三个独立的请求,分别获取css,js,jpg,如果使用http1.1就是串行的,如果使用2.0就可以在一个链接里,客户端和服务端可以同时发送多个请求或回应,而不是按照顺序一对一对应。

HTTP2.0解决了http1.1的队首阻塞问题,减少了tcp连接数对服务器性能的影响,同时加快了页面组件的传输速度。

QUCI协议

虽然2.0是可以解决1.1的高并发阻塞问题,但是2.0也是基于tcp洗衣的,当其中任何一个包遇到问题,都会阻塞住。

机制一:自定义连接机制

tcp连接是由四元组标识的,分别是源ip,源端口,目的ip,目的端口,任何一个元素发生变化时,就需要重新连接。再次进行三次握手,导致延时,在udp中,是以一个64位随机数作为id来标识,而且是无连接的,只要id不变就不需要重新建立连接。

机制二:自定义重传机制

quic有个序列号是递增的,任何一个序列号的包只发送一次,下次加一。例如,发送一个包,序号是100,发现没有返回,再次发送就是101,如果返回的ack是100,就是对第一个包的响应,返回ack101是第二个包的响应。quic还定义了一个offset概念,发送的数据在这个数据流离有个偏移量offset,可以通过offset查看数据发送到哪里,只要这个offset的包没有来就重发,如果来了就拼接。

机制三:无阻塞的多路复用

有了自定义连接和重传机制,就可以解决上面http2.0的多路复用问题。同一条QUIC连接上可以创建多个stream,发送多个http请求,但是quic是基于udp的,一个链接上多个stream之间没有依赖,这样,如果stream2丢了一个udp,后面跟着stream3的udp,虽然stream需要重传,但是stream3的包无需等待就可以发送。

机制四:自定义流量控制

tcp的流量控制是通过滑动窗口协议,quic通过window_update,来告诉对端它可以接受的字节数,但是quic的窗口是适应自己的多路复用机制的,不但在一个链接上控制窗口,还在一个连接中的每个stream控制窗口。

在tcp协议中,接收端的窗口的起点是下一个要接受并且ack的包,即便后来的包到了,放在缓存里,窗口也不能右移,只要前面的没到,后面的到了也不能ack,导致后面的到了,也有可能超时重传,浪费贷款。

quic的ack是基于offset的,每个offset包来了,进了缓存就可以应答,应答后不会重发,中间的空档会等待到来或者重发即可,而窗口的起始位置就是当前收到的最大offset,从这个offset到当前的stream所能容纳的最大缓存,就是真正窗口大小。

转载于:https://www.cnblogs.com/jimmyhe/p/11260530.html

HTTP1.1/2.0与QUIC协议相关推荐

  1. HTTP3.0和QUIC协议那些事

    HTTP3.0和QUIC协议那些事 文章目录 HTTP3.0和QUIC协议那些事 一.HTTP2.0和HTTP3.0 1.1 HTTP2.0和TCP的爱恨纠葛 1.2 谷歌为什么选择UDP 1.3 Q ...

  2. HTTP的前世今生(HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0)

    本文将从HTTP不断发展的时间线来讲解与其相关的知识点,其中包括HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0等,文章中内容涉及面较广,属于扫盲级别,不会特别深入某个知 ...

  3. 使用QUIC协议实现实时视频直播0卡顿

    一. 视频直播的痛点:卡顿 卡顿是最影响直播体验的因素之一,也是最难解决的问题之一.在流媒体的传输链路中,任何一个环节丢包都可能导致用户观看卡顿. 其中,主播端的推流卡顿最影响观看体验,会直接影响到所 ...

  4. E百科 | 第2期 扒一扒能加速互联网的QUIC协议

    简介: 众所周知,QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP.TLS.HTTP/2等协议的可靠性与安 ...

  5. 扒一扒能加速互联网的QUIC协议

    简介:众所周知,QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP.TLS.HTTP/2等协议的可靠性与安全 ...

  6. 谈谈QUIC协议原理

    QUIC,又名HTTP3,是近年来诞生的非常厉害的传输协议,它利用UDP解决了当前基于TCP协议的HTTP的许多问题,提升了在弱网环境下的网络通信体验.让我们来一探究竟! 1.1 什么是QUIC? Q ...

  7. 科普:QUIC协议原理分析

    作者介绍:lancelot,腾讯资深研发工程师.目前主要负责腾讯 stgw(腾讯安全云网关)的相关工作,整体推进腾讯内部及腾讯公有云,混合云的七层负载均衡及全站 HTTPS 接入.对 HTTPS,SP ...

  8. QUIC协议原理详解

    1.QUIC是啥? 1.1 什么是QUIC QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于UDP的传输协议,它实现了TCP + HTTPS + HTTP/2 ...

  9. 从Telnet到TCP,从HTTP2.0到QUIC

    前序 好久没有写软文了,这是一篇软文. 软文,在普通人眼里,就是广告,但从专业的角度看,就是没有技术含量的宣传性文章,一般都是穿西装皮鞋的经理喜欢写这种东西,其实你问他们技术细节他们根本就不懂,但是他 ...

最新文章

  1. LeetCode简单题之两数之和 IV - 输入 BST
  2. MySql中把一个表的数据插入到另一个表中的实现代码--转
  3. hihocoder 1107 : Shortest Proper Prefix
  4. 7个优秀的javascript资源
  5. ROS探索总结(四)——简单的机器人仿真
  6. 记录皮尔逊相关系数-相似性比较算法
  7. shell 函数定义和调用
  8. 从业回忆录,最后悔的事
  9. tez什么意思_Tezos 与 Ethereum 的区别
  10. python中函数包括标准库函数吗_Python标准库:内置函数divmod(a, b)
  11. 若依将ehcache改为redis缓存详细整合步骤
  12. 原码,反码,补码的概念
  13. Linux突然无法使用,是内存不足的问题
  14. 一个黑客的投资者指南
  15. MindSpore:自然语言处理(NLP)—分词技术
  16. php+mysql实现简易博客系统
  17. IDEA及PyCharm用校园邮箱申请使用及延长方法
  18. 对于Ubuntu16.04中jstest-gtk不能正常识别Logitech G920 racing wheel的问题补充
  19. ERROR: Could not build wheels for numpy which use PEP 517 and cannot be installed directly
  20. 如何让文字变成语音?推荐三个免费把文字变成音频软件

热门文章

  1. Spring Boot 注解(1)
  2. 从头写一个Cucumber测试(二) Cucumber Test
  3. 滑动返回-SwipeBackLayout
  4. 策略模式Strategy——坐什么车回家?
  5. UnrealScript吐槽系列之一:标识符作为操作符
  6. Android提高篇1 之 BroadcastReceiver 应用程序间通信的手段
  7. 用记事本打造简易计算器
  8. python 字符串find方法怎么用_Python字符串find()方法
  9. java set中取数据_Java中取数据库用的ResultSet问题
  10. lazada发货_Lazada 怎么发货:Lazada 订单发货流程