TCP的段结构
| 源端口 | 目标端口 | ||
| *** | |||
| 确认号 | |||
| 头长度 | 标志 | 窗口 | |
| 校验和 | 紧急数据指针 | ||
| 选项(可变长度) | |||
| 数据 | |||
-
源端口:16 byte,源节点进程端口
-
目标端口:16 byte,目标节点端口
-
***: 32 byte,TCP对字节流中的每个字节都编号。假设每个数据段包含1000个数据字节,第一个字节的编号为X,则对于字节流中各段的第一个字节的***分别为:X,X + 1000,X + 2000等。
-
确认号: 32 byte,为准备接受的字节***,即意味着该字节***前的字节都已经正确接受。
-
头长度:4 byte,随可变长度的选项的改变而改变,接收方可根据该数据确定TCP的数据的起始位置。
-
标志:6 byte,字段包含对其他字段的说明或对控制功能的标示。具体设置如下:
ACK : 说明确认字段中的数据有意义。
URG:说明紧急数据指针字段中的数据有意义。
FIN :标志是最后的TCP数据段(也成为完成)。
PSH:指出接收方不必等待一定量的数据再向应用提供数据(一般情况是等待一定数据量再提供),而是立即提供该数据段,PSH也称“推”。
RST:在有异常情况发生时,发送方通知接收方暂时终止连接,释放与连接有关的缓冲区,中断TCP传输, RST也称为“复位”。
SYN:在建立初始连接时,允许双方共同确定初始***,SYN也称为“同步”。
-
窗口:16 byte,通知接收方还可以发送的数据字节数,接收方可以根据该值改变其发送窗口的大小。
-
检验和:16 byte,进行传输层的差错校验,具体算法是将TCP段的内容转换成一系列的16 byte的整数,并相加。
-
紧急数据指针:16 byte,当标志字段中的值为URG时,表示有紧急数据,紧急数据位于段的开始,紧急数据指针向紧挨着紧急数据后的第一个字段,以区分紧急数据和非紧急数据。对于紧急数据接收方必须尽快发送给高层应用。
-
选项:可变长度。
-
数据:可变大小,用户提供的数据。
TCP连接建立
TCP连接的建立采用三次握手协议,SYN为请求建立连接的标志,如下图所示:
在T1时刻,A向B发送请求建立段,***为X。
在T2时刻,B发送应答A的X***的请求建立连接的段,该应答的***为Y。
在T3时刻,A发送对B的应答段的应答,应答号为Y+1,表明应答号为Y的段已接收。
至此,连接建立成功,A,B分别发送数据,***分别为X + 1、Y + 1,应答号分别为Y + 1、X + 1.
TCP连接的释放
TCP是全双工通信,一方的数据段发送完毕要终止连接时,另一方有可能有未发送完的数据,所以TCP的连接释放采用对称释放方式(4次挥手),如下图:
在上图中,FIN为终止标志,释放连接的过程如下:
- A在T1时刻接收到应用层的终止请求,发送释放连接段。
- B在T2时刻接收到应用层的终止请求,发送应答段,确认已经接收到该段,并通知应用层A已经无数据发送,请求四方连接。
- 此后B仍然可以发送数据,但在T3时刻收到无数据传输的通知,向A发送释放连接段。
- A在T4时刻收到B的释放连接段,A向B发送应答段,确认已经收到该段,并中断连接
- 在T5时刻B收到A的确认,也中断连接。
TCP滑动窗口
TCP的滑动窗口协议中的接受窗口随着已经接受的数据量的变化而变化,如下图所示:
在上图中,假定接收方有4096字节缓冲区。ACK为将要确认的字节号,即在此前的字节已经被确认接受,WIN为可以接受的窗口大小,SEQ为发送数据段的起始字节号。运行步骤如下:
- 在T1时刻,发送方的应用写入2048字节的数据,发送方的起始字节号为0.
- 在T2时刻,接收方接收到发送方的数据段后,在没有交给应用层前,缓冲区被占用2K,还剩下2k,接收方发送确认段,ACK=2048,WIN=2048。
- 在T3时刻,发送方收到应用层写入3k字节的数据,但因接收方的缓冲区只剩下2k,因此发送2k的数据段,SEQ=2048.
- 在T4时刻,接收方接收到发送方的数据段后,在没有交给应用层前,缓冲区被占满,接收方向发送方发确认段,ACK=4096,WIN=0,此时发送方被阻塞。
- 在T5时刻,接收方向应用层上传一个数据段,缓冲区被释放2k字节,接收方向发送方发送确认段,通知接收方有2048字节缓冲区,即WIN=2048.
- 在T6时刻,发送方发送余下的1k字节数据段,SEQ=4096,此时,接收方缓冲区还剩下1k。
TCP重传策略
TCP协议用于控制数据段是否需要重传的依据是设定重发定时器。在发送一个数据段的同时启动一个重发定时器,如果在定时器超时前收到确认,就关闭该定时器,如果定时器超时前没有收到确认,则重传该数据段。对定时器初值的设定,目前采用较多的算法是一种不断调整超时时间间隔的动态算法。其工作原理是:对每条连接TCP都保持一个变量RTT,用于存放当前到目的端往返所需时间最接近的估算值。当发送一个数据段时,同时启动连接的定时器,如果在定时器超时前确认到达,则记录所需的时间(M),并修正RTT的值,如果定时器超时前没有收到确认,则将RTT的值增加1倍。