协议簇: TCP 解析 - 基础

Oct 11, 2021

目录


简介


本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议.

这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的,不会互相冲突.


系列文章



消息格式


毫无疑问,我们首先得描述一下 TCP 数据包的格式.

RFC 中规定的 TCP数据包的格式如下:

在这里插入图片描述

各字段的意义及其值:

这里我们先简要的介绍一下,后续详细逐一描述每个字段的用途

  1. Source Port: 16bits. 标记 TCP 数据包的发送方发送该数据时使用的端口号
  2. Destination Port: 16bits. 标记 TCP 数据包的接收方接收该数据包所使用的端口号
  3. Sequence Number: 32bits. 表示当前 TCP 数据包中数据的第一个字节的的序列号. 有一个例外,当当前数据包时包含 SYN 标记时,当前包中的序列号代表 初始序列号(initial sequence number, ISN), 第一个字节的序列号将是 ISN + 1
  4. Acknowlegment Number: 32bits. 当 ACK 标记被设置之后,这个字段表示接受方期待收到的下一个数据段的 sequence number. (当TCP连接建立之后,这个字段总是会被包含)
  5. Data Offset: 4bits. 标识当前TCP数据包所包含的实际有效数据的偏移. 单位是 32bit,也就是 4 byte.
  6. Reserved: 6 bits
  7. Control Bits: 6bits.
    • URG: Urgent Pointer field significant
    • ACK: Acknowldgment field significant
    • PSH: Push Function
    • RST: Reset the connection
    • SYN: Synchronize sequence numbers
    • FIN: No more data from sender
  8. Window: 16bits. 表示当前接收方能接受的数据的数量(以当前 TCP 头中的 Acknowlegment Number 为基准 )
  9. Checksum: 16bits.
  10. Urgent Pointer: 16bits.
  11. Options: 可变长度.
  12. Padding: 可变长度. 作用是将 TCP 数据包长度扩充为 32 的整数倍. padding 的值总是 0 到多个 0.

术语


在我们详细的描述 TCP 行为之前,我们需要先引入一些术语,这样会使后续的描述更直白易懂.

维护一个 TCP 连接需要记录一系列的连接状态, 我们假定有一个数据结构叫做 TCB(Transmission Control Block). 这个结构中需要存储以下连接相关的信息: Local/Remote socket number,安全性,优先级, 发送/接收方的 buffer 指针, 重发队列的指针和当前 TCP 段信息. 此外还有许多额外的信息.

Send Sequence Variables

 	SND.UNA  - send unacknowledged
 	SND.NXT  - send next
 	SND.WND  - send window
 	SND.UP   - send urgent pointer
 	SND.WL1  - segment sequence number used for last windows update
 	SND.WL2  - segment acknowldgment number used for last window update
 	ISS      - initial send sequence number

这里用一张图来描述一下发送序列.

Send Sequence Space

在这里插入图片描述

  1. 序列号小于 SND.UNA 的数据的状态为: 已发送且收到了对应的 ACK. 对应图中 段1
  2. 序列号处于 (SND.UNA, SND.NEXT) 的数据的状态为: 已发送但是还未收到对应的 ACK. 对应图中 段2
  3. 序列号处于 [SND.NEXT, SND.UNA + SND.WND) 的数据的状态: 表示可用的序列号,接下来发送的数据将被赋予这些序列号. 对应图中 段3
  4. 序列号大于 SND.UNA + SND.WND 在当前状态下是不可用的. 对应图中 段4
  5. 段2 标记了当前的发送窗口

Receive Sequence Variables

	RCV.NXT - receive next
	RCV.WND - receive window
	IRS     - initial receive sequence nubmer

这里用一张图来描述一下接收序列.

Receive Sequence Space

在这里插入图片描述

  1. 序列号小于 RCV.NXT 的数据的状态为: 已接收且发送了对应的 ACK. 对应图中 段1
  2. 序列号处于 (RCV.NXT,RCV.NXT + RCV.WND) 的序列号为期待接收到的数据的序列号. 对应图中 段2
  3. 序列号大于 RCV.NXT + RCV.WND 的序列号在当前状态下是不可用的. 对应图中 段3
  4. 段 2 标记了当前的接收窗口

Current Segment Variable

 	SEG.SEQ - segment sequence number
 	SEG.ACK - segment acknowldgment number
 	SEG.LEN - segment length
 	SGE.WND - segment window
 	SEG.UP  - segment urgent pointer
 	SEG.PRC - segment precedence value

状态


在一个 TCP 连接的生命周期中会在不同的状态之间变化. 这些状态分别是:

  1. LISTEN: 表示在等待一个远程连接请求
  2. SYN-SENT: 表示请求连接的请求已经发送,在等待对方的连接请求
  3. SYN-RECEIVED: 表示发送了连接请求且收到了对方的连接请求,正在等待确认建立连接的 ACK
  4. ESTABLISHED: 表示一个 TCP 连接已经建立, 可以在当前连接上接收发送数据
  5. FIN-WAIT-1: 表示在等待对方发送关闭连接请求,或者等待对方发送对应于自己刚刚发送的关闭连接请求的 ACK.
  6. FIN-WAIT-2: 表示在等待对方发送关闭连接请求
  7. CLOSE-WAIT: 表示在等待本地用户的关闭连接请求
  8. CLSING: 表示在等待对方发送关闭连接请求ACK.
  9. LAST-ACK: 表示在等待对方发送对应于自己刚刚发送的关闭连接请求的 ACK.
  10. TIME-WAIT: 表示正在等待一段时间以确保对方收到我们发送的关闭连接请求的 ACK
  11. CLOSED: 表示当前连接已经完全关闭了

用一张图描述这些这些状态之间的切换. 注意,这只是一张简图,并未涵盖整个协议中规定的状态变换.

在这里插入图片描述

作为 TCP 协议的第一篇文章,此篇我们先简单介绍 后边文章中需要的基础概念,后续使用专门文章来描述序列号,建立连接,关闭连接,发送/接收数据等流程.


END!


Tags