经常连在一起说的两个词,其实分属两层,做的是两件事。一个负责把数据可靠地送到对端,管顺序、管重发、管连接状态;另一个负责在中间找路,把数据一段段送过去。分工是上下关系:可靠的那一层坐在找路那一层上面,用它的通道来传输自己的数据。代理IP的转发程序通常同时跟这两层打交道。
各做各的事
上面那一层给数据编号,收到确认之后才认为送到了,没确认就重发。下面那一层拿到编号之后只管往对端送,中途丢了一份也不补,等上面那一层重发过来再送一次。所以看似浪费,实际是分工的结果:把「送到」和「送对」拆成两件事,各自简化。
- 上层建立连接 双方协商参数,进入可以传输的状态
- 上层切分编号 把内容切成带序号的分段
- 下层加地址送出 按目标地址逐跳转发
- 上层确认重发 收到确认才推进,没收到就补发
- 上层关闭连接 双向确认之后释放资源
为什么这么分
找路这件事只需要一个地址就够,做成简单高效;保证可靠需要记录状态、等待确认,代价更高。把代价高的部分集中到上面一层,只在需要的地方承担,网络整体效率更高。代理IP的转发程序在中间那一层工作,两种传输方式的差别它都要照顾到。
上面那一层还有另一种实现,不建立连接、不保证顺序,换来的开销更小。适合丢一点也没关系的场景。代理IP服务里的协议选择,一部分就是在两种实现之间挑。
把「送到」和「送对」拆成两件事,各自简化。
下层不补丢包,等上层重发过来再送一次。
分工之后每一层都能做得简单。代价高的部分集中到需要它的地方。
