阅读 489

【深入浅出TCP】TCP报文详解

TCP报文

TCP被封装在IP数据报中,在没有选项的前提下,TCP首部长20字节(最长可以到60字节)

image.png

TCP首部

image.png

远端口号与目的端口号

源端和目的端的端囗号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。

32位序号

序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第1个数据字节的编号。序号是32位的无符号数,到达2^32 - 1后又从0开始。

SYN的初始化:在进行三次握手时,会用ISN(Initial Sequence Number,初始化序列号)为SYN赋值从而进行序号的初始化。在RFC793标准中,ISN 和一个伪时钟绑定,时钟每 4 微秒对 ISN 做加一操作,直到超过 2^32,又从 0 开始,这样每 4 小时才会产生 ISN 的回绕问题,可以大概率保证每个新连接的 ISN 不会和旧的连接的 ISN 产生冲突。这种递增方式的 ISN很容易让攻击者猜测到 TCP 连接的 ISN,因此大多数实现是会在基准值的基础上添加随机数。

32位确认序号

确认按序收到的最后一个字节序,对于乱序到来的 TCP 分段,接收端会回复相同的 ACK 分段,只确认按序到达的最后一个 TCP 分段。

4位首部长度

TCP首部长度,因为只有4位,所以首部长度最长为60字节,如果没有选项字段,正常的长度是 20字节。

首部长度的计算方式:32位系统中一个字等于4个字节,首部长度的单位是字,首部长度字段有4位,所以TCP首部最长为 2^4-1 = 15(字) = 60(字节)。

URG标志位

紧急指针( urgent pointer)有效标志位。

它使一端可以告诉另一端有些具有某种方式的“ 紧急数据” 已经放置在普通的数据流中。另一端被通知这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。

使用场景:一个常见的例子是Telnet,当交互用户键入中断键时,可以使用该标志位实现这个功能;另ー个例子是FTP,当交互用户放弃一个文件的传输时,可以使用该标志位实现。

ACK标志位

ACK标志位,为1时表示32位确认序号有效。

PUSH标志位

PUSH标志位,发送方使用该标志通知接收方将所收到的数据全部提交给接收进程,即尽快将这个报文提交给应用层。

这个标志位已经有点过时,一般的TCP实现都会忽略这个标志位。

RST标志位

RST(Reset)标志位,表示该报文是一个"复位"报文。

RST产生和使用场景:

  1. 目的端口无监听。当连接请求到达时,目的端口没有进程正在监听,TCP会产生一个复位报文。(在UDP中,则产生一个ICMP端口不可达的信息)
  2. 异常终止链接。可以通过发送个复位报文段而不是FIN来中途释放一个连接,这种行为称为异常释放( abortive release)。

SYN标志位

同步标志位,主要用于建立链接,一般与ACK标志位搭配使用。

我们以TCP的三次握手为例,来观察一下32序号,32位确认序号,SYN标志位和ACK标志位的变化。

字段名称第一次第二次第三次
seqno(32位序号)171379694029574764971713796941
ackno(32位确认序号)017137969412957476498
SYN标志位110
ACK标志位011

FIN标志位

FIN标志位,主要用于中止TCP链接

16位窗口大小

用于表示滑动窗口大小,窗口大小最大为65535(2^16-1)字节

检验和

用于验证 TCP首部和TCP数据,强制字段,由发端计算和存储,并由收端进行验证。校验和错误的分组丢弃(因为源IP地址、源端口号或者协议字段可能被破坏)。

紧急指针

紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

选项

image.png

最初的T C P规范中定义的选项是选项表结束、无操作和最大报文段长度。

新的RFC,主要是RFC1323[ Jacobson, Braden和 Borman1992],定义了新的TCP选项,如串口扩大因子,时间戳。

平时最常使用的选项,应该是最大报文段长度,又称为 MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个报文段)中指明这个选项。它指明本端所能接收的最大长度的报文段。(当一个连接建立时, 连接的双方都要通告各自的MSS。)

文章分类
后端
文章标签