专栏首页coding个人笔记http、https、http2一些概念

http、https、http2一些概念

非对称加密,现在用的几乎都是非对称加密,自己有一个密钥对公钥和私钥,公钥可以给任何人知道,别人通过公钥加密发数据给自己,自己通过密钥解密。

数字签名,当别人知道你的公钥,虽然不能解密传输的数据,但是可以劫持之后通过公钥加密伪造数据发送给你,这时候就需要数字签名了。将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名验证传输的内容是否是对方发送的数据,发送的数据没有被篡改过。

数字证书,比如有一个中间人通过一系列方法把你的电脑某个人的公钥给伪造了,然后你一直以为这是那个人的公钥,这时候就算被攻击了。这时候需要CA认证机构,也是通过公钥密钥加数字签名的方式,来验证我们公钥的真实性。(个人理解成CA机构永远不会被伪造攻击,所以能安全)

当我们浏览器输入一个域名地址之后,会先去浏览器本地缓存查找有没有域名对应的IP地址,如果没有会去本机的host文件去查询有没有域名和ip的指向,所以我们经常会在host文件去配置指向。再没有就会进行DNS解析,解析出域名对应的IP地址。一般来说DNS已经够了,但是DNS是没有全世界所有的网址的,所以还有一个更权威的机构,gTLD Server,,每一个顶级域名对应的IP都有记录。简单说第一步就是要把域名解析出IP地址。

http是无状态的,客户端和服务端不会知道之前通信的是谁。http1.0之后新增了持久连接,也就是说一次TCP连接可以发送多个请求,在浏览器的network里面可以看见response headers的Connection: keep-alive就是持久连接的标志,然后看connection id,相同就是用的同一个TCP连接。

http实体主体其实就是作为数据在http中传输的数据,可以等价为报文主体,报文主体是http的一部分。可以采用压缩把实体主体压小,在客户端解析数据,也可以分块传输实体主体的方法提升传输效率。我们如果在下载东西的过程中断了,按照以前我们是需要重新下载的,但是现在可以在中断中继续下载。我们可以使用到获取范围数据,这种叫做范围请求。

http有请求报文和响应报文,都是分为首部和报文主体组成。其中首部字段有很多内容,这边列举几个:

Accept-Encoding: gzip,compress:浏览器告诉服务器,它支持的压缩格式 User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0):浏览器告诉服务器,浏览器的内核是什么 Connection: close/Keep-Alive: 浏览器告诉服务器,请求完后是断开链接还是保持链接 Server:apache tomcat:服务器告诉浏览器,服务器的型号是什么 Transfer-Encoding: chunked: 服务器告诉浏览器数据以分块方式回送

https安全就是因为使用SSL建立安全的通信线路,其实HTTPS就是披着SSL的HTTP,采用数字签名和第三方CA的数字证书保证的安全。SSL加密还有加速的作用。

http使用端口是80,https使用端口是443,http在应用层工作,https的安全传输机制是在传输层工作。https信息都是加密的,抓包工具获取的也是加密的,具有校验机制,被篡改了就会立刻发现,有身份证书,防止被冒充。

一次http请求的几个步骤:

建立TCP连接

向浏览器发送请求行,也就是发送请求命令:GET /sample/hello.jsp HTTP/1.1

向浏览器发送请求头,然后用一个空白行结束头信息的发送,也就是报文首部和报文主体之间的空行。

服务器应答,也就是 HTTP/1.1 200 OK 这些。

服务器发送应答头,跟请求头一样。

服务器发送数据以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

关闭TCP连接。

http1.1版本默认持久连接,也就是TCP连接不断开,新增了管线化,客户端同时发出的多个http请求,不用一个一个等待响应,但是这个功能默认是关闭的,只限于理论阶段,因为可以同时发送,但是响应数据还是要按照顺序来一一接收。还新增了断点续传。利用HTTP消息头使用分块传输编码,将实体主体分块传输。

TCP连接限制:

对于同一个域名,浏览器最多只能同时创建 6~8 个 TCP 连接 (不同浏览器不一样)。为了解决数量限制,出现了域名分片技术,其实就是资源分域,将资源放在不同域名下(比如二级子域名下)。以一种变通的方式突破限制,但是会造成很多问题,因为过多连接对于服务器来说容易造成网络拥挤、交通阻塞等。

线头阻塞:

每个 TCP 连接同时只能处理一个请求响应,如果上一个响应没返回,后续请求响应都会受阻。所以管线化pipelining 技术出现了,但是管线化也有问题,比如第一个响应慢还是会阻塞后续响应、服务器为了按序返回响应需要缓存多个响应占用更多资源、浏览器中途断连重试可能得重新处理多个请求等等。

http2采用了二进制分帧层,帧是数据传输的最小单位,以二进制传输代替原本的明文传输,原本的报文消息被划分为更小的数据帧。而且会改变一些头字段。

http2的多路复用:

在一个 TCP 连接上,可以不断发送帧,每帧的 stream identifier标识这一帧属于哪个流,然后在对方接收时,根据 stream identifier 拼接每个流的所有帧组成数据。把 HTTP/1.1 每个请求都当作一个流,那么多个请求变成多个流,请求响应数据分成多个帧,不同流中的帧交错地发送,这就是 HTTP/2 中的多路复用。 http2 对于同一域名只需要创建一个连接,而不是像 http/1.1 那样创建 6~8 个连接。

http2服务推送:

浏览器发送一个请求,服务器主动向浏览器推送与这个请求相关的资源,这样浏览器就不用发起后续请求。

http2采用HPACK算法压缩头部。http1端对端关闭就直接断开连接,http2引入RST_STREAM类型的frame,可以在不断开连接的前提下取消某个请求的流。还可以设置请求的优先级。

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HTTP之跨域预请求options

    然后node server.js,打印出listen port 300表示启动成功,接着写一个Ajax请求:

    wade
  • H5新特性之语义化标签

    H5新增了很多标签,也更加语义化了,但是除了header、footer、nav等,其他的还真的没有去了解过,今天整理一下H5新增的语义化标签。

    wade
  • 重新认识原型和原型链二

    知道了prototype这个原型(也叫原型属性、原型对象,不要搞混了,原型、原型属性、原型对象都是同一个东西),我们还需要知道__proto__和constru...

    wade
  • Fiddler 抓包工具总结(APP接口分析)

    Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。也可以用来检测网络安全。反正好处多多,举之不尽呀!当年学...

    ZhangXianSheng
  • Scrapy爬虫框架

    Cloud-Cloudys
  • Envoy 基于 API 的动态配置

    当在 Envoy 配置中定义了上游集群后,Envoy 需要知道如何解析集群成员,这就是服务发现。端点发现服务(EDS)是 Envoy 基于 gRPC 或者用来获...

    我是阳明
  • 小程序- SaUi 之左右选择器(城市选择,汽车品牌)

    这次的更新,主要是基于城市选择来扩展的。主要是上一次有人问过我,如果数据过大的话 我这个东西 还能用么~所以才有了这一次的更新,也欢迎大家,对我所做的东西 进行...

    ss-lgh
  • 网络爬虫框架Scrapy详解之Request

    Request类是一个http请求的类,对于爬虫而言是一个很重要的类。通常在Spider中创建这样的一个请求,在Downloader中执行这样的一个请求。同时也...

    Python中文社区
  • iOS - MitRegx

    Mitchell
  • 高效遍历Java容器

    通过本文,你可以更深入的学习 Java 语言中 forEach 语法的知识,以及它和 C 语言形式的 for 循环、 Steam API 的对比。

    Java团长

扫码关注云+社区

领取腾讯云代金券