图解TCP/IP:TCP首部格式

本文深入解析TCP数据段格式,涵盖源端口、目标端口、序列号、确认应答号等关键字段,以及控制位的功能解释,如URG、ACK、PSH、RST、SYN、FIN的作用。同时,探讨了窗口大小、校验和、紧急指针及选项字段的运用,揭示了TCP如何确保数据传输的可靠性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# TCP数据段格式

            源端口号(Source Port)           |         目标端口号(Destination Port)
                               序列号(Sequence Number)
                          确认应答号(Acknowledgment Number)
  数据偏移(Data Offset) |  保留(Reserved)  |  控制位(Control Flag)  |  窗口大小(Window Size)
              校验和(Checksum)             |            紧急指针(Urgent Pointer)
                            选项/长度可变(Options)                    |     填充(Padding)
                                    数据部分(Data)

TCP中没有表示包长度和数据长度的字段,可由IP层获知TCP的包长,由TCP的包长可知数据的长度。

序列号(Sequence Number)

序列号是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

数据偏移(Data Offset)

该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然可以把它看作TCP首部的长度。不包含选项字段的话,TCP的首部为20字节长,因此数据偏移字段可以设置为5。反之,如果该字段的值为5,那说明从TCP包的最一开始到20字节为止都是TCP首部,余下的部分为TCP首部。

控制位(Control Flag)
# 控制位

首部长度(Data Offset) | 保留(Reserved) | CWR | ECE | URG | ACK | PSH | PST | SYN | FIN

当这些控制标志对应位上的值为1时,具体含义如下:

  • CWR(Congestion Window Reduced):与后面的ECE标志都用于IP首部的ECN字段,ECN标志为1时则通知对方已将拥塞窗口缩小。

  • ECE(ECN-Echo):置为1会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1。

  • URG(Urgent Flag):该位为1时,表示包中有需要紧急处理的数据。

  • ACK(Acknowledgment Flag):该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1。

  • PSH(Push Flag):该位为1时,表示需要将受到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。

  • RST(Reset Flag):该位为1时表示TCP连接中出现异常必须强制断开连接。例如,一个没有被使用的端口即使发来连接请求,也无法进行通信,此时就可以返回一个RST设置为1的包。此外,程序宕掉或切断电源等原因导致主机重启的情况下,由于所有的连接信息将全部被初始化,所以原有的TCP通信也将不能继续进行。这种情况下,如果通信对方发送一个设置为1的RST包,就会使通信强制断开连接。

  • SYN(Synchronize Flag):用于建立连接,SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。

  • FIN(Fin Flag):该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。每个主机又对对方的FIN包进行确认应答以后就可以断开连接。不过,主机收到FIN设置为1的TCP段以后不必马上回复一个FIN包,而是可以等到缓冲区中所有数据都因已成功发送而被自动删除之后再发。

窗口大小(Window Size)

用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。但这个数据必须是1个字节。

校验和(Checksum)
# 用于校验和计算的TCP伪首部

                      源IP地址
                     目标IP地址
      填充0     |      协议号6     |     TCP包长度         

TCP的校验和与UDP相似,区别在于TCP的校验和无法关闭

TCP在计算校验和的时候使用TCP伪首部,为了让其全长为16位的整数倍,需要在数据部分的最后填充0。首先将TCP校验和字段设置位0,然后以16位为单位进行1的补码计算,再将它们总和的1的补码和放入校验和字段。接收端在收到TCP数据段以后,从IP首部获取IP地址信息构造TCP伪首部,再进行校验和计算。由于校验和字段里保存着除本字段以外其他部分的和的补码值,因此如果计算校验和字段在内的所有数据的16位和以后,得出的结果是“16位全部为1”说明所收到的数据是正确的。

使用校验和的目的:有噪声干扰的通信途中如果出现位错误,可以由数据链路的FCS检查出来。相比检查噪声影响导致的错误,TCP与UDP的校验和更是一种进行路由器内存故障或程序漏洞导致的数据是否被破坏的检查。

紧急指针(Urgent Pointer)

只有在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。从数据部分的首位到紧急指针所指示的位置为止为紧急数据,也可以说紧急指针指出了紧急数据的末尾在报文段中的位置。

如何处理紧急数据属于应用的问题:一般在暂时中断通信或中断通信的情况下使用、紧急指针也用作表示数据流分段的标志。

选项(Options)

选项字段用于提高TCP的传输性能。

# 具有代表性的TCP选项

类型2的MSS选项用于在建立连接时决定最大段长度的情况。
类型3的窗口扩大,是一个用来改善TCP吞吐量的选项。
类型8时间戳字段选项,用于高速通信中对序列号的管理。
类型4和5用于选择确认应答(SACK: Select ACKnowledgment)。
# 窗口大小与吞吐量

TCP通信的最大吞吐量由窗口大小和往返时间决定。
假定最大吞吐量为Tmax,窗口大小为W,往返时间是RTT的话,那么最大吞吐量的公式如下:
                          Tmax = W / RTT
                          
在TCP中,与其使用一个连接传输数据,使用多个连接传输数据会达到更高的网络吞吐量。

(最近更新:2019年09月18日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值