可靠地发送,TCP
寄出的信半路丢了一页,或者后面的页先到了,怎么办?网上的数据包也这样。有的会丢,有的会乱序。可文字还能完好送到,靠的是 TCP。
不丢,准确
像上一讲看到的,
数据变成小片,也就是数据包,
各走各的路过去。
可路并不完美。
一片可能半路丢了,
后面的片可能先到。
但收的一方必须
一片不丢、按顺序收到。
担起这事的约定就是 TCP。
点一下 TCP 承诺的两件事。一片不丢,并且按顺序。
目标清楚了。
不丢,按顺序。
说起来简单,
可路不完美就不容易。
TCP 用
三个小习惯来解决。
告诉对方收到了,
没到就重发,
看编号把顺序排好。
我们一个一个看。
告诉对方收到了
第一个习惯是确认。
收的一方每收到一片,
就短短回一句“收到了”。
这个回答叫确认信号,ACK。
就跟收快递后点一下“已签收”
一模一样。
寄的一方要等 ACK 回来,
才知道那一片平安到了。
没有 ACK,就还不知道。
点一下到达的数据包,回一个“收到了”确认(ACK)。ACK 回去,寄的一方就安心了。
每片都有 ACK 来回,
寄的一方就知道什么到了。
来回多了一句话,
看着可能慢一点。
可正因为这一句,
能把丢的那片准准地找出来。
那么没收到 ACK 的那片,
该怎么办呢?
答案很简单。再发一次。
没回就重发
第二个习惯是重传。
寄的一方等了好一阵,
要是某片的 ACK 还不来,
就想“噢,那片路上丢了”,
把那一片照样再发一次。
收的一方收到重发的片,
这次回一个 ACK。
这样把丢的片补上,
最后就一片不丢了。
点一下没收到确认(ACK)的那片,把它重发。重发的片到了,空缺就补上了。
靠着重传,
再没有丢的片了。
现在收的一方手里,
所有片都齐了。
可还剩一件事。
片是各走各的路过来的,
到的次序乱七八糟。
有时 5 号比 2 号先到。
那这顺序怎么摆正呢?
按编号排顺序
第三个习惯是排顺序。
TCP 给每片都带上编号。
1 号、2 号、3 号。
到的次序乱了也没关系。
收的一方看编号,
从小号开始一个个排队。
就算 5 号先到,
也给 2 号留着位子等着。
等编号顺序全填满,
原来的文字就原样复原了。
把乱序到达的片按编号(1, 2, 3, 4)点着排队。排齐了,原来的文字就回来了。
按编号排好,
乱掉的片
严丝合缝地拼回了原文。
丢的重收补上,
顺序用编号摆正。
在收的人眼里,
好像数据包从没丢过、也没乱过。
这一切的辛苦,
都是 TCP 在后头悄悄做的。
来理一理
归成一句话,是这样。
数据包可能丢失或乱序。
TCP 收到就发确认(ACK),
没来就重发(重传),
按编号排顺序。
所以收的一方总是
不丢、按顺序收到。
比起快,更看重可靠,这就是 TCP 的约定。
依次点要点回顾一下。(丢失/乱序 → 到了就 ACK → 没来就重传 → 按编号排序)
为了稳妥,TCP
确认、重发、排队。
那就要多等一会儿。
可有时这等待并不划算。
像语音通话或游戏,
丢一点也要快才好。
那时就用另一种方式。
下一讲,我们来认识一种
省掉确认、只管快发的方式。