TCP-传输控制协议-详解

概览

TCP报文段落的首部格式

TCP报文段落由

  • 首部
    • 固定首部
    • 拓展首部
  • 数据载荷
    两部分构成

首部-TCP

固定首部-TCP

源端口

16 比特,写入源端口号,用来标识发送该 TCP 报文段的应用进程;

目的端口

16 比特,写入目的端口号,用来标识接收该 TCP 报文段的应用进程;

序号

32 比特,取值范围 ,序号增加到最后一个后,下一个序号就又回到 0

TCP是全双工的,也就是双向通信,双方都发信息,序号字段给是自己发出这段信息的编号,是这段信息的身份证号,注意是自己的,要和确认号区别开,确认号是标记的对方的信息的序号。指出本 TCP 报文段数据载荷的第一个字节的序号

确认号

占 32 比特,取值范围 ,确认号增加到最后一个号,下一个确认号就又回到 0

  • 指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
  • 若确认号 = n,则表明到序号 n-1 为止的所有数据都已正确接收,期望接收序号为 n 的数据
  • ACK-确认标志位为1时,确认号字段才有效。ACK取值为0时,确认号字段无效
    确认号是对对方序号的确认,也就是对对方上一次发送的数据的确认,是区分标识对方数据的指标
ACK-确认标志位
  • 取值为 1 时确认号字段才有效; 取值为 0 时确认号字段无效;
  • TCP 规定:在 TCP 连接建立后,所有传送的 TCP 报文段都必须把 ACK 置 1
  • ackn在选择重传协议与TCP协议中并不完全相同
    • 在选择重传协议中, ackn表明序号到n为止的数据已正确接收,现在期望收到序号为n+1的数据。在TCP协议中, ackn表明序号到n-1为止的数据已正确接收,现在期望收到序号为n的数据。
数据偏移

4 比特,并以 4 字节为单位

  • 用来指出 TCP 报文段的数据载荷部分的起始处距离 TCP 报文段的起始处有多远;
保留

6 比特,保留为今后使用,但目前应置为 0;

窗口

16 比特,以字节为单位。指出发送本报文段的一方的接收窗口

  • 窗口值作为接收方让发送方设置其发送窗口的依据;
  • 这是以接收方的接收能力来控制发送方的发送能力,称为流量控制
校验和

16 比特,用来检查整个 TCP 报文段在传输过程中是否出现了误码,检查范围包括 TCP 报文段的首部和数据载荷两部分(IPv4 只检验首部);

校验和的校验流程

  • ① 给接收到的 TCP 报文段前面添加一个 12 字节的伪首部。(伪首部格式与 UDP 用户数据报的伪首部一样)
  • ② 将伪首部、TCP 首部以及数据载荷这三部分划分成若干个 2 字节的字。
  • ③ 对划分出的全部 2 字节的字进行反码算数运算求和,并将求和结果取反码。
  • ④ 若步骤③得到的结果为 0,则表示 TCP 报文段在传输过程中没有误码。否则,表示出现了误码。
同步标志位SYN

在 TCP 连接建立时用来同步序号

  • 用于TCP“三报文握手”建立连接。
  • 当SYN=1且ACK=0时,表明这是一个TCP连接请求报文段。
  • 对方若同意建立连接,则应在响应的TCP报文段的首部中使SYN=1且ACK=1。
  • 综上所述,SYN为1的TCP报文段要么是一个连接请求报文段,要么是一个连接响应报文段。
终止标志位-FIN

  • 用来释放TCP连接
  • 用于TCP“四报文挥手”释放连接。
  • 当FIN=1时,表明此TCP报文段的发送方已经将全部数据
  • 发送完毕,现在要求释放TCP连接
复位标志位-RST

  • 用于复位TCP连接。
  • 当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接
  • RST置1还用来拒绝一个非法的TCP报文段或拒绝打开一个TCP连接
推送标志位-PSH

发送方TCP把PSH置1,并立即创建一个TCP报文段发送出去,而不需要积累到足够多的数据再发送。
接收方TCP收到PSH为1的TCP报文段,就尽快地交付给应用进程,而不再等到接收到足够多的数据才向上交。

IMPORTANT

接收方的 TCP 收到该标志位为 1 的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付

出于效率的考虑,TCP的发送方可能会延迟发送数据,而TCP的接收方可能会延迟向应用进程交付数据。这样可以一次处理更多的数据。
但是当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,应用进程可以通知TCP使用推送(PUSH)操作

紧急标志位 -URG
  • 当URG=1时,紧急指针字段有效
  • 当URG=0时,紧急指针字段无效
  • 占16比特,以字节为单位,用来指明紧急数据的长度。
  • 当发送方有紧急数据时,可将紧急数据“插队”到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
  • 接收方收到紧急标志位为1的TCP报文段,会按照紧急指针字段的值从报文段数据载荷中取出紧急数据并直接上交应用进程,而不必在接收缓存中排队。

首部格式解读-实例

00:03:33

扩展首部-TCP

选项
  • 长度可变,最大40字节
  • 最大报文段长度MSS选项:指出TCP报文段数据载荷部分的最大长度,而不是整个TCP报文段的长度。
  • 窗口扩大选项:用来扩大窗口,提高吞吐率。
  • 时间戳选项:
    • • 用于计算往返时间RTT
    • • 用于处理序号超范围的情况,又称为防止序号绕回PAWS。
  • 选择确认选项:用来实现选择确认功能。
填充

若选项字段的长度加上20字节固定首部的长度不能被4字节整除时,需要填充相应数量的比特0,以确保首部长度能被4字节整除