网站备案信息抽查,wordpress 文本编辑插件,php网站怎么搭建环境配置,产品开发策略简介
本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的#xff0c;不会互相冲突.
系列文章
协议簇#xff1a;TCP 解析#xff1a;基础 协议簇#xff1a;TCP 解析#xff1a;建立连接 协议…简介
本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的不会互相冲突.
系列文章
协议簇TCP 解析基础 协议簇TCP 解析建立连接 协议簇TCP 解析连接断开 协议簇TCP 解析Sequence Number 协议簇TCP 解析数据传输
消息格式
毫无疑问我们首先得描述一下 TCP 数据包的格式.
RFC 中规定的格式如下 各字段的意义及其值 这里我们先简要的介绍一下后续详细逐一描述每个字段的用途
Source Port 16bits. 标记 TCP 数据包的发送方发送该数据时使用的端口号Destination Port: 16bits. 标记 TCP 数据包的接收方接收该数据包所使用的端口号Sequence Number: 32bits. 表示当前 TCP 数据包中数据的第一个字节的的序列号. 有一个例外当当前数据包时包含 SYN 标记时当前包中的序列号代表 初始序列号(initial sequence number, ISN), 第一个字节的序列号将是 ISN 1Acknowlegment Number: 32bits. 当 ACK 标记被设置之后这个字段表示接受方期待收到的下一个数据段的 sequence number. 当TCP连接建立之后这个字段总是会被包含Data Offset: 4bits. 标识当前TCP数据包所包含的实际有效数据的偏移. 单位是 32bit也就是 4 byte.Reserved: 6 bitsControl Bits: 6bits. URG: Urgent Pointer field significantACK: Acknowldgment field significantPSH: Push FunctionRST: Reset the connectionSYN: Synchronize sequence numbersFIN: No more data from sender Window: 16bits. 表示当前接收方能接受的数据的数量(以当前 TCP 头中的 Acknowlegment Number 为基准 )Checksum: 16bits.Urgent Pointer: 16bits.Options: 可变长度.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
序列号小于 SND.UNA 的数据的状态为 已发送且收到了对应的 ACK. 对应图中 段1序列号处于 (SND.UNA, SND.NEXT) 的数据的状态为 已发送但是还未收到对应的 ACK. 对应图中 段2序列号处于 [SND.NEXT, SND.UNA SND.WND) 的数据的状态 表示可用的序列号接下来发送的数据将被赋予这些序列号. 对应图中 段3序列号大于 SND.UNA SND.WND 在当前状态下是不可用的. 对应图中 段4段2 标记了当前的发送窗口
Receive Sequence Variables
RCV.NXT - receive next
RCV.WND - receive window
IRS - initial receive sequence nubmer这里用一张图来描述一下接收序列.
Receive Sequence Space
序列号小于 RCV.NXT 的数据的状态为 已接收且发送了对应的 ACK. 对应图中 段1序列号处于 (RCV.NXTRCV.NXT RCV.WND) 的序列号为期待接收到的数据的序列号. 对应图中 段2序列号大于 RCV.NXT RCV.WND 的序列号在当前状态下是不可用的. 对应图中 段3段 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 valueState
在一个 TCP 连接的生命周期中会在不同的状态之间变化. 这些状态分别是
LISTEN 表示在等待一个远程连接请求SYN-SENT: 表示请求连接的请求已经发送在等待对方的连接请求SYN-RECEIVED: 表示发送了连接请求且收到了对方的连接请求正在等待确认建立连接的 ACKESTABLISHED: 表示一个 TCP 连接已经建立 可以在当前连接上接收发送数据FIN-WAIT-1: 表示在等待对方发送关闭连接请求或者等待对方发送对应于自己刚刚发送的关闭连接请求的 ACK.FIN-WAIT-2: 表示在等待对方发送关闭连接请求CLOSE-WAIT: 表示在等待本地用户的关闭连接请求CLSING: 表示在等待对方发送关闭连接请求ACK.LAST-ACK: 表示在等待对方发送对应于自己刚刚发送的关闭连接请求的 ACK.TIME-WAIT: 表示正在等待一段时间以确保对方收到我们发送的关闭连接请求的 ACKCLOSED: 表示当前连接已经完全关闭了
用一张图描述这些这些状态之间的切换. 注意这只是一张简图并未涵盖整个协议中规定的状态变换.
作为 TCP 协议的第一篇文章此篇我们先简单介绍 后边文章中需要的基础概念后续使用专门文章来描述序列号建立连接关闭连接发送/接收数据等流程.
END!