2014-02-17

TCP网络协议及其思想的应用

Views: 19823 | 3 Comments

大部分程序员都听说过 TCP/IP 网络协议, 或者都写过 TCP socket 网络的程序, 甚至还学过 TCP 原理, 少部分看过 TCP 协议的某一个实现版本. 不过, 真正掌握 TCP 原理及思想的人, 我觉得不多. 只有理解了 TCP 原理及实现, 并且把它背后的思想和技术活学活用到其它的领域, 那才算是真正掌握了 TCP.

TCP 协议的目的, 是在不可靠传输的 IP 层之上建立一套可靠传输的机制, 它所应用的技术, 如滑动窗口, 慢启动, 指数退避, Negal 算法等, 都是优化目的.

活学活用 TCP, 要活学活用它的哪部分呢? 我觉得就是在不可靠传输之上建立可靠传输. 事实上, 传输是一个广义的概念, 不局限于狭义的网络传输, 应该理解为通信和交互. 任何涉及到通信和交互的东西, 都可以借鉴 TCP 的思想. 例如, 当一个人向另一个挥手, 另一个也要挥手回应, 这样的场景是一种交互, 也是一种通信.

可靠传输, 最重要的是要区分出通信的两端, 因为可靠传输不能脱离了通信的两端, 一旦脱离了, 可靠就会变成不可靠. 例如, 一些初学者使用 TCP socket 来开发聊天程序, 但想当然的认为既然使用了可靠传输的 TCP 协议, 那么整个系统就没有必要再考虑可靠传输的问题了. 这是非常错误的, 因为 TCP 的可靠只是对于它自身来说的, 甚至是对于 socket 接口层, 两个系统就不是可靠的了, 因为 write() 发送出去的数据, 没有确保对方真正的 read() 到. 或者再往上一层, 到了人机交互界面的一层, 即使消息已经发送到了对方的聊天窗口, 但对方可能没有看到(阅读到), 如果认为消息在聊天这一层层面已经可靠传输了, 那就错了.

可靠传输的第一要素是什么? 可靠传输的三要素:

  • 第一要素是确认
  • 第二要素是重传
  • 第三要素是排序(序号)

任何一个可靠传输的系统, 都必须包含这三个要素.

当然, 数据校验也是必要的, 但我们常使用的通信通道一般都提供了数据校验, 所以经常依赖于底层, 但要求特别高的场景, 也需要在上层做数据校验, 所以, 我不愿意把数据校验也列为一个必要的要素.

所以, 当你要设计一个可靠传输的系统, 例如在 UDP 之上实现可靠传输, 那么你就要立即想到这三个要素. 当你要在任何一个可以进行通信的系统之上创建自己的可靠通信系统, 无论这个底层的通信系统是以 API 的形式提供, 或者是以服务的形式, 只要它是一个通信系统, 那么就可以, 而且经常需要在上面创建自定义的可靠传输系统, 那么你应该立即想到可靠传输的三要素.

Related posts:

  1. 软件体系结构模式-层
  2. Windows Python select标准输入输出
  3. 经典的 TCP socket 读取报文错误
  4. 结合IO多路复用的多线程服务器模型
  5. 在Linux进行IO的正确姿势
Posted by ideawu at 2014-02-17 23:33:17

3 Responses to "TCP网络协议及其思想的应用"

Leave a Comment