作者:皮H痞 | 来源:互联网 | 2023-07-16 18:39
今天我们将从稳定性角度深挖 TCP 协议的运作机制。如今,大半个互联网都建立在 TCP 协议之上,我们使用的 HTTP 协议、消息队列、存储、缓存,都需要用到 TCP 协议——这是因为 TCP 协议提供了可靠性。简单来说,可靠性就是让数据无损送达。但若是考虑到成本,就会变得非常复杂——因为还需要尽可能地提升吞吐量、降低延迟、减少丢包率。
TCP 协议具有很强的实用性,而可靠性又是 TCP 最核心的能力,所以理所当然成为面试官们津津乐道的问题。具体来说,从一个终端有序地发出多个数据包,经过一个复杂的网络环境,到达目的地的时候会变得无序,而可靠性要求数据恢复到原始的顺序。这里我先给你提出两个问题:
TCP 协议是如何恢复数据的顺序的?
拆包和粘包的作用是什么?
下面请你带着这两个问题开始今天的学习。
TCP 的拆包和粘包
TCP 是一个传输层协议。TCP 发送数据的时候,往往不会将数据一次性发送,像下图这样:
而是将数据拆分成很多个部分,然后再逐个发送。像下图这样:
这里有很多原因:
- 比如为了稳定性,一次发送的数据越多,出错的概率越大。
- 再比如说为了效率,网络中有时候存在着并行的路径,拆分数据包就能更好地利用这些并行的路径。
- 再有,比如发送和接收数据的时候,都存在着缓冲区。如下图所示:
缓冲区是在内存中开辟的一块区域,目的是缓冲。因为大量的应用频繁地通过网卡收发数据,这个时候,网卡只能一个一个处理应用的请求。当网卡忙不过来的时候,数据就需要排队,也就是将数据放入缓冲区。如果每个应用都随意发送很大的数据,可能导致其他应用实时性遭到破坏。