5.8.5 TCP可靠传输(一)序号确认机制

news2024/11/25 7:49:47

5.8.5 TCP可靠传输(一)序号确认机制

TCP是可靠的传输层协议,主要通过序号确认机制、超时重传机制、定时器三个方面实现可靠传输。

一、序号确认机制

TCP将所要传送的整个的应用层报文看成是一个一个字节组成的数据流,并对每一个传输的字节进行编号,在连接建立的时候,双方要商定一个初始的序号,TCP将每一次所传送的报文段中的第一个数据字节的序号,放在TCP首部的序号字段中。

TCP的确认是对“接收”到的数据的最高序号,也就是接收到的数据流中最后一个字节的序号表示确认,返回的确认号是期望接收的最高序号值还要加一,即确认序号表明接收方期望下次收到的第一个数据字节的序号

如图

图中所示主机A:192.168.1.100与百度服务器B:119.75.218.70之间的TCP数据通信的过程。一共有5个步骤
序号确认

  1. 主机A向服务器B发出了247个字节的数据,这里需要注意的是由于ACK置1的报文段并不消耗序号,主机A发往服务器B的第一个数据的序号Seq=1
  2. 当服务器B收到数据之后给主机A发回确认,此时的确认号是248,也就是对已收到来自于A的数据的最高序号加上1。换句话说下次主机A发送的报文段中的第一个字节的序号应该是248。而服务器B尚未向主机A发送数据,所以服务器B的序号Seq=1。
  3. 服务器B给主机A发送了49个字节的数据,此时服务器B的序号Seq仍然是1,因为前一个ACK标志位置1的报文段不需要消耗序号。
  4. 服务器B发送完成数据,期望和主机A释放连接,之前发送了49个字节的数据,所以此时服务器B的序号是50 ,这里主机A尚未对上述的3、4两个报文段进行确认
  5. 主机A收到数据之后对前面两个发自服务器B的报文段进行了累积确认,序号Seq=248,确认号ACK=51。因为服务器B发送了49字节的数据给主机A,并且上一个报文段的FIN=1,是需要消耗掉一个序号的。这个确认报文段同时也是对服务器B期望断开连接的确认。

由于TCP能够提供全双工通信,因此通信中的每一方都不必专门发送确认报文段。而可以在传送数据时顺便把确认信息捎带传送,这个就被成为TCP的累积确认效果,这样做可以提高传输效率。

这里我们就可以结合前面的TCP连接管理(5.8.3 TCP连接管理(一)TCP连接建立、5.8.4 TCP连接管理(二)TCP链接释放)结合在一起理解,主机A192.168.1.100访问了百度的服务器119.75.218.70和HTTP服务,主机A使用的是一般的端口号53497,服务器使用的是熟知端口号80来提供HTTP服务,我们通过三次握手机制建立起了双向的连接,主机A向服务器B发送了247个字节的数据,而服务器B向主机A发送了49个字节的数据,最后双方结束通话。连接双向释放。

二、序号确认机制思考

  1. 若收到的报文段没有差错,只是未按序号,那么应如何处理?

    TCP未对此项做明确的规定,而是让实现者自行确定该问题。目前主要有两种确认方式

    1. 将不按序的报文段直接丢弃。

      如图 直接丢弃
      比如发送端每个报文含有100个字节的数据,且一共连续发送了8个报文段,序号分别为1、101、201、301·····701,假设接收端正确的收到了其中的7个,而没有收到序号为201开始的100个字节的报文段,如果按照丢弃不按照顺序的报文段的方式,那么从序号201开始的所有报文段都必须重传。这种方式处理逻辑比较简单,但是效率不高,当然他也不需要缓存数据分片,因为因特网采用的数据报方式,有一些报文段没有按照顺序到达将会导致重传后续已经正确到达的所有的报文段。

    2. 现将其暂存于接收缓冲区内,待所缺序号的报文段收齐后再一起上交应用层。

      如图在这里插入图片描述
      现将不按序的报文段暂存于接收的缓冲区内,待所缺序号报文段收齐之后再一起上交应用层,所以接收端可以将序号为301~701的5个报文段先换存起来,发回一个Ack确认号为201的报文段即序号为前200的字节都已经正确的收到了现在期望接收的是从201开始编号的报文段,当发送方收到这个确认之后会重发这个序号为201的报文段,当该报文段正确的到达接收端之后,接收端就立即发回一个Ack=801的确认,这样就正确的接收到了数据,当然我们看到这种方式要复杂,而且需要较大的缓存,但可以提高网络的传输效率。

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

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

相关文章

Cyclo(-Ala-Tyr),21754-26-7,环(丙氨酸-酪氨酸)二肽,由两个氨基酸通过肽键环合形成

(文章资料汇总:陕西新研博美生物科技有限公司小编MISSwu)​ 【产品描述】 Cyclo(-Ala-Tyr),环(丙氨酸-酪氨酸)二肽,环二肽由两个氨基酸通过肽键环合形成,在氢键相互作用驱动下具有较强的自组装倾向&#x…

python的作用域、globals()-全局变量 和 locals()-局部变量

目录 查看全局变量和局部变量 变量解析规则 变量生存周期 在python中,函数会创建一个自己的作用域,也称为为命名空间。当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找。 我们自己定义的全局变量均在python内建的globa…

java项目linux启动文件

更改jar包名称和jar包所在目录 JAR包名称 替换成自己的项目包名称 JAR包所在目录替换成自己的jar包所在的目录 这里面的字符建议手打到服务器文件内,复制粘贴的话可能存在特殊符号 ps -ef|grep java SERVICE_PID$(ps aux | grep JAR包名称 | grep -v grep | awk…

influxDB聚合类函数

influxDB聚合类函数 1&#xff09;count()函数 返回一个&#xff08;field&#xff09;字段中的非空值的数量。 SELECT COUNT(<field_key>) FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>] 例子1 计算非空water_level数量SELECT COUN…

Web3 处理智能合约部署到本地区块链,并在本地进行测试

上文 Web3 在Truffle项目中编写出自己的第一个solidity智能合约我们演示了 在Truffle环境下写一个智能合约并编译的功能 编译出的文件夹中的这个JSON就非常重要了 我们就可以通过 它这个ABI链接到需要的智能合约程序上去 但这也仅仅是编译完了 我们的智能合约还没有部署到我们…

gma 2 教程(一)概述:2.GMA 安装

依赖环境 系统环境 【操作系统】&#xff1a;64位&#xff08;amd64&#xff09;Windows、Linux 【内存】&#xff1a;≥8 GBPython 环境 【Windows】&#xff1a;3.8.8~3.11 【Linux】&#xff1a;3.9~3.11 目前不支持MacOS和其他平台。建议安装Anaconda创建Python环境。Anac…

解决postman接口自动化测试中登录后401权限问题

大家在做接口自动化测试的时候&#xff0c;碰到有登录的系统应该都会遇到401权限的问题&#xff0c;下面我来说下如何解决这个问题。 首先需要了解问题的本质&#xff0c;是要解决什么&#xff1f;这样我们才好对症下药&#xff0c;报401是因为用户在登录的时候&#xff0c;服务…

亚马逊云科技让AI开发速度更快,门槛更低

过去只有大型科技公司、政府机构和大学才有能力和时间、金钱去部署生成式AI能力。近二十年来&#xff0c;云服务把计算的门槛降低了。亚马逊云科技全球产品副总裁Matt Wood博士表示&#xff1a;“我们希望在生成式AI上做同样的事&#xff0c;把技术提供到每个开发者和商业用户的…

kaggle免费服务器全攻略

1. kaggle服务器16G显卡一周40小时. 所以我们直接干一堆谷歌账号即可 2. 谷歌账号的注册: 我们需要FQcolab for windows可以做到. 然后我们注册好账号后.我们注册4个账号. 注册方法. 打开chrome 点最下面的添加按钮.然后一直下一步即可.无脑注册. 3. 为Chrome多账户添加单独的…

机器人制作开源方案 | 立式铣床模型

1. 功能说明 铣床主要是指用铣刀在工件上加工多种表面的机床&#xff0c;本文示例将通过程序控制模拟铣床的运动效果--模拟铣床进行加工时各个结构的运动方式。铣床的运动主要包括&#xff1a;主轴的旋转运动、立铣头的上下进给运动、工作台的前后左右进给运动。 2. 结构说明 该…

期权专业知识常用术语有哪些?虚值期权和实值期权怎么选择合理的执行价

【1】美式期权&#xff1a;每个交易日都可以行权的期权 【2】欧式期权&#xff1a;只有在到期日才可以执行的期权 【3】平值期权&#xff1a;内在价值为零或极小的期权&#xff0c;或行权价格等于或接近于标的物合约市场价格的期权。通常是指行权价格最接近标的合约市场价格的期…

JavaEE语法之第二章、多线程(初阶三)

目录 一、多线程带来的风险-线程安全 (重点) 1.1观察线程不安全 1.2线程安全的概念 1.3线程不安全的原因 1.3.1抢占式执行&#xff08;进程的随机调度&#xff09; 1.3.2多个线程修改同一个变量 1.3.3内存的可见性 1.3.4原子性 1.3.5指令重排序 二、解决之前的线程不…

Spring Boot 中的 @Query 注解是什么,原理,如何使用

Spring Boot 中的 Query 注解是什么&#xff0c;原理&#xff0c;如何使用 在 Spring Boot 中&#xff0c;Query 注解是一个非常常用的注解&#xff0c;用于定义自定义查询语句。本文将介绍 Query 注解的作用、原理和使用方法。 1. Query 注解的作用 在 Spring Boot 中&#…

【论文精读】《Classifying User Activities in the Encrypted WeChat Traffic》

Classifying User Activities in the Encrypted WeChat Traffic Authors:Chengshang Hou,Junzheng Shi,Cuicui Kang,Zigang Cao,Xiong Gang Journal:2018 IEEE 37th International Performance Computing and Communications Conference (IPCCC) (2018) 摘要 加密移动应用程序…

【算法】从记忆化搜索到递推——动态规划入门

文章目录 笔者说&#xff1a;我们为什么要学记忆化搜索&#xff1f;预备知识例题&#xff1a;198. 打家劫舍记忆化搜索 相关题目练习70. 爬楼梯记忆化搜索dp 746. 使用最小花费爬楼梯记忆化搜索dp 2466. 统计构造好字符串的方案数记忆化搜索dp 213. 打家劫舍 II记忆化搜索dp 笔…

unity + python socket通信,自定义数据包

unity和python相互之间通过socket通信来发送自定义数据包是一个利用unity构建场景和通过python来做数据处理的方式&#xff0c;能够有效的利用两种不同语言的优势。 我已经将对应的操作封装为对应的一个模块&#xff0c;SocketTools.cs&#xff0c;我们先来看一下具体的代码用…

7.3.2 【Linux】磁盘分区: gdisk/fdisk

MBR 分区表使用 fdisk 分区&#xff0c; GPT 分区表使用 gdisk 分区。 gdisk 通过lsblk或blkid先找到磁盘&#xff0c;再用parted /dev/xxx print来找出内部的分区表类型&#xff0c;之后采用gdisk或fdisk来操作系统。上表中可以发现 gdisk 会扫描 MBR 与 GPT 分区表&#xff…

【Arduino】超声波实验

4个端&#xff1a; Vcc &#xff1a; 5V电源Trig &#xff1a; 控制端&#xff08;触发&#xff09;Echo &#xff1a; 接收端&#xff08;回声&#xff09;Gnd &#xff1a; 接地端 相关参数 &#xff1a; 工作电流 &#xff1a; 15mA工作电压 &#xff1a; 5V工作频率 &am…

Linux常用命令——expr命令

在线Linux命令查询工具 expr 一款表达式计算工具 补充说明 expr命令是一款表达式计算工具&#xff0c;使用它完成表达式的求值操作。 expr的常用运算符&#xff1a; 加法运算&#xff1a;减法运算&#xff1a;-乘法运算&#xff1a;\*除法运算&#xff1a;/求摸&#xff0…

【Android】解决 build项目报错manifest merge fail XXX

报错图片&#xff1a; 解决方式&#xff1a; 找到 AndroidManifest.xml文件&#xff0c;找到找到文件的上一级&#xff0c;加上android:exported“true” 作用&#xff1a;Android:exported true 在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启…