首部长度
首部长度——占 4 bit,它指出 tcp 首部共有多少个4字节(即每4字节为一个单位),首部长度可以在20~60字节之间,其中这60字节中包括了固定首部和可选字段,而固定部分的长度是20字节,那么剩下的40字节就是可选字段的。
既然首部长度字段是占用4 bit位,那首部长度字段的最小值是不是可以为0000? 实际上,首部长度字段代表着tcp首部多少个单位,而每个单位是4字节,前面我们知道首部长度固定最小是20字节,最大是60字节,那么首部长度字段值最小应该是0101(5X4=20),最大是1111(15X4=60)。
保留
保留字段占用6bit位,为以后使用,现在置为0。
控制
这个字段定义了6种不同的控制位或标志,每个控制位占用一个bit位,如图1所示:
图1-控制
URG:表示紧急,如果URG = 1表示紧急指针有效,它会告诉发送方tcp有比较紧急的数据,应该尽快传输(相当于优先级高的数据)。也就是说,当URG=1时,发送应用进程就会告诉发送方的tcp有紧急数据要发送,于是发送方tcp就会把紧急数据插入到报文段的最前面,后面的则是普通数据,这需要和tcp首部中的紧急指针字段配合使用
。
ACK:表示确认,如果ACK = 1表示确认号有效,当ACK = 0时确认号无效(tcp规定,建立连接后所有传输的报文段都必须把ACK设置为1)。
PSH:表示推送,如果PSH = 1表示尽快将数据推送给应用进程,比如两个应用进程进行通信时,有时一方的应用进程希望在输入一个命令后立即收到对方的响应,在这种情况下就可以使用tcp的PSH控制位。
RST:表示重建或重置,如果RST = 1表示tcp连接出现严重的错误(主机崩溃或其他原因),必须先释放连接,然后再重新建立连接。同时RST还可以用于拒绝一个非法报文段或拒绝打开一个连接。
SYN:表示在建立连接时同步序号,如果SYN = 1而ACK = 0时,说明这是一个tcp连接请求报文段。如果对方同意建立连接,连接响应报文段中会设置SYN = 1和ACK = 1。
FIN:表示终止,如果FIN = 1表示数据传输完毕,请求释放tcp连接。一般发送一个tcp数据报文FIN字段值为1,表示释放一个tcp连接。
窗口大小
窗口——占2字节(16个bit位),该字段定义的是用于控制数据发送的大小,以字节为单位,也就是说窗口缓存的数据最大能设置65535字节大小的数据(也就是这16个bit位的值都为1的情况下就是2^16 - 1)。在接收方中这个窗口被称为接收窗口,通常由接收方来设置这个窗口的大小,因为接收方的数据缓存空间是有限的,所以连接的发送方可以通过接收方的窗口大小来设置发送窗口的发送数据大小。
总之,使用tcp协议传输数据的计算机会根据自己的接收能力随时调整窗口大小,对方会参照这个值及时调整发送窗口大小,从而达到tcp流量控制的功能。
校验和
校验和也是占用2字节(16个bit位),用于校验tcp数据报的首部和数据部分是否被修改或出现错误,在计算校验和时要在tcp报文段的前面加上12字节的伪首部。
在tcp数据报问的前面加上伪首部,如图2所示:
图2-伪首部
紧急指针
紧急指针字段占用2字节(16个bit位),紧急指针只在控制中的URG = 1时才有效,该字段用于指向tcp数据报文段中的紧急数据的最后一个字节的编号,也就是字节号,紧急数据的末尾就是普通数据,当tcp处理完tcp数据报文段中的紧急数据,就会恢复正常处理普通数据。
注意:当窗口为0时,也可以发送紧急数据。
选项
选项字段的长度可变,最大值可以是40字节,比如:tcp规定了一种MSS选项,即最大报文段长度MSS(Maximum Segment Size),即接收方的缓存空间最大能接收MSS字节大小的数据。
MSS是指每一个tcp报文段中的数据部分最大长度,并不包括首部。而MTU是一个tcp报文段在网络中传输的最大长度,包括了数据和首部。
MMS和MTU的关系,有些情况下这种关系不一定成立:
MTU为最大传输单元
MMS = MTU - 20(IP的首部)- 20(tcp的首部)- 14(帧首部长度)
填充
填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍而进行填充