TCP/IP 系列之初印象

161 篇文章 2 订阅
TCP/IP 初印象

当我们聊 TCP/IP 的时候,一般是在说整个网络协议栈。也就是大家熟知的 OSI 七层模型。我们先抛开七层协议和三次握手这些生硬的知识点,简单聊聊网络协议栈到底是做什么的。

网络协议要解决的问题很简单,打个比方,就是让身处不同地方的两个人,能完成聊天通讯。无论我们谈及哪一方面的网络知识点,最后都不会脱离这个最基本的场景模型。

首先我们需要分清楚流和包的概念,这也是不少初学者容易混淆的问题。当我们以 iPhone 上的 App 客户端,向我们的 Server 发数据的时候,我们可以用 Charles、MITMProxy 这类工具抓包,但我们同时也知道 TCP 是基于流的协议,这二者的区别和联系在哪呢?

0 和 1 是计算机世界的基础粒子,大量的 0 和 1 组合在一起就形成了一个流(Stream),客户端向服务器发送数据的时候,说白了就是一堆 0 和 1 的组合。一次完整的 http 会话是建立在一个 TCP 连接之上,这个 TCP 连接的生命周期内所有发送的数据最后可以看做是一个流。而在这个流里,我们可以按照某种规则把它切割成一个个的包(packet)。比如 TCP 三次握手里就包含了 SYN,SYN+ACK,ACK 三个包,而这三个包,不过是整个 TCP Stream 最开始的部分数据而已。

所以简单来说,一个 TCP 连接里,是既有流的概念,又有包的存在,有些问题场景下会谈论流,另一些则会说起包,端看具体的场景如何。

在开始学习 TCP/IP 之前,最好能在脑中形成一幅 Gif 动态图像,客户端和服务器之间有两根管道,一根上行(从客户端到服务器),一根下行(从服务器到客户端),管道里流动着无数的 0 和 1,有时候管道里是满的,有时候管道里则空空如也,每次发送数据,都会有大量的 0 和 1 从一端涌向另一端。

有了这个基本的抽象理解,就可以进一步填补一些图像细节。

比如 0 和 1 是以什么形式流动的呢?这个在不同时代里,所用的物理硬件不同,原理自然也不同,现在大多用的是光纤,光纤里的 0 和 1 流动可以用下图表示:

物理层离应用层较远,深入学习的意义无法立竿见影,遇到实在费解的,可以先跳跃式的阅读,但有些基础的细节还是需要明白的。比如,我们知道光速大致是 300000 km/s ,而光在光纤中的物理传播速度大概是光速的 ⅔,这个知识点可以帮助我们大概估算一个 TCP 连接中的 RTT 值。RTT 即 Round Trip Time,表示一个包从发送方发出,到收到接收方的反馈,一共耗时多少。RTT 值反应的网络延时的状况,在很多场景下分析问题都有意义,比如 TCP 重发机制中的 RTO 就跟 RTT 有关,后面的文章我们会细说。一些知识点往往是环环相扣的,跳过的内容过多,后面学习起来会更费解。

延迟

再说下延迟的概念,延迟和带宽是我们谈及网络状况的两个重要指标。延迟看上去很好理解,延迟对应的英文术语是 Latency,不少人会觉得延迟主要跟通讯双方的物理距离相关,距离越远,自然延迟越高。其实网络延迟严格来说,是由两部分组成的,其一是 Transmission Delay,另一个是 Propagation Delay。这里出现了一个新单词 Delay,Delay 和 Lantency 的含义在中文语境里很难区分,但在英文语境下,二者的使用却是有明显的场景差别的,这也是为什么读英文原版很重要,可以让被描述的问题细节更清晰。

先说 Transmission Delay。计算机世界里的 0 和 1, 最后要能在光纤中传输,需要在 Physical Layer 将数字信号转化为物理信号,这个转化也是存在速度瓶颈的,我们用 Rate (bits/seconds) 来描述这个转化的速度,Rate 表示每一秒钟里,硬件设备能将多少 bits 转化为光信号放入光纤中,那么 Transmission Delay 就可以用如下公式表示:

Transmission Delay = M / Rate

M 表示有多少 bits。

Transmission Delay 描述的是硬件转化信号的延迟,这一步里信号还没有正式进入光纤中传播,这种延迟和通讯双方的物理距离是没有关系的。

再来是 Propagation Delay。这才是大部分人所理解的传播延迟,和距离直接相关。也可以用如下公式表示:

Propagation Delay = L / S

L 表示两地的物理距离,S 表示光纤中的传播速度,即为 ⅔ 光速。

最后我们才是所说的网络延迟:

Latency = Transmission Delay + Propagation Delay

像这种知识细节,如果不去看书,是很难形成准确认知的,这种细节丰满的认知不是快餐式技术文章可得,需要静下心来,花时间慢慢啃,一旦形成之后,就牢固的沉淀在记忆里,这样才算真正掌握了这方面的知识。

管道容量

再说个有意思的知识点。我们经常将网络通道比作自来水管道,这种比喻其实很贴切,网络管道和自来水管道一样,也是存在容量限制的。也就是说,光在光纤中传播的时候,会像自来水一样,填满整个光纤,光纤也存在管道容量的限制。有时候,光纤管道会变得很拥挤,一旦拥挤起来,有些包就要排队等待,延迟就会增加,丢包率也会随之上升,整个网络状况就会变差,这也是为什么 TCP 要做 Flow Control(流控),Flow Control 也是个很经典且有趣的问题,后面会专门写文章介绍。

网络管道的容量也是可以通过上面提到的元素,用公式计算的:

BD = Rate * Propagation Delay

大家可以思考下这个公式为什么会是这样。

好啦,序篇就到这,后面的文章里,我会逐个讲解一些关键且重要的知识点。一同进步吧,同时欢迎大家进入小编交流群:624212887,一起交流学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值