一、TCP主要特点
TCP是面向连接的、可靠的、字节流服务
面向连接:应用程序在使用TCP协议之前,必须先建立TCP连接,在传送数据完毕后,必须释放已经建立的TCP连接。也就是说应用进程之间的通信号和像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。注意:每一条TCP连接只能有两个端点,是点对点的,所以基于广播和多播(目标是多个主机地址的)应用程序不能使用TCP服务,而无连接协议UDP则非常适合于广播和多播。
可靠:通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达
面向字节流:CP 中的“流”(stream)指的是流入到进程或从进程流出的字节序列。“面向字节流"的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。 当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。
二、TCP报文段首部格式
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。下面讨论TCP报文段的首部格式。
TCP的头部结构,包括固定头部结构和头部选项。TCP报文段首部的前20个字节是固定的,头部选项是可选的,头部选项最多40字节,所以TCP头部长度最长一共60字节,TCP头部长度最短是20字节。
16位端口号(port number):告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。
32位序号(sequence number):一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN ( Initial SequenceNumber,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将破系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外-一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。
32位确认号(acknowledgement number):用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对B发送来的TCP报文段的确认号。反之,B发送出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
4位头部长度(header length) :标识该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。
保留:占6位,保留为今后使用,但目前应置为0。
6位标志位包含如下几项:
URG标志,表示紧急指针(urgent pointer)是否有效。
ACK标志,表示确认号是否有效。我们称携带ACK标志的TCP报文段为确认报文段。
PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会--直停留在TCP接收缓冲区中)。
RST标志,表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。
SYN标志,表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文段。
FIN标志,表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。
16位窗口大小( window size):是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window, RWND).它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
16位校验和(TCP checksum):由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
16位紧急指针(urgent pointer):是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
选项:长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节。
TCP最初只规定了一种选项,即最大报文段长度MMS(Maximun Segment Size),MMS是每一个TCP报文段中的数据字段的最大长度,数据字段加上TCP首部才等于整个TCP报文段。随着互联网的发展,又增加了几个选项,如窗口扩大选项、时间戳选项等。
窗口扩大选项:TCP首部固定长度中有一个16位的窗口大小,即一次能发送2^16=64K字节的数据,这在早期可能够用,但随着互联网的发展不够用所以要扩大窗口。该选项占3字节,其中有一个字节表示移位值S,新的窗口值等于TCP首部中的窗口位数从16增加到(16+S)。移位值允许使用的最大值是14,想当于窗口最大值增大到2^(16+14)-1=2^30-1。
窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0的选项,使窗口大小回到16.
时间戳选项:时间戳选项占10字节,其中最主要的字段是时间戳值字段(4字节)和时间截回送回答字段(4字节)。时间戳选项有以下两个功能:
第一,用来计算往返时间 RTT (见后面的 5.6.2节)。发送方在发送报 文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间截回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。
第二,用于处理TCP序号超过22的情况,这又称为防止序号绕回PAWS (ProtetAgainst Wrapped Sequence numbers), 我们知道,TCP 报文段的序号只有32位,而每增加2^32个字号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能会被重复使用。例如当使用1.5Mbit/s的速率发送报文段时,序号重复要6个小时以上,但若用2.5Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,可以在报文段中加上这种时间戳。