协议簇:TCP 解析: 基础

简介

本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的,不会互相冲突.

系列文章

协议簇:TCP 解析:基础
协议簇:TCP 解析:建立连接
协议簇:TCP 解析:连接断开
协议簇:TCP 解析:Sequence Number
协议簇:TCP 解析:数据传输

消息格式

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

RFC 中规定的格式如下:
在这里插入图片描述
各字段的意义及其值:
这里我们先简要的介绍一下,后续详细逐一描述每个字段的用途

  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

State

在一个 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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协议簇:TCP 解析: 建立连接

简介 接前文 协议簇:TCP 解析: 基础, 我们这篇文章来看看 TCP 连接建立的过程,也就是众所周知的”三次握手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议簇&a…

协议簇:TCP 解析: 连接断开

简介 接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的”四次挥手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议…

协议簇:TCP 解析: Sequence Number

简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下。这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对应于一个序列号. 由于每个字节都有自己的序列号&a…

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启,状态为 active 如果未开启,状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里,我…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候,我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题: 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候,发现连接速度非常慢(肉眼可见的慢&#x…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​

证书体系: CSR 解析

原文同时发布于本人个人博客: https//kutank.com/blog/cert-csr/ 简介 CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识,重点集中在 CSR 所包含的信息,及其意义。 CSR 的作用: CSR 通常由想要获…

模拟网页行为之工具篇二

先说360浏览器,打开开发者选项,可以看到界面提供了几个功能选项,如图: 这个图片的第一个搜索图标点中过后,再去选中网页你感兴趣的部分就可以在Element选项中跳转到你感兴趣的代码。也可以直接ctrlF2搜寻你感兴趣网页元…

模拟网页行为之实践篇三

现在来谈下验证码图片的获取方式,带有验证码的地方都会附带有个刷新按钮,而刷新按钮的地方就是获取验证码网址代码。如果看过前面写的《模拟网页行为之工具篇》就会很容易定位到代码位置。定位到代码位置后看下图: 基本可以看到的是获取验证码…

SHA-256算法实现

SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生 的输出是一个256-bit 的报文摘要。该算法处理包括以下几步: STEP1:附加填充比特。对报文进行填充使报文长度与448 模512 同余(长度…

ecc算法入门介绍

一、从平行线谈起。 平行线,永不相交。没有人怀疑把:)不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了?事实上没有人见到过。所以“平行线,永不相交”只是假设(大家想想初中学习的平行…

Intel Hex概述

什么是Intel Hex文件 Intel HEX文件时遵循Intel HEX文件格式的ASCII文本文件。在Intel HEX文件的每一行都包含了 一个HEX记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成的。Intel HEX文件常用来传输要存储在ROM 或者 EPROM中的程序和数据。大部分的EPROM编程器…

AndroidStudio+ideasmali动态调试smali汇编

0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主,加上一点ida6.6的动态调试,但是ida的调试smali真的像鸡肋一样,各种不爽,遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态调试&a…

使用IDA Pro动态调试SO文件

(1)在IDA的安装路径中找到android_server文件。 (2)将android_server拷贝到手机的/data/local/tmp目录下面。 (3) 将手机插上电脑,打开命令提示符, 先输入”adb shell”,然后输入”…

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作(大数据处理)主要是.split和re.findall和glob.glob运用。 读取文件的路径(为了获得文件内容)和提取文件路径中感兴趣的东西(标签) 1,“glob.glob”用于读取文件路径 2,“.…

Android系统架构图

一、Aplications(应用层) 应用是用Java语言编写的云新在虚拟机上的程序。 二、Application Framework(应用框架层) 这一层是编写Google发布的核心应用时所使用的API框架,开发人员可以使用这些框架来开发自己的应用。 V…

AES算法重点详解和实现

可以看到,在原始数据长度为16的整数倍时,假如原始数据长度等于16*n,则使用NoPadding时加密后数据长度等于16*n,其它情况下加密数据长度等于16*(n1)。在不足16的整数倍的情况下,假如原始数据长度等于16*nm[其中m小于16]…

勒索病毒傀儡进程脱壳

样本是:wallet勒索病毒 环境:虚拟机VMWARE win7 32位 工具:OD,winhex 初次拿到样本,先用火绒剑工具监控下病毒样本的流程,可以看到有一个自创建进程的行为。 我们等找到OEP后,在CreateProcessA下…

arm32和arm64常用指令B BL BLX机器码计算

现在大部分手机cpu架构是ARM v7-A和ARMV8-A,,在ARM-v7A中常使用32位ARM指令集并且支持thumb指令集与arm的切换,而在ARMV8中使用的是64位ARM指令集且不再有thumb指令集状态的切换了。在调用函数时,会有常用的调用方式:BL和B&#x…