TCP协议

2023-10-26

1 TCP协议基本概念(RFCs-793, 1122, 1323, 2018, 2581)

1.1 TCP协议的特点

  • 点对点
    • 一个发送方,一个接收方
  • 可靠的、按序的字节流
    • 可靠的:多种确保可靠性的机制
    • 字节流服务:8bit(1Byte)为最小单位构成的字节流
  • 流水线机制
    • TCP拥塞控制和流量控制机制
    • 设置窗口尺寸
  • 发送方/接收方缓存
  • 全双工(full-duplex)
    • 同一连接中能够传输双向数据流
  • 面向连接
    • 通信双方在发送数据之前必须建立连接
    • 连接状态只在连接的两端中维护,在沿途节点中并不维护状态
    • TCP连接包括:两台主机上的缓存、连接状态变量、socket等
  • 流量控制机制

这里写图片描述

1.2 套接字地址

  • TCP使用“连接”(而不仅仅是“端口”)作为最基本的抽象,同时将TCP连接的端点称为插口(socket),或套接字、套接口。
  • 插口和端口、IP地址的关系是:
    这里写图片描述

1.3 TCP发送缓存、接收缓存及报文段简要示意图

这里写图片描述

这里写图片描述

这里写图片描述

  • TCP发送进程以字节流的形式传递数据,而接收进程也把数据作为字节流来接收,类似于假想的管道。UDP发送进程发送的数据报文都是独立的,因此UDP协议不是面向流的协议。
  • 缓存:数据流向的每一个方向上都有发送缓存和接收缓存两种缓存。
  • 在传输层向IP层发送数据时,要以分组为单位,而不是按字节流来发送,TCP协议把若干字节构成一个分组,我们可以把这样的分组称为报文段(segment),这种报文段不一定都一样长,可以几个字节,也可以是几千个字节。

1.4 字节号和序号

字节号

  • 以字节为单位
  • 字节号的定义范围为0~(2^32-1)
  • 编号机制:随机
  • 举例:假如随机号是1057,而要发送6000个字节,那么字节编号范围为1057~7056。

序号

  • 以字节为基础,TCP给每一个报文段指派一个序号
  • 每个报文段的序号就是在这个报文段中第一个字节数据的序号
  • 举例:比如TCP要传输6000个字节的文件,第一个字节的编号是10001,如果数据用5个报文段来发送,前4个报文段各携带1000字节的数据,最后一个报文段携带2000字节的数据。则各报文段序号如下:
    • 报文段1->序号:10001(字节号范围:10001~11000)
    • 报文段1->序号:11001(字节号范围:11001~12000)
    • 报文段1->序号:12001(字节号范围:12001~13000)
    • 报文段1->序号:13001(字节号范围:13001~14000)
    • 报文段1->序号:14001(字节号范围:14001~16000)

1.5 接收方如何处理乱序到达的Segment?

TCP规范中没有规定,由TCP的实现者做出决策。

2 TCP协议报文段格式

这里写图片描述

这里写图片描述

源端口和目的端口

  • 源端口和目的端口各占2字节
  • 端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现
  • 源端口一般为动态端口

序号字段

  • 序号字段占4字节
  • TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一字节的序号
  • 序列号指的是segment中第一个字节的编号,而不是segment的编号
  • 建立TCP连接时,双方随机选择序列号

确认号字段

  • 确认号占4字节
  • 是期望收到对方的下一个报文段的数据的第一个字节的序号
  • 累计确认:该序列号之前的所有字节均已被正确接收到

首部长度

  • 首部长度占4bit
  • 它指出TCP首部共有多少个4字节,首部长度可以在20~60字节之间。因此这个字段的值可以在5(5X4=20)至15(15X4=60)之间

保留字段

  • 保留字段占6bit
  • 保留为今后使用,但目前应置为0

紧急比特URG

  • 紧急比特URG占1bit
  • 当URG=1时,表明紧急指针字段有效
  • 它高速系统此报文段中有紧急数据,应当尽快传送(相当于高优先级的数据)

确认比特ACK

  • 确认比特ACK占1bit
  • 只有当ACK为1时确认号字段才有效。当ACK=0时,确认号无效

推送比特PSH(Push)

  • 推送比特PSH占1比特
  • 接收TCP收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满后再向上交付

复位比特RST(Reset)

  • 复位比特RST占1比特
  • 当RST=1时,表明TCP连接中出现严重差错(如拒绝连接请求、异常中止连接、中止空闲连接等),必须释放连接,然后再重新建立运输连接

同步比特SYN

  • 同步比特SYN占1比特
  • 同步比特SYN置1,就表示这是一个连接请求或连接接收报文

终止比特FIN(Final)

  • 终止比特FIN占1比特
  • 用来释放一个连接。当FIN=1时,表明此报文段地发送端地数据已经发送完毕,并要求释放运输连接

窗口字段

  • 窗口字段占2个字节
  • 窗口字段用来控制对方发送地数据量,单位为字节
  • TCP连接地一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限

校验和

  • 校验和占2字节
  • 校验和字段检验的范围包括首部和数据这两部分
  • 在计算校验和时,要在TCP报文段的前面加上12字节的伪首部(IP地址)

紧急指针字段

  • 紧急指针字段占16bit
  • 紧急指针字段指出在本报中的紧急数据的最后一个字节的序号

选项

  • 选项字段长度可变,但不超过40个字节
  • TCP只规定了一种选项,即最大报文段长度:MSS(Maximum Segment Size)。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”
  • MSS是TCP报文段中的数据字段的最大长度
  • 数据字段加上TCP首部才等于整个的TCP报文段

填充

  • 填充字段是为了使整个首部的长度是4字节的整数倍

TCP报文抓包举例

这里写图片描述

3 TCP三次握手和四次释放过程

用三次握手建立TCP连接

这里写图片描述

TCP连接释放的过程

这里写图片描述

在第二次释放后,从 A 到 B 的连接就释放了,连接处于半关闭状态。相当于 A 向 B 说:“我已经没有数据要发送了。但你如果还发送数据,我仍接收。”

在第四次释放后,整个连接已经全部释放。

这里写图片描述

4 TCP确认机制

这里写图片描述

5 TCP窗口机制

这里写图片描述

修改记录


时间 动作
2017.6.5 首次上传

参考资料


深博 — 深博IT大讲堂 — 网络技术基础

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP协议 的相关文章

  • 大量大数据如何进行查询

    1 两种查询引擎查询速度 myIsam 引擎 InnoDB 中不保存表的具体行数 也就是说 执行select count from table时 InnoDB要扫描一遍整个表来计算有多少行 MyISAM只要简单的读出保存好的行数即可 注意的
  • MySQL触发器

    MySQL触发器是用于在数据表上自动执行SQL代码的对象 触发器会在指定的数据库事件发生之前或之后触发 这些事件包括 INSERT 向表中插入数据之前或之后 UPDATE 更新表中的数据之前或之后 DELETE 从表中删除数据之前或之后 触
  • SpringBoot中logback不同环境日志配置

  • 高阶数据结构之LRU Cache

    文章目录 什么是LRU Cache LRU Cache的实现 JDK中自带的数据结构 模拟实现LRU Cache 双向链表 哈希表 什么是LRU Cache LRU的全称是 Least Recently Used 的缩写 表示最近最少的使用

随机推荐

  • 固态硬盘编译android源码,Mac 下的 Android 8.1源码编译(LineageOS 15.1 for XiaoMi Mix2)

    编译环境 OSX 10 12 Xcode 8 3 3 JDK 8 Android SDK 需要用到的软件 作者编译时遇到需要安装的目前就这些 不排除有用到之前自己装过的 Sed MacPorts Homebrew Imagemagick G
  • STM32以JSON格式发布HTTP请求

    在本文中 我们将学习如何将SIM800或SIM900与STM32微控制器一起使用 以及如何将JSON格式的HTTP发布请求发送到任何API服务器 介绍 除了Wifi模块或以太网模块 IoT项目也可以通过SIM800 900 GSM GPRS
  • zookeeper实现leader选举的一种方法

    写这篇文章之前 我需要解释下为什么需要实现leader选举 我们在软件系统构建过程中 总会有一个场景 就是如何保证系统高可用 保证高可用有一个简单方式就是多加几个副本 也就是部署多个节点 构成一个集群 一台机器挂掉 业务由另一台接管 在一个
  • Linux下hydra的使用

    Syntax hydra l LOGIN L FILE p PASS P FILE C FILE e nsr o FILE t TASKS M FILE T TASKS w TIME W TIME f s PORT Parameter R
  • java+date+定义+赋值,Java Script基础(五) 内置对象Date

    在JavaScript中 系统的内置对象有Date对象 Array对象 String对象和Math对象等 1 Date 用于操作日期和时间 2 Array 用于在单独的变量名中存储一系列的值 3 String 用于支持对字符串的处理 4 M
  • VS Code for Mac Hello World

    VS Code for Mac Hello World VS Code 控制台应用 打开VSCode gt Open gt 选择已经创建好的空文件夹Hello World Terminal gt New Terminal 打开控制台 dot
  • 算法之线性排序

    目录 前言 桶排序 计数排序 基数排序 问题 总结 参考资料 前言 桶排序 计数排序 基数排序这些排序算法的时间复杂度是线性的 所以我们把这类排序算法叫作线性排序 Linear sort 之所以能做到线性的时间复杂度 主要原因是 这三个算法
  • Qt 5 架构和特点

    Qt 5 模块构架 模块 功能 Qt Core Qt 5 的核心类库 每个模块都建立在Core上 Qt GUI 图形用户界面开发的最基础的类库 Qt Widgets 提供c 用户界面部件 是对Qt GUI的拓展 Qt SQL 对数据库进行操
  • ios开发入门

    开发一个应用程序看起来复杂 实际上我们可以分为以下几个方面来看 设计用户界面 定义交互 实现行为 整合数据 我们这里需要先提一种典型的软件设计典范 也就是我们常说的MVC模式 业务模型 Model 用户界面 View 页面业务逻辑 Cont
  • web前端炫酷实用的HTML5应用和jQuery插件

    又开始了新的一天 我们也将继续为大家分享许多优秀的HTML5应用和jQuery插件 作为前端开发者来说 这些资源可以帮助你在项目开发上派上用场 下面一起来看看这些炫酷而实用的HTML5应用和jQuery插件吧 1 jQuery CSS3图片
  • AI+无线通信

    1 赛题与数据 官方介绍已经比较清楚了 按照需要下载对应的文件 博主使用的是pytorch版本 2 代码的本地部署 2 1 文件列表 示例程序文件有以下几个文件 Model define pytorch py 在这个文件设计网络结构 设计
  • Redis----布隆过滤器

    目录 背景 解决方案 什么是布隆过滤器 布隆过滤器的原理 一些其他运用 背景 比如我们在观看新闻或者刷微博的时候 会不停地给我们推荐新的内容 我们发现几乎没有重复的 说明后台已经进行了去重处理 基于如何去重 Redis给出了高效的方案 布隆
  • shell脚本之实现menu菜单

    bin bash function copy read p please input your old file old file read p please input your new file new file cp r old fi
  • 目标检测 基于IOU的匹配算法

    目标检测是计算机视觉领域的一个重要研究方向 旨在通过算法识别出图像中存在的目标物体 并对其进行分类 定位和跟踪等任务 而基于IOU的匹配算法是目标检测中常用的一种算法 其原理是通过计算目标框之间的重叠率 IOU 来确定目标检测算法所预测的目
  • 什么是哈希算法?

    哈希算法的基本含义 哈希是密码学的基础 理解哈希是理解数字签名和加密通信等技术的必要前提 哈希 英文是 hash 本来意思是 切碎并搅拌 有一种食物就叫 Hash 就是把食材切碎并搅拌一下做成的 哈希函数的运算结果就是哈希值 通常简称为哈希
  • iframe允许嵌入的视频全屏播放

    iframe允许嵌入的视频全屏播放 设置 allowfullscreen true
  • 记一次修改DiyBox的经历(openwrt固件解包与打包)

    吐槽几句 做技术的有无私造福人类的 也有耍流氓坑人的 说的不是DiyBox 而是 信利 信利就是一家犯贱 祸害大学生 助纣为虐的流氓公司 其所谓的 防私接 技术让电信和移动牢牢的垄断着学校的宽带资源 还让学生花费了大量的冤枉钱 当然 有狗熊
  • openGL之API学习(二十九)glDepthRange

    将规范化的深度范围 1 1 通过线性变换映射到 nearVal farVal 这个范围不能超出 0 1 这个函数的作用一般是分层渲染 比如要渲染一副从窗户看外面世界的场景 可以将外面场景的深度值映射为0 5 1 将室内场景深度值映射为0 0
  • 第二篇:C语言中实现两个数的加法运算

    代码展示 实现两个数的加法运算 include
  • TCP协议

    1 TCP协议基本概念 RFCs 793 1122 1323 2018 2581 1 1 TCP协议的特点 点对点 一个发送方 一个接收方 可靠的 按序的字节流 可靠的 多种确保可靠性的机制 字节流服务 8bit 1Byte 为最小单位构成