Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

TCP 为什么需要连接

复习

  • UDP:无连接、不保证送达与顺序
  • 端口:传输层用端口定位应用
  • IPv4 数据包:数据包可能丢失、乱序、重复

TL;DR

  • TCP 要在不可靠的网络上,提供可靠的字节流
  • 可靠传输需要双方共同维护状态
  • 建立连接,就是先协商并同步这些状态
  • 连接是一种双方约定,而不是一根物理线路

正文

  UDP 把包裹丢出去就不管了。可很多时候,我们要的是“一个字节都不能少,而且顺序不能乱”。在一个会丢包、会乱序的网络里,这该怎么做到?

  答案是 TCP(传输控制协议,Transmission Control Protocol)。而它的第一步,就是“建立连接”。

可靠,靠的是共同记忆

  先想清楚:为什么可靠传输这么难?

  因为网络本身不可靠:包可能丢失、可能乱序到达、可能重复。要在这之上做到可靠,双方必须“心里有数”——共同维护一套状态:

  • 我发到第几个字节了?
  • 我收到哪些了、还缺哪些?
  • 我这边还能接收多少(缓冲区够不够)?

  关键在于:这些状态必须双方一致。 如果发送方以为“序号到 100 了”,接收方却以为只到 80,那后面的对账就全乱了。

连接,就是先把状态对齐

  于是,TCP 在正式传数据之前,先做一件事:让双方对齐这些状态。 这一步,就是我们说的“建立连接”。

  它要协商的,至少包括:

  • 双方各自的初始序号(从哪个数开始计)
  • 确认双方的收发能力都正常
  • 一些参数,比如最大能接收多大的数据块

  连接建立好了,后面每一段数据都能带着序号、被确认,双方据此判断“有没有丢、要不要重传”。

连接是逻辑的,不是物理的

  要特别澄清一点:TCP 的“连接”,并不是真的拉了一根物理线路

  网络上没有一根专属的线,数据包依旧是一段段独立传输的。所谓“连接”,只是双方各自在内存里记下一套共同的状态,并约定好按同一套规则收发。它更像两个人约定“我们现在开始按这个规矩对话”,而不是真的修了一条电话专线。

  这也带来一个后果:一旦某一方状态丢失(比如机器崩溃重启),另一方还以为连接在,就会出现“我说着话,对面却已经忘了我是谁”的情况。这正是后面要处理的连接管理问题。

  那么,这套状态具体是怎么对齐的?下一章看看那个著名的“三次握手”。

思考题 1

  为什么可靠传输需要双方共同维护状态,而不能只靠发送方?

思考题 2

  TCP 的“连接”为什么说是逻辑上的,而不是真的有一根线?

小结

知识点

  • TCP 在不可靠网络上提供可靠字节流
  • 可靠传输依赖双方共同维护状态
  • 建立连接就是协商并对齐这些状态
  • 连接是逻辑约定,不是物理线路

参考资料

  1. Wikipedia(zh):传输控制协议:提供可靠字节流的传输协议
  2. Wikipedia(zh):传输层:端到端的传输控制

思考题答案(仅供参考)

思考题 1

  因为确认、重传和顺序都依赖双方对“收到哪里”的一致理解。接收方要告诉发送方哪些收到了、还缺什么;双方还要就序号、窗口等达成一致。只靠发送方一方,无法知道对面到底收没收到。

思考题 2

  因为网络里没有为这条通信保留任何专线,数据包仍是一段段独立转发的。所谓连接,只是双方在各自内存里维护一套共同状态、按约定规则收发而已,所以它是逻辑上的约定,而非物理链路。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪