Go中TLS源码学习(1)之Https服务端框架详解

请添加图片描述

💖SSL/TLS专栏目录导航💖

专栏包括的内容:
💥1. SSL/TLS原理知识
💥2. Go源码中TLS实现
💥3. openssl中TLS实现
💥4. SSL卸载
💥5. SSL代理
💥6. SSL V.P.N
💥7. SSL 与 IPSec
💥8. 其他
请添加图片描述



SSL/TLS协议从诞生到现在已经近30年了,除了早期网景公司的程序员实现的SSL上存在部分技术问题外,SSL3.0到TLS1.3的实现还是很成熟、稳定的。现阶段,TLS的实现比较经典的有openssl, 这个简直是安全领域的圣经呀,采用C代码构建的庞大的体系,openssl及其衍生项目应该称得上是当下网络安全的基石。

当然除了openssl外,还有一个比较经典的https包实现,这就是go源码中的net/http包。加之现在正在使用Go语言做项目,为了更加快速学习go语言及其编码规范,因此准备学习下go源码中的tls实现。

本文计划将Go源码、openssl中的TLS实现做一个简要的学习并记录之。涉及的语言主要是:Go语言,C语言。

通过这个TLS实现章节(注:此文只是节选的一部分, 最初是一个介绍TLS实现的大章节,既包括go实现,也包括c实现;因此这里章节序号不再调整,方便以后直接更新修改完善),希望能够达到的目标如下:

  • 逐步深入了解TLS握手协议
  • 了解TLS握手协议中各关键字段的使用方式、作用
  • 能够分析TLS为何这样设计
  • 针对某种场景,根据TLS协议特点分析是否能够满足要求

5.1 Go源码TLS实现

先易后难吧,go的实现应该比较人性化一点。不能上来就啃硬骨头,容易失去信心。

5.1.1 https服务端实例

在Go中创建https服务比较容易。下面给一个示例:
请添加图片描述

在浏览器中输入对应的URL便可以访问go创建的https服务器:
请添加图片描述

上面演示了如何使用Go搭建一个Https服务器。下面便是通过刚才的程序,一步步来学习经典的net/http中HTTPS的实现框架,并重点学习其中的TLS的实现逻辑。

5.1.2 https实现框架

学习一门语言,网上的大佬们都是推荐阅读源码,通过那些顶级开发者的代码形成良好的编码风格和习惯。这也是我比较推崇的学习方式,在工作中也偶尔去阅读一些经典的源码实现;学习Go语言自然不能放过net/http包的实现。Why? 因为Go的net/http包在业界中相当的出名,非常优秀,因此一直做网络开发并在学习Go的我应该学习下。

最初的一段时间,直接在go源码中寻找tls的实现。感觉找到了,因为到处都是TLS相关的代码,但是又没完全找到,只是因为我不知道从哪里开始阅读,谁最初调用的协商接口,最后报文又发向何方,等等诸多问题 。困难比较大,于是乎,颓废了一段时间。后来我开始循序渐进的学习,先学习基本的http服务的逻辑,然后是gin实现的web框架,最后才到了tls实现。现在再回首,这个路线还是很有效果,后来阅读TLS代码容易了很多。

Go中https服务端框架整理如下:
请添加图片描述

无论go原生的web框架,还是Gin框架等等,都是采用上述架构它也是非常常见的服务器模型

❤️ 一个协程(线程)专门用于监控端口,创建连接

❤️ 每一个连接创建一个协程(线程),专门处理该连接上的业务逻辑

不同的是,其他语言(如C)都是采用线程来处理,而Go采用更加轻量级的gorouting来处理,因此性能更佳,能处理更多的并发请求。

上图中还重点强调了“Web框架”。目前go存在很多的web框架,原因在于Go源码中的默认web框架实现非常的简单(ServeHTTP实现的比较简单),无法满足比较复杂的业务逻辑。如果想实现更复杂的web框架,可以自定义实现满足需求的web框架(无论如何实现,但必须实现ServeHTTP接口)。Go原生的ServeHTTP(默认:DefaultServeMux)实现中,路由采用的是map的方式,而Gin框架中采用的是前缀树的方式;前缀树的方式是目前比较通用的路由匹配算法

上图中的框架比较简洁,也是比较通用的服务器架构。下面是我整理了很久的HTTPS的框架实现。将关键核心代码放到了图片中,可以通过一张图来了解go中Https服务实现的基本框架。下图的左半侧是TLS相关的逻辑;右半侧是原生Http服务相关的逻辑

请添加图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叨陪鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值