传输控制协议(Transmission Control PRotocol, TCP) TCP协议主为了在主机间实现高可靠性的包交换传输协议。本文将描述协议标准和实现的一些方法。因为计算机网络在现代社会中已经是不可缺少的了,TCP协议主要在网络不可靠的时候完成通信,对军方可能非凡有用,但是对于政府和商用部门也适用。TCP是面向连接的端到端的可靠协议。它支持多种网络应用程序。TCP对下层服务没有多少要求,它假定下层只能提供不可靠的数据报服务,它可以在多种硬件构成的网络上运行。下面的图是TCP在层次式结构中的位置,它的下层是ip协议,TCP可以根据IP协议提供的服务传送大小不定的数据,IP协议负责对数据进行分段,重组,在多种网络中传送。
对于将要连接或初始化的连接,两个TCP必须和对方的初始序列号同步。这通过交换一个控制位SYN和初始序列号完成。我们把带有SYN的数据段称为"SYNs"。同步的获得过程这里就不重复了,每方必须发送自己的序列号并返回对对方序列号的确认。 1) A --> B SYN 本方序列号是X 2) A <-- B ACK 本方序列号被确认 3) A <-- B SYN 对方序列号是Y 4) A --> B ACK 确认对方序列号
为了区别多个RECEIVE并保证缓冲区不被布满,返回的数据中也要包括缓冲区指针和一个计数器指明现在接收了多少数据。RECEIVE可以有自己专用了缓冲区,也可以和用户共享一个缓冲区。 Close 格式: CLOSE (本地连接名) 此命令关闭连接,假如连接未打开,或未授权可以关闭连接返回错误。在关闭的时候应该注重正常关闭,让所有的发送都发送完数据,也可以如上所说在CLOSE后面加上几个SEND,这就要求用户在收到CLOSE后仍然要进行接收。因此,CLOSE意指“我没有更多的数据要发了”,并不代表“我不再发送任何数据了”。关闭方也可能在超时前不能发出所有数据,这种情况下,要由CLOSE转入ABORT状态。用户可以自己决定在任何时间关闭连接,也可以根据TCP返回的提示关闭。因此关闭操作要和外TCP进行通信,因此在关闭状态可能要呆一会儿,在CLOSE没有返回前调用打开,会返回错误。 Status 格式: STATUS (本地连接名) -> status data 这个命令和具体的实现有关,而且有可能会有负作用。返回的信息通常来自有连接相关的TCB。返回的数据块中包括下面的信息:本地套接字,外套接字,本地连接名,接收窗口,发送窗口,连接状态,等待确认的缓冲区数,等待接收的缓冲区数,紧急状态,优先级,security/compartment和传输超时。因此实现不同,所以上述数据项中可能有几项没有意义或根本不存在。假如调用进程没有被授权使用这一连接,返回错误。这一点会防止未被授权的进程获得连接状态。 Abort 格式: ABORT (本地连接名) 此命令中止所有SEND和RECEIVE,删除TCB,将发送非凡的RESERT信息到对方TCP。具体的返回信息会因实现不同而不同。 TCP到用户信息 假定操作系统提供一种可以使TCP异步传送信息到用户程序的机制。当TCP确实通知用户程序时会返回一些特定的信息。通常在这些信息中也会有错误信息,在其它情况下会有关于完成SEND或RECEIVE或其它用户调用的相关信息。会提供下面的几种消息: 本地连接名 都提供 响应串 都提供 缓冲区地址 发送和接收 字节记数 接收 Push标记 接收 Urgent标记 接收
TCP和下层接口 TCP实际上调用下层服务才能在网络上传输数据,在互联网上我们通常认为TCP的下层是IP协议。假如下层是IP层,它提供一些类于服务类型和生存时间的参数。TCP使用这些参数的如下设置: Type of Service = Precedence: routine, Delay: normal, Throughput: normal, Re liability: normal;或是数字00000000。 Time to Live = 一分钟,或是数字00111100。 请注重:假定的最大数据段的生存时间为2分钟,这里人为指定为1分钟。 假如下层是IP而且使用源地址路由,接口必须答应路由信息的通信。这对建立连接和进行路由是十分重要的。当然也可以不使用IP协议作为TCP的底层协议,但无论下层协议是什么,都必须提供源地址,目的地址和协议域,以及一些决定TCP长度的域,总之一句话,要能够提供类似于IP的功能。
用户调用的有: OPEN SEND RECEIVE CLOSE ABORT STATUS 接收数据段的有: SEGMENT ARRIVES 超时的有: USER TIMEOUT RETRANSMISSION TIMEOUT TIME-WAIT TIMEOUT TCP对用户的响应可能是立即的也可能是延时的。错误信息以字符串的形式给出。下面就是一个具体的错误信息:error: connection not open。另外,请记住序列号空间大小为2的32次方。处理数据段的顺序为首先接收,再检查序列号,假如是要接收的就放入接收队列。另外,没有说明状态转移时,TCP保持原来的状态。 OPEN调用 CLOSED状态