TCP数据段格式

来源:互联网 发布:万方数据库论文官网 编辑:程序博客网 时间:2024/06/16 12:00

摘自:《深入理解计算机网络》 王达著 机械工业出版社
相关知识链接
1. IPV4数据报头部格式
2. IPv6数据报头部格式
3. IPv4数据报的封装与解封装
4. IPv4数据报的分段与重组
5. ARP协议报文格式及ARP表
6. ARP地址解析原理
7. ICMP协议及报文格式
8. IPv6协议族的其它协议
9. TCP的主要特性

TCP数据段格式

前面讲过,TCP的协议数据单元仍采用传统意义上的叫法,称为segment(分段),而没有像OSI/RM中的那样称为TPDU,当然两者本质是一致的。所使用的TCP软件决定了数据段的大小,可以将多次写操作中的数据累计起来放到一个数据段中,也可以将一次写操作的数据分割成多个数据段。有两个因素决定了数据段的大小:一是每个TCP数据段的大小必须符合IP数据报的65515字节的有效荷载大小限制要求;二是每个网络都有一个MTU值,因此每个TCP数据段必须符合MTU的限制大小。
TCP通过数据段的交互来建立连接、传输数据、发出确认、进行差错控制、流量控制及关闭连接。整个TCP数据段也分为“数据段头”和“数据”两部分(这也是绝大多数报文封装的方式),所谓“数据段头”就是TCP为了实现端到端可靠传输而加上的TCP控制信息,而“数据”部分则是由高层(即TCP/IP体系结构中的应用层)来的用户数据。但由于TCP只有一种TPDU格式,所有类型的数据段格式都统一在如下图所示的TCP数据段格式中,不同类型数据段是通过其中的多个控制位来实现的。


TCP报文格式
图片来自:http://blog.csdn.net/terrysg/article/details/47058041

各字段详解

源端口和目的端口

源端口和目的端口分别代表呼叫方和被呼叫方的TCP端口号,各占16位。一个端口与主机的IP地址就可以完整地标识一个端点了,也就是构成套接字(Socket)。

序号(Sequence Number)

序号指TCP数据段中的“数据”部分(不包含“数据段头”部分)的第一个字节的编号,占32位。在一个TCP连接中,传送的数据字节流的每一个数据字节都要按顺序进行编号,在“数据段头”中标识的只是每个数据段的第一个数据字节的编号。整个要传送的字节流的起始序号必须在连接建立时设置。例如,一个数据段的“序号”字段值是101,而该数字段中共有100个字节,表明本数据段的最后一个字节的编号是200。这样一来,下一个数据段的。这样以来,下一个数据段的“序号”字段值应该是201,而不是102,这点要注意。

确认号

确认号指期望接收到对方下一个数据段中“数据”部分的第一个字节序号,占32位。注意,“确认号”不是代表已经正确接收到的最后一个字节的序号。例如,主机B已收到主机A发来的一个数据段,其序号值是101,而该数据段的长度是100字节。这表明主机B已收到主机A前200个字节,下一个期望要收到的数据段的第一个字节的序号应该是201,于是主机B在给主机A发送确认数据段时要把“确认号”设置为201。
“序号”和“确认号”两个字段共同用于TCP服务中的差错控制,确保TCP数据传输的可靠性。

数据偏移

数据偏移指数据段中的“数据”部分起始处距离TCP数据段起始处的字节偏移量,占4位。其实这里的“数据偏移”也是在确定TCP数据段头部分的长度,因为“数据”部分是紧接着数据段头的。因为TCP数据段头中有不确定的“可选项”字段,所以数据偏移字段是非常必要的。但是注意的是,数据偏移量是以32位(即4字节)为单位来计算的,而不是以单个字节来计算的。因为4个比特位可以表示的最大数为15,所以数据偏移量最大为60字节,这也是TCP数据段头部分的最大长度。

保留

这是为将来应用而保留的6个比特位,目前应全设置为0。

ACK

Acknowledgement(确认)控制位,指示TCP数据段中的“确认号”字段是否有效,占1位。仅当ACK位置1时才表示“确认号”字段有效,否则表示“确认号”字段无效,应用层实体在读取数据时可以不管“确认号”字段。

PSH

Push(推)控制位,指示是否需要立即把收到的该数据段提交给应用进程,而置0时没有这个要求,可以先缓存起来。

RST

Reset(重置)控制位,用于重置、释放一个已经混乱的传输连接,然后重建新的传输连接,占1位。当RST位置1时,释放当前传输连接,然后可以重新建立新的传输连接。

SYN

Synchronization(同步)控制位,用来在传输连接建立时同步传输连接序号,占1位。当SYN位置1时,表示这是一个连接请求或连接确认报文。当SYN=1,而ACK=0时,表明这是一个连接请求数据段。如果对方同意建立连接,则对方会返回一个SYN=1、ACK=1的确认。

FIN

Final(最后)控制位,用于释放一个传输连接,占1位。当FIN位置1时,表示数据已经全部传输完成,发送端没有数据要传输了,要求释放当前信号,但是接收端仍然可以继续接受还没有接受完的数据。在正常传输时,该位置0。

窗口大小

指示发送此TCP数据段的主机上用来存储传入数据段的窗口大小,也即发送者当前还可以接受的最大字节数,占16位。TCP的“窗口大小”字段与CDT一样是使用可变大小的滑动窗口协议来进行流量控制。“窗口大小”字段的值告诉接受本数据段的主机,从本数据段中所设置的“确认号”值算起,本端目前允许对端发送的字节数,是作为让对方设置其发送窗口大小的依据。假设本次所发送的数据段的“确认号”字段值501,而“窗口大小”字段值是100,则从501算起,本端还可以接受100字节(字节号是501~600)。

检验和

检验和是对“数据段头”、“数据”、和“伪头部”这三部分进行校验,占16位。“伪头部”包括源主机和目的主机的32位IP地址、TCP协议号(6),以及TCP数据段长度。若想了解如何进行校验,请参考另一片文章IPV4 数据报头部格式中的检验和的计算方法,里面有详细的例子。

紧急指针

仅当前面的URG控制位置1时才有意义,它指出本数据段中为紧急数据的字节数,占16位。“紧急指针”字段指明了紧急数据的末尾在数据段中的位置。当所有紧急数据处理完后,TCP就会告诉应用程序恢复到正常操作。要注意一点,即使当前窗口大小为0,也是可以发送紧急数据的,因为紧急数据无须缓存。

可选项

“可选项”字段时可选的,且长度可变,最长达40字节。当没有使用该字段时,TCP头部的长度是20字节。它可以包括窗口缩放选项(Windows Scale Option, WSopt)、MSS(最大数据段大小)、SACK(选择性确认)选项、时间戳(Timestamp)选项等。

数据

这是有应用层的应用进程提交的数据,作为TCP数据段的“数据”(有效载荷)部分。

原创粉丝点击