通透,23 个问题 TCP 疑难杂症全解析

每个时代,都不会亏待会学习的人。

在进入今天主题之前我先抛几个问题,这篇文章一共提出 23 个问题

TCP 握手一定是三次?TCP 挥手一定是四次?

为什么要有快速重传,超时重传不够用?为什么要有 SACK,为什么要有 D-SACK?

都知道有滑动窗口,那由于接收方的太忙了滑动窗口降为了 0 怎么办?发送方就永远等着了?

Silly Window 又是什么?

为什么有滑动窗口流控还需要拥塞控制?

快速重传一定要依赖三次重复 ACK ?

这篇文章我想由浅到深地过一遍 TCP,不是生硬的搬出各个知识点,从问题入手,然后从发展、演进的角度来看 TCP

起初我在学计算机网络的时候就有非常非常多的疑问,脑子里简直充满了十万个为什么,而网络又非常的复杂,发展了这么多年东西真的太多了,今天我就大致的浅显地说一说我对 TCP 这些要点的理解

好了,废话不多说,开始上正菜。

TCP 是用来解决什么问题?

TCP 即 Transmission Control Protocol,可以看到是一个传输控制协议,重点就在这个控制

控制什么?

控制可靠、按序地传输以及端与端之间的流量控制。够了么?还不够,它需要更加智能,因此还需要加个拥塞控制,需要为整体网络的情况考虑。

这就是出行你我他,安全靠大家

为什么要 TCP,IP 层实现控制不行么?

我们知道网络是分层实现的,网络协议的设计就是为了通信,从链路层到 IP 层其实就已经可以完成通信了。

你看链路层不可或缺毕竟咱们电脑都是通过链路相互连接的,然后 IP 充当了地址的功能,所以通过 IP 咱们找到了对方就可以进行通信了。

那加个 TCP 层干啥?IP 层实现控制不就完事了嘛?

之所以要提取出一个 TCP 层来实现控制是因为 IP 层涉及到的设备更多,一条数据在网络上传输需要经过很多设备,而设备之间需要靠 IP 来寻址。

假设 IP 层实现了控制,那是不是涉及到的设备都需要关心很多事情?整体传输的效率是不是大打折扣了?

通透,23 个问题 TCP 疑难杂症全解析

我举个例子,假如 A 要传输给 F 一个积木,但是无法直接传输到,需要经过 B、C、D、E 这几个中转站之手。
这里有两种情况:

假设 BCDE 都需要关心这个积木搭错了没,都拆开包裹仔细的看看,没问题了再装回去,最终到了 F 的手中。

假设 BCDE 都不关心积木的情况,来啥包裹只管转发就完事了,由最终的 F 自己来检查这个积木答错了没。

你觉得哪种效率高?明显是第二种,转发的设备不需要关心这些事,只管转发就完事!

所以把控制的逻辑独立出来成 TCP 层,让真正的接收端来处理,这样网络整体的传输效率就高了。

连接到底是什么?

我们已经知道了为什么需要独立出 TCP 这一层,并且这一层主要是用来干嘛的,接下来就来看看它到底是怎么干的。

我们都知道 TCP 是面向连接的,那这个连接到底是个什么东西?真的是拉了一条线让端与端之间连起来了?

所谓的连接其实只是双方都维护了一个状态,通过每一次通信来维护状态的变更,使得看起来好像有一条线关联了对方。

TCP 协议头

在具体深入之前我们需要先来看看一些 TCP 头的格式,这很基础也很重要。

图来自网络

我就不一一解释了,挑重点的说。

首先可以看到 TCP 包只有端口,没有 IP。

Seq 就是 Sequence Number 即序号,它是用来解决乱序问题的。

ACK 就是 Acknowledgement Numer 即确认号,它是用来解决丢包情况的,告诉发送方这个包我收到啦。

标志位就是 TCP flags 用来标记这个包是什么类型的,用来控制 TPC 的状态。

窗口就是滑动窗口,Sliding Window,用来流控。

三次握手

明确了协议头的要点之后,我们再来看三次握手。

三次握手真是个老生常谈的问题了,但是真的懂了么?不是浮在表面?能不能延伸出一些点别的?

我们先来看一下熟悉的流程。

图来自网络

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsfjp.html