TCP 为什么需要连接
复习
- UDP:无连接、不保证送达与顺序
- 端口:传输层用端口定位应用
- IPv4 数据包:数据包可能丢失、乱序、重复
TL;DR
- TCP 要在不可靠的网络上,提供可靠的字节流
- 可靠传输需要双方共同维护状态
- 建立连接,就是先协商并同步这些状态
- 连接是一种双方约定,而不是一根物理线路
正文
UDP 把包裹丢出去就不管了。可很多时候,我们要的是“一个字节都不能少,而且顺序不能乱”。在一个会丢包、会乱序的网络里,这该怎么做到?
答案是 TCP(传输控制协议,Transmission Control Protocol)。而它的第一步,就是“建立连接”。
可靠,靠的是共同记忆
先想清楚:为什么可靠传输这么难?
因为网络本身不可靠:包可能丢失、可能乱序到达、可能重复。要在这之上做到可靠,双方必须“心里有数”——共同维护一套状态:
- 我发到第几个字节了?
- 我收到哪些了、还缺哪些?
- 我这边还能接收多少(缓冲区够不够)?
关键在于:这些状态必须双方一致。 如果发送方以为“序号到 100 了”,接收方却以为只到 80,那后面的对账就全乱了。
连接,就是先把状态对齐
于是,TCP 在正式传数据之前,先做一件事:让双方对齐这些状态。 这一步,就是我们说的“建立连接”。
它要协商的,至少包括:
- 双方各自的初始序号(从哪个数开始计)
- 确认双方的收发能力都正常
- 一些参数,比如最大能接收多大的数据块
连接建立好了,后面每一段数据都能带着序号、被确认,双方据此判断“有没有丢、要不要重传”。
连接是逻辑的,不是物理的
要特别澄清一点:TCP 的“连接”,并不是真的拉了一根物理线路。
网络上没有一根专属的线,数据包依旧是一段段独立传输的。所谓“连接”,只是双方各自在内存里记下一套共同的状态,并约定好按同一套规则收发。它更像两个人约定“我们现在开始按这个规矩对话”,而不是真的修了一条电话专线。
这也带来一个后果:一旦某一方状态丢失(比如机器崩溃重启),另一方还以为连接在,就会出现“我说着话,对面却已经忘了我是谁”的情况。这正是后面要处理的连接管理问题。
那么,这套状态具体是怎么对齐的?下一章看看那个著名的“三次握手”。
思考题 1
为什么可靠传输需要双方共同维护状态,而不能只靠发送方?
思考题 2
TCP 的“连接”为什么说是逻辑上的,而不是真的有一根线?
小结
知识点
- TCP 在不可靠网络上提供可靠字节流
- 可靠传输依赖双方共同维护状态
- 建立连接就是协商并对齐这些状态
- 连接是逻辑约定,不是物理线路
参考资料
- Wikipedia(zh):传输控制协议:提供可靠字节流的传输协议
- Wikipedia(zh):传输层:端到端的传输控制
思考题答案(仅供参考)
思考题 1
因为确认、重传和顺序都依赖双方对“收到哪里”的一致理解。接收方要告诉发送方哪些收到了、还缺什么;双方还要就序号、窗口等达成一致。只靠发送方一方,无法知道对面到底收没收到。
思考题 2
因为网络里没有为这条通信保留任何专线,数据包仍是一段段独立转发的。所谓连接,只是双方在各自内存里维护一套共同状态、按约定规则收发而已,所以它是逻辑上的约定,而非物理链路。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪