协议簇:TCP 解析: 基础
简介
本文我们将从 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 + 1
- Acknowlegment Number: 32bits. 当 ACK 标记被设置之后,这个字段表示接受方期待收到的下一个数据段的 sequence number. (当TCP连接建立之后,这个字段总是会被包含)
- Data Offset: 4bits. 标识当前TCP数据包所包含的实际有效数据的偏移. 单位是 32bit,也就是 4 byte.
- Reserved: 6 bits
- 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
- 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.NXT,RCV.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 value
State
在一个 TCP 连接的生命周期中会在不同的状态之间变化. 这些状态分别是:
- LISTEN: 表示在等待一个远程连接请求
- SYN-SENT: 表示请求连接的请求已经发送,在等待对方的连接请求
- SYN-RECEIVED: 表示发送了连接请求且收到了对方的连接请求,正在等待确认建立连接的 ACK
- ESTABLISHED: 表示一个 TCP 连接已经建立, 可以在当前连接上接收发送数据
- FIN-WAIT-1: 表示在等待对方发送关闭连接请求,或者等待对方发送对应于自己刚刚发送的关闭连接请求的 ACK.
- FIN-WAIT-2: 表示在等待对方发送关闭连接请求
- CLOSE-WAIT: 表示在等待本地用户的关闭连接请求
- CLSING: 表示在等待对方发送关闭连接请求ACK.
- LAST-ACK: 表示在等待对方发送对应于自己刚刚发送的关闭连接请求的 ACK.
- TIME-WAIT: 表示正在等待一段时间以确保对方收到我们发送的关闭连接请求的 ACK
- CLOSED: 表示当前连接已经完全关闭了
用一张图描述这些这些状态之间的切换. 注意,这只是一张简图,并未涵盖整个协议中规定的状态变换.
作为 TCP 协议的第一篇文章,此篇我们先简单介绍 后边文章中需要的基础概念,后续使用专门文章来描述序列号,建立连接,关闭连接,发送/接收数据等流程.
END!
协议簇:TCP 解析: 基础相关推荐
- 在哪里查看计算机配置的网络协议簇,tcp/ip协议簇
TCP/IP协议簇是Internet的基础,也是当今最流行的组网形式.TCP/IP是一组协议的代名词,包括许多别的协议,组成了TCP/IP协议簇.其中比较重要的有SLIP协议.PPP协议.IP协议.I ...
- 【TCP/IP 协议】 TCP/IP 基础
总结 : 通过学习 TCP/IP 基础, 并总结相关笔记 和 绘制思维导图 到博客上, 对 TCP/IP 框架有了大致了解, 之后开始详细学习数据链路层的各种细节协议, 并作出笔记; 博客地址 : h ...
- 协议簇:TCP 解析: Sequence Number
简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下.这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对 ...
- 协议簇:TCP 解析: 建立连接
简介 接前文 协议簇:TCP 解析: 基础, 我们这篇文章来看看 TCP 连接建立的过程,也就是众所周知的"三次握手"的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:T ...
- 关于TCP/IP协议簇
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个网络间实现信息传输的协议簇.TCP/IP协议严格来说 ...
- 【揭秘TCP/IP协议簇】——TCP/IP的三次握手建立连接
转载自:http://hi.baidu.com/senya/blog/item/098ece583e696184800a188c.html Internet是使用TCP/IP协议簇.互联网发展之所以迅 ...
- TCP/IP 协议簇
TCP/IP 协议簇 TCP/IP作为Internet的核心协议,被广泛应用于局域网和广域网中,TCP/IP 包含许多重要的基本特性,这些特性主要表现在5个方面: 1.逻辑编制:每一块网卡 在出厂时厂 ...
- 协议簇:TCP 解析:TCP 数据传输
简介 前面,我们分别介绍了 TCP 基础知识以及连接的建立和关闭,以及最重要的 Sequence Number 的概念. 本篇文章,我们来介绍一下 TCP 如何传输数据. 系列文章 协议簇:TCP 解 ...
- 协议簇:TCP 解析: 连接断开
简介 接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的"四次挥手"的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇 ...
最新文章
- C语言,二维数组的逗号!_只愿与一人十指紧扣_新浪博客
- Xamarin Essentials教程实现数据的传输功能实例
- 深究AngularJS——AngularJS中的Controller(控制器)
- javascript模块_JavaScript中的模块
- 2018-2019-2 20165235《网络对抗技术》Exp7 网络欺诈防范
- 股票量化分析工具QTYX使用攻略——北上资金持仓选股(更新2.5.8)
- php mailer altbody,PHP_phpmailer 中文使用说明(简易版),phpmailer v5.1下载 A开头: $AltBody - phpStudy...
- 《城市化》(顾朝林)-重要术语
- mysql 的capi预处理
- Android Manifest功能与权限描述大全,flutter安装androidsdk
- 数学建模之储药柜的设计
- jeecg微服务项目调用接口报错Token验证失效的解决方法
- addToSet与each插入多条值
- 抠图扣发丝ps修图扣证件照p图扣毛发
- Excel保护怎么解除保护
- js实现粘贴板js插件clipboard.js实现一键复制粘贴功能
- 同构数怎么判断_编程:输入1-100以内的一个整数,判断这个数是否是同构数。输出不同的情况...
- 电子商务系统怎么开发,有哪些流程_OctShop
- SQL 触发器的作用,好处和坏处
- 面试之前,MySQL表连接必须过关!——表连接的原理
热门文章
- JMeter4.0以上 分布式测试报错 server failed start Listen failed on port
- 第七章 二叉搜索树(b3)BST:删除
- Leetcode905.Sort Array By Parity按奇偶排序数组
- WebService初入
- 近指针, 远指针和巨指针
- C# DataSet转JSON
- Oracle 循环相关
- 页面加载完时再动态添加脚步
- autotools入门笔记(一)
- 解决问题 com.alibaba.fastjson.JSONObject cannot be cast to xxx