一些http知识

前置知识

首先放一张非常经典的计算机网络

关于五层结构 「物理层」「数据链路层」「网络层」「运输层」「应用层」我们依次来讲

我们拿wireshark 抓个http包看一下就能明白各层的区别

物理层

只有在网线(光纤)中传递的bits

数据链路层

就有源mac 地址 和下一跳的mac 地址了(相当于网络设备的物理地址)

从图中看 源 d4:ee:07:69:fb:b0 到目的 98:01:a7:ae:c3:0d

源是我家的路由器,验证一下 终端输入 arp -a

192.168.199.1 的地址默认是局域网内路由器的IP,右边就是 d4:ee:07:69:fb:b0 路由器 mac 地址了

对应的 终端输入 ifconfig

en0下 ether 98:01:a7:ae:c3:0d 就是我们电脑网卡的mac 地址了

对应的arp 就是数据链路层的协议了

网络层

就有源ip 地址和 目的ip 地址了

常用的协议 ICMP,基本实现 ping 命令

传输层

增加对应的端口了 比如上层协议 http 在 传输层 协议上端口是 80, https是 443,对应的还会增加数据包的概念,例如 seq 数据包传输序列,acq 收到消息回执等一系列报文内容

常用的协议 tcp, udp

应用层

应用层大家就特别熟悉了 以http示例,会增加自定义的报文内容了,比如host acept之类的request的请求头,大家应该很清楚了

常用的协议: http https

https

我们在前面看到http的传输都是明文传输,如果有个坏蛋在路由器中植入一段恶意程序,把你的「数据包取出来转发给其他网络」那就很危险,为了提高网络安全性,引入https概念,为了避免http明文传输,https 在 传输层与应用层 增加了一层加密层 ssl,我们看一下具体的实现,首先也科普一些基础的https相关的知识

  • 加密算法,非对层加密算法 rsa , 由一个共钥和私钥组成,一般拿公钥加密的数据包只能拿私钥解开,举个最简单的加密例子,两个足够大的素数作为公钥,素数相乘的结果作为私钥,你拿着私钥基本取不出公钥,因式分解解不出来呀
  • 证书,证书的颁发一般来自一个负责发放和管理数字证书的权威机构,证书会以RSA将你的公钥用它的私钥加密起来,对应的你的操作系统里已经集成了解密证书的公钥,所以是权威机构颁发的证书,你是一定能够取到公钥的

我们具体看一下ssl层 握手的过程(ssl 层实现协议 tls)

我们来分析一下这个过程:

首先我们的主机向目的主机发了一个client hello 包

这个包包含

随机数1 Random 以及 SSL Version 等信息 之后server向我们源主机发了一个server hello Certificate 等包含信息的多个包

其中 server hello 包含 第二个随机数 Random2

Certificate 为服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥

Server Key Exchange DH算法,客户端发送服务器使用的DH参数(DH 是对称加密算法,剧透一下,DH 算法就是利用前面传递的Random随机数生成对称密钥)

Server Hello Done 通知客户端 Server Hello 过程结束

之后客户端会发送服务端一个包含Client Key Exchange Change Cipher Spec等包含信息的多个包

Client Key Exchange,其中Pubkey 为客户端生成的随机数 Random3 用服务端传送过来证书中的公钥加密的,学术语叫Premaster key 感兴趣的同学可以看看DH算法,服务端可以用私钥解密,至此服务端和客户端都拥有 Random1 Random2 Random3了,可以通过DH算法生成一个对称的密钥了

Change Cipher Spec,其中客户端通知服务端后面再发送的消息都会使用前面协商出来的密钥加密了,是一条事件消息。

Encrypted Handshake Message,其中客户端发出第一条加密消息。服务端接收后会用密钥解密,能解出来说明前面协商出来的密钥是一致的

之后服务端会发送客户端一个包含Change Cipher Spec Encrypted Handshake Message等包含信息的多个包

Change Cipher Spec:这一步对应于之前的事件消息,服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息

Encrypted Handshake Message:对一步对应于之前的加密消息,服务端发出第一条加密消息。客服端接收后会用密钥解密,能解出来说明前面协商出来的密钥是一致的

如果验证失败:断开链接,握手失败

经典tcp三次握手

最后提一下经典的tcp三次握手吧,有上面的分析经验后,tcp相信相对来说就会很简单了

其中SYN 和 ACK 为标志位信息,标志位一共有6种,常用的分别为:

  • SYN表示建立连接
  • FIN表示关闭连接
  • ACK表示响应
  • PSH表示有 DATA数据传输
  • RST表示连接重置

第一步:其中源主机向目的主机发起链接 标志位 SYN 发送一个seq 0序列的包 第二步:目的主机向源主机发起链接 标志位 SYN ACK ack = 0 + 1 发送一个seq 0序列的包 第三步:源主机发包 标志位 ACK ack = 0 + 1

握手成功!!!

http2

http2 是 http的新型协议,具有报文头部压缩,多路复用的特点。

http 1协议是串行的,一个请求发起必须再上一个请求结束后才能发起,为了提高效率,chrome 支持并行6个,即chrome 会开6个线程,分别做tcp 握手,数据传输,由于我们一般会打开请求头的keep-live 所以这6个tcp链接不会断开

http2 的多路复用则可以并发多个请求,没有之前6个的限制,来张图对比

http1:

http2:

http2已经出来5年了,主流浏览器均已支持,看一下详细情况

nginx 的修改也异常简单:listen 443 ssl http2

如果nginx 不支持 http2 怎么办?别担心

在ssl 那层握手的时候 client hello 的时候 会将h1和h2协议都带上,会和nginx “negotiate”

上图中的结果就是,我们使用h1吧

和浏览器的结合

tcp 握手耗时是橘黄色的耗时,紫色是ssl 握手的耗时

如果你想统计浏览器握手耗时的话,可以借助performance API

time = requestStart - secureConnectionStart
复制代码

把performance 的resource 挨个累加就好了

作者:FounderIsShadowWalker

链接:https://juejin.im/post/5e41162cf265da573e6717e7

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一些http知识的更多相关文章

  1. 你必须知道的EF知识和经验

    注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...

  2. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  3. 学点HTTP知识

    不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...

  4. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  5. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  6. [C#] C# 知识回顾 - 学会处理异常

    学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...

  7. [C#] C# 知识回顾 - 学会使用异常

    学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...

  8. [C#] C# 知识回顾 - 异常介绍

    异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...

  9. [.NET] C# 知识回顾 - Event 事件

    C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...

  10. [.NET] C# 知识回顾 - 事件入门

    C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...

随机推荐

  1. java的自增和自减

    class Untitled { public static void main(String[] args) { int a = 3; int b = a++; //a先赋值给b,然后a再自己加1 ...

  2. Win32双缓冲画图原理

    网上有许多文章讲述了如何使用Visual C++程序实现双缓冲,都是用C++面向对象语言写的,可能对很多没有接触过面向对象语言的C语言初学者来说理解起来有些困难,并且有些好心人也只是把源代码贴上去,不 ...

  3. cesium入门示例-HelloWorld

    示例准备: 在Cesium ion官网(https://cesium.com/)上注册用户,获取AccessToken,在js代码入口设置Cesium.Ion.defaultAccessToken,即 ...

  4. sql性能优化浅谈

    sql性能优化总结: 最近随着数据越来越多,数据库性能问题暴露的越来越严重.几百万,上千万,甚至过亿的数据处理速度会非常的慢. 下面对工作中遇到的问题做下总结,希望以后能对日后的工作有所帮助. 不同的 ...

  5. win7 任务栏 无法固定文件夹和文件 解决方法

    2010年开始使用win7,一直都在用一个功能,把常用的文件夹和文件都直接锁定到任务栏,方便使用. 最近这个功能一直有问题,开始只是重启以后,以前固定的文件没有了,这个也懒的去弄它,没了在添加一次. ...

  6. <USACO06NOV>玉米田Corn Fields

    状压emm 二进制真有趣 来自dp垃圾的欣喜 Description 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12 ...

  7. 自然语言分析工具Hanlp依存文法分析python使用总结(附带依存关系英文简写的中文解释)

    最近在做一个应用依存文法分析来提取文本中各种关系的词语的任务.例如:text=‘新中国在马克思的思想和恩格斯的理论阔步向前’: 我需要提取这个text中的并列的两个关系,从文中分析可知,“马克思的思想 ...

  8. 台式机安装CentOS7.6 Minimal ISO系统并增加图形化桌面

    需求:公司测试环境因业务原因,需要在台式电脑上安装带桌面的CentOS系统,因同事有一个7.6版本Minimal ISO镜像的安装U盘,为了图方便没有去下载everything ISO镜像,而是待同事 ...

  9. python调用adb命令进行手机操作

    Python中执行cmd命令可以用到os和subprocess两个模块. 区别在于os是阻塞式的,subprocess是非阻塞式的,所以一般我们使用subprocess是比较适合的. 接下来我先举一个 ...

  10. Mac系列萎靡 大棒能否敲醒苹果?

    大棒能否敲醒苹果?" title="Mac系列萎靡 大棒能否敲醒苹果?">     iPhone在智能手机市场中的一骑绝尘,不断将苹果推向神坛位置.即使新品更新幅度 ...