TCP的运输连接管理

news2024/9/25 9:41:17

TCP的运输连接管理

文章目录

  • TCP的运输连接管理
    • TCP报文格式简介
      • 首部各个字段的含义
      • 控制位(flags)
    • TCP的连接建立
      • 抓包验证
      • 一些细节及解答
    • TCP连接释放
      • 抓包验证
      • 一些细节及解答
    • 参考

TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放时每一次面向连接的通信中必不可少的过程。因此,运输连接就有三个阶段,即: 连接建立数据传输连接释放。运输连接的管理就是使运输连接的建立和释放都能正常运行。

TCP的连接是一条 虚连接(也就是 逻辑连接

在TCP连接建立的过程中要解决以下三个问题:

  1. 要使每一方能够确知对方的存在。
  2. 要允许双方协议一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
  3. 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

TCP连接蚕蛹客户服务器方式。主动放弃连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。

TCP最主要的特点

  1. TCP是面向连接的运输层协议。 这就是说在传送数据前必须先建立TCP连接。在传送完数据后必须释已经建立的TCP连接。
  2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(一对一)
  3. TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
  4. TCP提供全双工通信。 TCP允许通信双档的应用进程在任何时候都能发送数据。TCP连接的两段都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
  5. 面向字节流 TCP中的“流”指的是 流入到进程或从进程流出的字节序列面向字节流的含义是:虽然程序和TCP的交互是一次一个数据(大小不等),但TCP把应用程序交下来的数据仅仅看成是一串无结构的字节流

TCP报文格式简介

TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个TCP报文段的分为首部和数据两部分,而TCP的全部功能都体现在它首部中各个字段的作用。下面我们就来看一下TCP报文段首部格式。

img

首部各个字段的含义

首部固定部分个字段的意思如下:

  • 源端口目的端口 各占2个字节,分别写入源端口号和目的端号。

  • 序号(seq) 占4字节。序号范围是 [ 0 , 2 32 − 1 ] [0, 2^{32} - 1] [0,2321],共 2 32 2^{32} 232个序号。序号增加到 [ 0 , 2 32 − 1 ] [0, 2^{32} - 1] [0,2321]后,下一个序号就又回到0。

  • 确认号(ack) 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。

    若确认号 = N, 则表明:到序号 N - 1为止的所有数据都已正确收到。

  • 数据偏移 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。换个说法是这个字段指出了TCP报文段的首部长度。

    首部最小长度为20字节,因此数据偏移字段的最小值为 ( 0101 ) 2 (0101)_2 (0101)2.

    首部最长长度为60字节,因此数据偏移字段的最小值为 ( 1111 ) 2 (1111)_2 (1111)2.

  • 保留 占6位,保留为今后使用,但目前应置为0。

  • 控制位(flags) 有6个控制位,用于说明本报文段的性质。 具体含义见下。

  • 窗口 占2字节。窗口值是 [ 0 , 2 16 − 1 ] [0, 2^{16} - 1] [0,2161]之间的整数。窗口指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许发送的数据量(以字节为单位)。有这个限制的原因是接收方的数据缓存空间是优先的。窗口值作为接收方让发送方设置其发送窗口的依据

    窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着。

  • 检验和 占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

  • 紧急指针 占2字节。紧急指正仅在URG = 1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时。值得注意的是,即使窗口为零时也可发送紧急数据。

  • 选项 长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节。

    随着互联网的发展出现了多个选项:

    • 最大报文段长度 MSS. MSS是每一个TCP报文段中的**数据字段的最大长度**(不包含首部)。(最初只有这个)

    • 窗口扩大 窗口扩大选项占3字节,其中一个字节表示移位值S.新窗口值等于TCP首部中的窗口位数从16增大到(16 + S)。移位值允许使用的最大值是14 ,相当于窗口最大值增大到 2 16 + 14 − 1 = 2 30 − 1 2^{16 + 14} - 1 = 2^{30} - 1 216+141=2301

      为了使像卫星信道的网络提高吞吐量,需要更大的窗口。

    • 时间戳 占10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送回答字段(4字节)

      发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确计算出RTT。

      时间戳的两个功能:

      ① 用来计算往返时间RTT

      ② 用于处理TCP序号超过 2 32 2^{32} 232的情况,这又称为 防止序号绕回 PAWS (Protect Against Wrapped Sequence numbers)

控制位(flags)

  • 紧急 URG(URGent) 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不需要按原来的排队顺序来传送。例如,用户发出的中断命令,中断在远地的程序运行。

    当URG置1时,发送方TCP就把紧急数据插入到报文段数据的最前面,而在紧急数据后面的数据任然是普通数据。这需要与首部中的紧急指针字段配合使用。

  • 确认 ACK 仅当ACK = 1时确认号字段才有效,当ACK = 0 时,确认号无效。TCP规定,在建立连接后所有传输的报文段都必须把ACK置为1.

  • 推送 PSH 当将PSH置为1,并发送出该TCP时。接收方就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

  • 复位 RST 当RST = 1时,表明TCP连接中出现严重错误,必须释放连接。RST还用来拒绝一个非法报文段或拒绝打开一个连接。RST也可以称为重建位或重置位。

  • 同步 SYN (SYNchronization) 当SYN置为1时,表明这是一个连接请求报文段。

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

TCP的连接建立

TCP建立连接的过程叫做握手,握手时需要在客户机和服务器之间交换三个报文段(也可以是四个)TCP报文段。下图为三报文握手建立TCP连接的过程。

45E271BA328627ED3BB7501CFE3184BC

如果在上一小节对TCP首部报文各字段都有了认识。下面对上面三条线的意思做如下语义化:

  1. A:你好,可以建立连接嘛?我的报文段序号为x。
  2. B:好的,接受你向我建立连接,期待你序号为x+1的报文段。我也可以向你建立连接嘛?我的报文序号为y。
  3. A:接受你发起的连接,期待你发送的序号为y+1的报文段,我发送数据的序号是x+1.

抓包验证

下面是通过抓包工具抓到的一些数,可以用来分析TCP的三次握手:

image-20230212155419150

在图中红框选中显示的是完整的TCP连接的“三次握手”过程。

在6068->80过程中,6068是客户端端口,80是服务器的端口。在6068和80端口之间来回就是“三次握手”的过程。

可以看到“第一次握手”客户端发送的TCP报文中以[SYN]作为标志位,并且客户端序号seq = 0.

在第二次中服务端返回的TCP报文中以[SYN, ACK]作为标志位。同时发送服务端的序号seq = 0,确认号ack = 1(是”第一次握手“中客户端序号seq值 + 1)

“第三次握手”中客户端再向服务器发送的TCP报文中以ACK作为标志位。同时携带客户端序号seq = 1(第二次握手中服务器确认号ack的值);确认号ack = 1(第二次握手中服务端序号seq + 1)

通过上面三步客户端和服务端就建立了连接,符合前面的TCP连接的示意图。

一些细节及解答

为什么A最后还要发送一次确认呢?(为什么需要最后一次握手)

这主要是为了防止已失效的连接请求报文段突然又传到了B,因而产生了错误。

所谓的已失效请求报文段可以在以下场景中产生:

A先发送的连接请求报文,因种种原因延迟了。于是A又发送了请求连接报文,并且成功经历了连接、数据传送、断开连接。在断开连接之后A第一次发送的请求报文才刚到,于是B开始向A发出确认报文段,但是A并没有发出新的建立连接的请求,因此不会理睬B的确认。如果缺少最后一次握手,会导致B发出建立连接报文之后就认为连接建立,而A实际上并没有同意连接的建立。

TCP连接释放

CD7BA39460BF1088509A8376212CA7DA

四次挥手的理解:

(1) 首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:

  • 标记位为FIN,表示"请求释放连接"
  • 序号为seq = u
  • 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。

注意:这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文。

(2) 服务器接收到从客户端发出的TCP报文后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,其中:

  • 标记位ACK,表示“接收到客户端发送的释放连接的请求”
  • 序号位seq = v
  • 确认号为ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加q作为本段报文确认号ack的值;
  • 随后服务器端开始准备释放服务器端到客户端方向上的连接。客户端收到从服务器端发出的TCP报文后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段

(3) 服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器到客户端方向上的连接准备,再次向客户端发出一段TCP报文,其中:

  • 标记位为FIN,ACK,表示“已经准备好释放连接了”。注意这里的ACK并不是确认收到服务端的确认报文。
  • 序号为seq = w
  • 确认号为ack = u + 1,表示是在收到客户端报文的基础上,将其序号seq值加1作为本报文确认号ack的值。

随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。

(4) 客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务端发送一段报文,其中:

  • 标记位ACK,表示接收到服务器准备号释放连接的信号
  • 序号为seq = u + 1,表示在收到了服务器端报文的基础上,将其确认号ack值作为本报文序号的值。
  • 确认号为ack = w + 1,表示是在收到了服务器端报文的基础上,将其序号seq值作为本段报文确认号的值

随后客户端开始在TIME-WAIT阶段等待2MSL.

抓包验证

image-20230212163244076

上图为借助抓包工具,抓取到的TCP的四次挥手的过程。可以照前面的示意图和文字来看。发现与前面的描述一致。

一些细节及解答

为什么客户端在TIME-WAIT阶段要等2MSL?

这有两个理由:

① 为了保证A发送的最后一个ACK报文能够到达B.因为A发送的最后这个ACK报文可能丢失。如果A直接进入到CLOSE阶段跳过TIME-WAIT阶段的话,B在无法收到确认断开的报文段重新发送请求断开的报文段时,A将无法收到因为此时连接已经断开。

② 防止上一节提到的“已失效的连接请求报文段”出现在本连接中。在A发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中小时。这样就可以使下一个新的连接中不会出席那这种旧的连接请求报文段

参考

  • 《计算机网络 第7版》

  • 详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ” (baidu.com)

  • TCP报文段的首部格式

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

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

相关文章

第一部分:简单句——第一章:简单句的核心——二、简单句的核心变化(主语/宾语/表语的变化)

二、简单句的核心变化 简单句的核心变化其实就是 一主一谓(n. v.) 表达一件事情,谓语动词是其中最重要的部分,谓语动词的变化主要有四种:三态加一否(时态、语态、情态、否定),其中…

MSI_MSI-X中断之源码分析

MSI_MSI-X中断之源码分析 文章目录MSI_MSI-X中断之源码分析一、 怎么发出MSI/MSI-X中断1.1 在RK3399上体验1.1.1 安装工具1.1.2 查看设备MSI-X信息1.1.3 验证MSI-X信息二、 怎么使用MSI/MSI-X三、 MSI/MSI-X中断源码分析3.1 IRQ Domain创建流程3.1.1 GIC3.1.2 ITS3.1.3 PCI MSI…

Linux C/C++ timeout命令实现(运行具有时间限制)

Linux附带了大量命令,每个命令都是唯一的,并在特定情况下使用。Linux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期,命令将停止执行。 如何使用timeout命令 我们将解释如何使用Linux timeout命令 timeout […

七、Git远程仓库操作——团队成员内协作

1. github远程协作的两种方式 前面我写的笔记,都是自己一个人在玩,无论是本地操作还是推送到远程都是自己推送到自己的仓库。 如果是别人拥有这个仓库,而我想对这个仓库的内容更改后,然后想推送更新到这个仓库,我们要…

【随笔】我迟到的2022年度总结:突破零粉丝,1个月涨粉1000+,2023年目标3万+

前言 我是21年12月注册的csdn, 作为用户平时看看文章,从未参与过写文章这件事。 但这一年的时间我见证了很多新号的崛起,有的号我平时关注比较多,看着他们从零粉丝突破了三万甚至五万的粉丝量。 在csdn上遇到了我的贵人&#x…

位运算 | 1356. 根据数字二进制下 1 的数目排序

LeetCode 1356. 根据数字二进制下 1 的数目排序 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。 文章讲解https://www.programmercarl.com/1356.%…

【微电网】基于风光储能和需求响应的微电网日前经济调度(Python代码实现)

目录 1 概述 2 知识点及数学模型 3 算例实现 3.1算例介绍 3.2风光参与的模型求解 3.3 风光和储能参与的模型求解 3.5 风光储能和需求响应都参与模型求解 3.6 结果分析对比 4 Python代码及算例数据 1 概述 近年来,微电网、清洁能源等已成为全球关注的热点…

Linux Vim编辑器基础讲解

目录 vim三个模式 命令模式 输入模式(insert 插入模式、编辑模式) 末行模式 编辑简单文档 什么是vim Vim是文本编辑器,是Linux上最常用的文本编辑器 Vim可以建立、编辑、显示文件 绝大多数Linux都会携带vim或者vi vim编辑器和vi编辑器的…

windbg-应用层实时调试

调试符号windbg使用一个或多个目录来存放符号条件,并使用环境变量_NT_SYMBOL_PATH来指向这些环境变量的位置,对操作系统内部模块的符号文件,一般用http://msdl.microsoft.com/download/symbols配置如下:SRV*C:\Symbols*http://msd…

手把手教你部署ruoyi前后端分离版本

下载源码(当前版本3.8.5)RuoYi-Vue: 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本 (gitee.com)创建数据库(一定要是这三个&…

【STM32】【HAL库】遥控关灯3 遥控器

相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 硬件遥控器 控制一个灯的开关(2个按键),发射RF433或红外 使用纽扣电池供电 一键启动,低待机功耗 硬件设计 一键…

推荐系统开源工具RecBole学习

文章全文首发:码农的科研笔记(公众号) RecBole是由AI Box团队开发的基于Pytorch的推荐系统算法库。该框架从数据处理、模型开发和算法训练都有涉及,能方便进行算法构建和实验对比。 数据组织形式 RecBole约定了一个统一、易用的数…

发生异常: AttributeError ‘xxx’ object has no attribute ‘ooo’

python 发生异常: AttributeError ‘xxx’ object has no attribute ‘ooo’ 原因: 函数调用发生在变量定义之前 示例分析: 在apple.py文件中代码如下: class Apple():def __init__(self):self.eat()self.pricedef eat(self):print("吃…

Spring Security in Action 第十八章 手把手OAuth2应用

本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringSecurity相关知识相关知识,打造完整的SpringSecurity学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获&#…

Java:SpringMVC的使用(2)

目录第十二章 REST风格CRUD练习12.1 搭建环境12.2 实现功能思路第十三章 SpringMVC消息转换器13.1 消息转换器概述13.2 使用消息转换器处理请求报文(1) 使用RequestBody获取请求体(2) 使用HttpEntity\<T>获取请求体及请求头13.3 使用消息转换器处理响应报文(1) 使用Respo…

llvm 创建外部调用函数方法

llvm 创建外部调用函数方法 2023-02-12 15:26:19 sizaif 文章目录llvm 创建外部调用函数方法法一:声名参数类型及函数类型在llvm IR中处理并调用函数:外部函数&#xff1a;法二声明函数在llvm IR中处理并函数调用外部函数法一: 声名参数类型及函数类型 // Fun Ty static Fun…

【CS224W】(task3)NetworkX工具包实践

note 节点可以为任意可哈希的对象&#xff0c;比如字符串、图像、XML对象&#xff0c;甚至另一个Graph、自定义的节点对象。通过这种方式可以自由灵活地构建&#xff1a;图为节点、文件为节点、函数为节点&#xff0c;等灵活的图形式。暂时省略&#xff1a;【B5】计算机网络图…

vue3学习资料整理

一、一个后端程序员为什么要学习前端&#xff1f; 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点&#xff08;nodejs的概念与特征详解&#xff09;》 https://www.1pindao.co…

2023级浙江大学MEM提面最新经验分享

一、个人背景背景&#xff1a;本人毕业于某211大学工程管理相关专业&#xff0c;目前定居在杭州&#xff0c;在某汽车制造公司工作&#xff0c;负责研发无人驾驶项目。我申请的是浙大MEM提前批面试&#xff0c;因为通过提面优秀资格顺利上岸录取&#xff0c;之前感到对自己有帮…

Java、JSP动漫网站的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科技的迅速发展&#xff0c;计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展&#xff0c;网络的规模也逐渐增大&#xff0c;网络的元素也随之不断增加&#xff0c;有的利用其通信&#xff0c;有的利用其…