TCP, 可能是仅次于HTTP的和网络相关的出现频率最高的词汇。TCP作为一个网络通信中被使用最多的传输层协议,低位自然毋庸置疑,而在了解了他的设计哲学和很多精妙的思想之后,更是会由衷的觉得他取得这样的低位不是没有道理的。

TCP包格式

TCP学名Transmission Control Protocol,传输控制协议,是工作在IP层之上的另一个重要协议,也是应用的最广泛的一个协议,如果没有TCP,那么就不可能有现在的互联网。在介绍TCP的种种精妙的设计哲学之前,还得先从TCP包里到底有什么开始,毕竟,要知道TCP是怎么运作的前提是知道他是什么样子,又到了倾情献上手绘版的时刻了,但是这次手绘版画的有点不对称,凑合看吧。

 初识TCP  - 图1

0-15:源端口号 , 16-31: 目的地端口号,这两个和UDP的前32位相同。

32-63:序列号,用来标识每一个TCP包。

64-127:确认号,用来标识确认已经收到的包的序号。

96-99: TCP报文长度, 100-105:保留字段,全部置0。

106-111:标识符,这六个位每一个位都有其不同的含义,并且和其他的字段进行配合实现TCP的各种设计思想,在后面的介绍中基本都会详细的介绍到。

112-127:标识窗口大小,涉及到TCP的滑动窗口等等设计,在后面会详细介绍。

128-143: CRC,检测TCP包头是否有错,检测方法同UDP,会采用一个含有IP地址的伪头部的方式进行计算。

144-160: 紧急指针,用来标识出紧急数据的位置,这个是配合九个标志中之一的URG来使用。

160+:选项,如果有。

TCP的报文明显比UDP的要复杂,因为他要实现流量控制,可靠传输等等的功能,只有端口号肯定明显是不够的。可以看到在TCP的报文头中9个标识字段,这9个标识字段正是实现TCP各种复杂功能的基础,在后文中大部分会详加叙述,在这里就不展开了,因为在一个没有应用环境的条件下展开这些只不过是一种知识的罗列。

如果TCP的历史使命交到你手上

我有时候会想,如果我是TCP的设计者,我已经知道目前所拥有的一些协议的弊端和所有的背景,我会怎么设计这个协议?在一个不提供可靠的协议基础上加上各种想让其变得可靠的方法。静下来想想,我觉得我能想到一个最自然的想法是首先对每个包进行编号,因为只有编号才能排序,标识等等,不管是发送端还是接收端都有机会来对收到的包进行管理,包括秩序错乱,丢失某一个包。其次我还能想到的就是要有超时机制,这样当某一个包在网络上出现问题之后,避免某一段永无止境的等待下去。最后一个我能想到就就是在建立连接后,两边一定要有一个小程序来维护连接状态,这样才可以进行进一步的管理。

这也就是我能想出的三点了,不说没有系统性了,如果和TCP之中的思想比起来更是简陋不堪,所以我经常想,每个人都说要原创,但是原创这玩意儿是要靠天赋的。