TCP报文段
- 源端口和目的端口。各占2B。分别表示发送方和接收方使用的端口号。
- 序号。占4B,范围为0~\(2^{32}-1\),共\(2^{32}\)个序号。TCP连接中传送的字节流中的每个字节都要按顺序编号,序号字段值指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是301,而携带的数据共有100B,表明本报文段的数据的最后一个字节的序号是400,因此下一个报文段的数据序号应从401开始。
- 确认号。占4B,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。例如,B正确收到了A发送过来的一个报文段,其序号字段是501,而数据长度是200B(序号501~700),这表明B正确收到了A发送的到序号 700为止的数据。因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
- 数据偏移(即首部长度)。占4位,这里不是IP 数据报分片的那个数据偏移,而是表示首部长度(首部中还有长度不确定的选项字段),它指出 TCP 报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位(以4B为计算单位)。因为4位二进制数能表示的最大值为15,所以 TCP首部的最大长度为60B。
- 保留。占6位,保留为今后使用,但目前应置为0。
- 紧急位 URG。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。紧急数据被插入到报文段数据的最前面,而在紧急数据后面的数据仍是普通数据,因此要与首部中的紧急指针字段配合使用。
- 确认位 ACK。仅当 ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把 ACK置1。
- 推送位 PSH(Push)。两个应用进程进行交互式通信时,都希望在键入一个命令后立即就能收到对方的响应,此时发送方TCP把PSH置1,接收方TCP收到 PSH=1的报文段后,就尽快交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
- 复位位RST(Reset)。当RST=1时,表示 TCP连接中出现严重差错(如主机崩溃等),必须释放连接,然后重新建立传输连接。此外,它还可用于拒绝一个非法的报文段。
- 同步位SYN。当SYN=1时表示这是一个连接请求或连接接受报文。当SYN=1,ACK=0时,表明这是一个连接请求报文,若对方同意建立连接,则应在响应报文中使用SYN=1,ACK=1。
- 终止位 FIN(Finish)。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。
- 窗口。占2B,范围为0~\(2^{16}-1\)。窗口值告诉对方,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。接收方的数据缓存空间是有限的,因此窗口值作为接收方让发送方设置其发送窗口的依据。例如,设确认号是701,窗口字段是1000。这表明,从701号算起,发送此报文段的一方还有接收1000字节数据(字节序号为701~1700)的接收缓存空间。
- 检验和。占 2B。检验和字段检验的范围包括首部和数据两部分。在计算检验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的协议字段的17改成6. UDP长度字段改成TCP长度,其他的和UDP一样)。
- 紧急指针。占2B。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据在报文段数据的最前面)。也就是说,使窗口为零也可以发送紧急数据。
- 选项。长度可变,最长可达40B。当不使用选项时,TCP首部长度是20B。TCP最初只规定了一种选项,即最大报文段长度(Maximum Segment Size, MSS)。MSS是TCP报文段中的数据字段的最大长度(注意仅仅是数据字段)。
- 填充。这是为了使整个首部长度是4B的整数倍。