-
TCP虽然是面向字节流的,但是
TCP传送的数据单元
是报文段
一个TCP报文段分为首部
和数据
两部分。
TCP的全部功能
都体现在它首部中各字段
的作用。 -
TCP报文段首部的
前20个字节
是固定的,后面有 4n 个字节是根据需要而增设的选项。
首部最小长度
是20字节,要做到4字节对齐
,可以采用填充。
-
1、源端口 和 目的端口
各占两字节,用来实现TCP的分用功能
。 -
2、序号
占4字节。
序号从0增加到232 - 1后,下一个序号又回到0。
TCP是面向字节流的。一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号
必须在连接建立时
设置。
首部中的序号字段值
指的是本报文段所发送的数据的第一个字节的序号
。
如:
一个报文段的序号字段值是301,而携带的数据共有100个字节。
本报文段第一个字节的序号是301,最后一个字节的序号是400。
那么下一个报文段(若还有的话)的数据序号应当从401开始,下一个报文段的序号字段值应为401。 -
3、确认号
占4字节。
是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号为N,则表示到序号N-1为止的所有数据都已正确收到。
如:
B正确收到了A发送过来的一个报文段,其序号字段值是501,数据长度200字节。(数据内容 501 ~ 700 字节)
此时B希望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。 -
4、数据偏移
占4位。
数据偏移的单位
是4字节,因此首部的最大长度
是60字节,那么去掉固定字段,选项长度最多40字节。
指出TCP报文段的数据起始处距离TCP报文段的起始处有多远(实际指出了TCP报文段的首部长度
)。 -
5、保留
占6位
暂时未使用,目前置0。 -
6、紧急URG
占1位。
URG=1
,表明紧急指针字段
有效。告诉系统此报文段中有紧急数据
,应尽快传送(相当于高优先级的数据)而不按照原来的排队顺序来传送。
UDG置1,发送应用进程
告诉发送方的TCP
有紧急数据要传送。于是发送方TCP
就把紧急数据
插入到本报文段数据的最前面,而在紧急数据
后面的数据仍是普通数据
。
此时也需要和首部中的紧急指针字段
配合使用。
如:
已经发送了很长的一个程序要在远地的主机上运行。但是后来发现了一些问题,需要取消该程序的运行。
由用户从键盘发出中断命令
,若不使用紧急数据,那么这两个字符将存储在接收TCP的缓存
末尾。只有在所有的数据都被处理完毕之后这个命令才会被交付接收方的应用进程,但如此会浪费很多时间。 -
7、确认ACK
占1位。
仅当ACK=1时确认号字段才有效。
连接建立后的所有传送的报文段都必须把ACK置1。 -
8、推送PSH
占1位。
两个应用进程在进行通信时,有时一方希望在键入一个命令后立刻就能收到对方的响应。
此时,TCP就可以使用推送(push)
操作。
此时,发送方TCP把PSH置1,并立即创建一个报文段发送出去;接收方收到一个PSH=1的报文段,就尽快交付接收应用进程,而不再等到整个接收缓存满了再向上交付。 -
9、复位RST
占1位。
RST=1时,表明TCP连接中出现严重差错(如主机崩溃)
,必须释放连接,然后重新建立运输层连接。
RST=1还用来拒绝一个非法的报文段或拒绝打开一个连接。 -
10、同步SYN
占1位。
在连接建立时用来同步序号。
SYN=1表示这是一个连接请求或连接接受报文(同步完成开始传数据时,此位被置为0)。
SYN=1,ACK=0时,表明这是一个连接请求报文段
。
若对方同意建立连接,则应在响应的报文段
中使用:SYN=1,ACK=1。 -
11、终止FIN
占1位。
FIN=1:表明此报文段的发送的数据已发送完毕,要求释放运输连接 -
12、窗口
占2字节。
发送本报文段的一方的接收窗口
的大小。
窗口值
:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位字节)
之所以要有这个限制,是因为接收方的数据缓存空间
是有限的。窗口值
作为接收方让发送方设置其发送窗口的依据。 -
13、检验和
占2字节。
检验和字段检验的范围
包括首部
和数据
两部分。
计算检验和时TCP报文段前面也要加上12字节的伪首部。伪首部格式与UDP类似。 -
14、紧急指针
占2字节。
仅在URG=1时才有意义,指出了本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)
。
紧急指针
指出了紧急数据的末尾在报文段中的位置
。当所有紧急数据处理完后,TCP就告诉应用进程恢复到正常操作。
即使窗口值为0时也可发送紧急数据。 -
15、选项
长度可变,最短0字节,最长40字节。
若要采用可变选项,需要双方在协商阶段
达成一致。
如:
最大报文长度MSS选项:每一个TCP报文段中的数据字段的最大长度。
窗口扩大选项:为了扩大窗口(早期窗口大小够用,现在可能不够了),双方需要在初始建立TCP连接时进行协商。
时间戳:
主要用于计算往返时间RTT;
处理TCP序号超过232的情况,防止序号绕回,区分新的报文段和迟到很久的同序号报文段。
选择确认选项:详见 5.6.3