一些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. UnitTest测试框架-操作步骤

    一.UnitTest 1. TestCase 说明:测试用例 1.新建类并集成unittest.TestCase 2. TestSuite 说明:测试套件(多条用例) 方法: 1. 实例化 suite ...

  2. <JZOJ4726>种花

    挺有意思的贪心 神奇的贪心 #include<cstdio> #include<iostream> #include<cstring> #include<al ...

  3. 常见PHP安全网站漏洞及防范措施

    一:常见PHP安全网站漏洞 对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.se ...

  4. 吴裕雄--天生自然 R语言开发学习:时间序列(续三)

    #-----------------------------------------# # R in Action (2nd ed): Chapter 15 # # Time series # # r ...

  5. 如何在sublime中调试html文件

    一.安装View In Browser插件 快捷键 Ctrl+Shift+P(菜单栏Tools->Command Paletter),输入 pcip选中Install Package并回车,输入 ...

  6. Selenium的Web自动化测试(送源码)

    8.1  Selenium自动化测试准备 1.Selenium介绍 Selenium是一个Web开源自动化测试框架,页面级操作,模拟用户真实操作,API从系统层面触发事件. Selenium 1.0  ...

  7. Java8-19-lambda 重构代码

    通过本书的前七章,我们了解了Lambda和Stream API的强大威力. 你可能主要在新项目的代码中使用这些特性.如果你创建的是全新的Java项目,这是极好的时机,你可以轻装上阵,迅速地将新特性应用 ...

  8. 微软亚洲研究院的“哈利·波特”:Thomas Moscibroda

    在微软亚洲研究院,有一位名为Thomas Moscibroda的研究员几乎是无人不知.无人不晓,江湖人送外号"哈利·波特".Thomas认为他这么"红"是因为他 ...

  9. 1,Java知识储备

    1,关于 . java文件 规定:第一行为 package name; 表示该.java文件属于哪一个包. 一个.java文件中可以有多个类,但是只能有一个public类,并且这个public类必须与 ...

  10. .Net Core 使用jenkins 部署到远程服务器docker

    最近一直在研究docker和kubernetes,小型的项目其实也用不到k8s,本文就是描述如何用jenkins 进行构建asp.net core 3.1项目并且发布到远程服务器docker容器中.本 ...