TCP传送的数据单元称为报文段,既可以用来运载数据,又可以用来建立连接、释放连接和应答
一个TCP报文段可以分为首部和数据部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中。首部的固定长度为20B,因此最短为20B,后面有4N字节是根据需要而增加的选项,长度为4B的整数倍
TCP报文段的各字段意义如下:
-
源端口和目的端口: 各占2字节,端口号是传输层与应用层的服务接口,传输层的复用和分用都是通过端口号来实现的
-
序号: 占4字节,共 2 32 2^{32} 232个序号,范围为(0 ~ 2 32 − 1 2^{32} -1 232−1)。序号增加到最后一个后,下一个序号又回到0;用来指出本报文段所发送的数据部分的第一个字节的序号 例如数据长度为100B,上一个数据的序号为301那么该TCP报文段首部中的序号为401
-
确认号: 占4字节,共 2 32 2^{32} 232个序号,范围为(0 ~ 2 32 − 1 2^{32} -1 232−1)。确认号增加到最后一个后,下一个确认号又回到0;用来指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据进行确认 例如,若确认号为 n,则表明到序号 n - 1 为止的所有数据都已经正确接收,期望接收序号为 n 的数据
-
数据偏移(即首部长度): 占4位,以四字节为单位,指出TCP报文段的数据载荷起始处距离TCP报文段的起始处有多远(其实就是TCP报文段的首部长度),首部长度固定为20B,因此数据偏移字段的最小值为 ( 0101 ) 2 (0101)_2 (0101)2 ,首部最大长度则为60B,数据偏移字段的最大值为 ( 1111 ) 2 (1111)_2 (1111)2
-
保留: 占6位,保留为今后使用,但目前应置为0
-
紧急位URG: 当URG= 1时,表明紧急指针字段有效,反之无效
-
确认标志位ACK: 只有在ACK = 1时表示确认号字段有效,取值为0时表示确认号字段无效,TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1
-
推送标志位PSH: 接收方TCP收到PSH = 1的报文段,就尽快地交付给接收应用进程, 而不再等到整个缓存都填满了后再向上交付
-
复位标志位RST: 用来复位TCP连接,当RST = 1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接【还可以用来拒绝一个非法的报文段或者拒绝打开一个TCP连接】
-
同步标志位SYN: 在TCP建立连接时用来同步序号,【当SYN = 1时表示这是一个连接请求或连接接受报文,当SYN = 1, ACK = 0时,表明这是一个连接请求报文,对方若同意建立连接,则应在响应报文中使用SYN = 1, ACK = 1】
-
终止标志位FIN: 用来释放一个连接。当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接
-
**窗口:**占16位,以字节为单位。指出发送本报文段的一方的接收窗口 【窗口值作为接收方让发送方设置其发送窗口的依据,这是以接收方的接受能力来控制发送方的发送能力,称为流量控制】
-
校验和: 占16位,校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部
-
**紧急指针:**占16位,**紧急指针仅在URG = 1时才有意义;**以字节为单位,用来指明紧急数据的长度 【但发送方有紧急数据时,可以将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送,紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后就是普通数据】
-
选项:长度可变。TCP最初只规定了一种选项,即最大报文段长度(Maximum Segment Size, MSS),MSS是TCP报文段中的数据字段的最大长度(注意仅仅是数据字段)
-
填充:这是为了使整个首部长度是4B的整数倍。