TCP首部详解

导语:TCP协议是一个传输控制协议,顾名思义是用来控制网络数据传输的协议,位于传输层。笔者认为在了解了TCP协议的特点及原理之后,再回过头来看TCP的首部,追根溯源更为有趣,如果在你还不知道它怎么建立连接,怎么传输数据,怎么保证它的可靠性的时候,就开始看TCP首部格式,就会一脸懵圈,不知所云,不知道首部这么多字段到底是什么鬼,有什么卵用,相反在你了解它的特点和用途之后,再回过头看它的首部定义,就会恍然大悟,有种醍醐灌顶的感觉。

废话不多说,言归正传,一起看一下TCP首部是什么样的。

TCP协议传输的数据单元是报文段,一个报文段分为首部和数据两个部分,TCP首部的固定长度是20B,最大长度是60B,可变选项长度为40B,组成如下图

 首部字段详解:

  1. 源端口和目的端口:占2个字节,和IP地址不同,端口号只具有本地意义,是为了标志本地计算机应用层中的不同服务进程在和传输层交互时的层间接口。在互联网中,在不同的计算机中相同的端口号没有任何关联,互不干扰。
  2. 序号(seq):seq占4个字节,在TCP的三次握手、四次挥手和数据传输过程都有用到,用来标记字节流的序号,因为数据传输过程中并不总是有序到达,为了保证数据的无差错传输,必须把每个报文段标记一个序号,这个序号表示一个报文段开始的位置,如果一个报文段序列号为1,报文段长100字节,那么下一个报文段就为101。
  3. 确认号(ack): ack占4个字节,接收方在收到数据后需要给发送方一个确认,告诉接收方收到了某一个报文。而接收方收到的报文段很多,为了让接收方知道是哪一个报文段的确认,TCP协议规定了确认号为期待收到的下一个报文段的序列号。假设接收方收到了一个报文段seq=1,报文长100字节,那么确认号为101,表明1~100的数据都已经收到。
  4. 数据偏移:数据偏移占4bit,表示TCP首部长度,之所以叫数据偏移而没有称为首部长度,大概是为了强调正真的数据部分距离该报文段的起始处的距离。TCP的固定首部长度为20个字节,可变长度为40个字节,因此,首部最大长度为60个字节
  5. 保留: 占6位,目前置为0,保留下来为以后扩展使用。

    以下6个字段为可控制位,用来控制报文段的属性


     

  6. 紧急URG:当URG=1时,表明紧急指针有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间
  7. 确认ACK: 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
  8. 推送PSH: 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
  9.  复位RST(ReSeT):当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
  10.  同步SYN(SYNchronization):  在三次握手建立连接时使用。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。
  11. 终止FIN(FINis):  用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

     

  12.  窗口:   占2字节。窗口大小表示接收方允许发送方发送报文段的多少,以字节为单位,在数据传输过程中是动态变化的。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。如果序号seq=1,窗口大小为1000,则表明接受方的缓存空间可以接受1000字节(序号为1~1000)的数据。
  13.  检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,不只是检验数据部分,把首部和数据部分一起检验。在发送方,将伪首部和首部以及数据部分连在一起,将其看成许多16位字串接起来的,如果数据部分不是偶数个字节,则要填充一个全零字节,然后按照二进制反码计算出这些16位字的和,高位超出进一,则进行地位叠加,最后将求得的和的反码即为发送方的检验和;在接收方,将收到的数据和伪首部一起,用二级制反码计算这些16位字的和,若结果全1,则表明无差错,否则丢弃错误报文段。简单来说,即在发送方,原码相加,高位叠加到低位,取反码,放入校验和;在接收端,将所有原码相加,高位叠加到地位, 如全为1,则正确。
  14.  紧急指针 : 占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。
  15.  选项 : 长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。选项包含最大报文段长度(MSS)、窗口扩大、时间戳、选择确认等。
  • 最大报文段长度: 指的是报文段中数据字段的最大长度,不包含首部长度。默认值为536字节,为了提高网络利用率,MSS要尽可能大一些,只要在IP层传输时不需要再分片就行。
  • 窗口扩大选项:占3个字节,其中一个字节表示移位值S,新的窗口值等于TCP首部中的窗口位数从16增大到(16+S),窗口值为2^(16+S)-1。
  • 时间戳:占10个字节,包含时间戳值和时间戳回送回答等字段。有两个用途,一是用来计算往返时间RTT,二是防止在高速传输速率下报文段序号重复,在报文段上加上时间戳,就可以区分开相同序号的不同报文段。
  • 选择确认: 用来指明窗口中不连续报文段的边界信息,有了边界信息,就可以减少不必要的重传。

 

 

 

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值