P2P网络系列(已更新至第三期)

本文转自秘猿科技高级底层工程师Drift Luo的博客:

自学习编程以来,一直与网络编程缘分不浅,从最初的 Python 小爬虫项目,Django Web 项目,到 Rust 的 Influxdb client 项目,blog 项目,再到最近的 cita-cli 项目。以上项目都是基于 http 协议构建,从七层/四层网络协议模型上来看,http 属于应用层协议,它架设在 TCP 协议之上,一次 http 通信是一次很短的无状态连接,每次通信结束就直接断开连接,而 TCP 连接属于长连接,只要我们在使用 TCP 连接时不主动断开,那么它的连接会一直存在。
以下为全文链接。

(二)
我们必须得承认,哪怕经历了几十年的构建,底层网络依然是不安全的存在,工程师在硬件不安全的基础上构建一个相对安全的网络环境,而相对安全的概念实际上是非常微妙的。我们暂且不关心硬件上的意外丢包、断电、链路损坏等场景,将硬件层当成是安全的,在应用层、网络层依然有各种意外情况发生,例如:

  • 无法确定数据包是否到达、甚至连它是否一定能到达都是未知的;
  • 数据包到达后,远端节点无法响应(服务器繁忙)、响应在网络中丢失(断网、交换机配置错误)、响应被延时处理(缓存在队列中,未及时发送)等情况;
  • TCP 虽然能保证双方都在线的前提下,数据包能到达,但是,它的带宽是动态调整的,如果网络繁忙拥塞,延时时间是无法确定的;

在工程上,依然只能用尽力而为的态度去做,假定底层网络不会出现上诉问题,那么它的正常打开、通信、延时、关闭流程需要一个标准的协议去定义。

(三)
当库雏形初步完成的时候,我猛然发现,似乎我正在重新实现 https 协议。这是两个月之前,当库初步完成,我的一句感慨。

是的,如果你仔细看整个库的设计和实现,你会发现,这个库的整套逻辑与 https 不谋而合,也许没有那么精细,也许没有那么通用,但是通过实现这个库,让我也更能理解和领悟其他协议为什么会像现在这样设计和实现,甚至可以揣测到设计者当时碰到的各种问题。

整体架构

1赞