当前位置: 首页 > news >正文

TCP可靠数据传输

TCP的可靠数据传输

1.TCP保证可靠数据传输的方法

TCP主要提供了检验和、序号/确认号、超时重传、最大报文段长度、流量控制等方法实现了可靠数据传输。

检验和

通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢失该TCP报文段。

序号/确认号

序号:TCP传输时将每个字节的数据都进行了编号,这就是序号,一个报文段的序号字段因此是该报文段首字节的字节流编号。

确认号:主机 A 填充进报文段的确认号是主机 A 期望从主机 B 收到的下一字节的序号。

在上图中,通过序号和确认号,只要发送端有一个报文段传输,接收端没有通过确认号回应(ACK用来保证确认号是有效的),都会重发。或者接收端的响应报文段在网络中丢失了,导致发送端没有收到,也会重发数据。这就可以保证数据的完整性。

超时重传

在进行TCP传输时,TCP每发送一个报文段,都会在一个超时间隔内等待接收方发送回一个ACK确认报文段,如果在这个超时间隔内没有收到ACK确认报文段就会触发超时重传,TCP发送端就会重新发送此报文段。

这个超时间隔是按照3.5.3节的方法动态计算的

最大报文段长度:MSS

在建立TCP的时候,双方约定一个最大报文段长度(MSS)进行发送,重传的时候也是根据这个长度进行重传。

流量控制

        一般来说,我们总希望数据传输的更快一些。但如果发送方把数据发得过快,接收方就可能来不及接收,这就会造成数据的丢失。流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
        利用滑动窗口机制可以很方便地在TCP连接上实现发送方流量控制。通过接收方的确认报文中的窗口字段,发送方能够准确地控制发送字节数。

        TCP通过让发送方维护一个称为接收窗口的变量来提供流量控制。通俗的说,接收窗口用于给发送方一个指示:该接收方还有多少可用的缓存空间。因为TCP是全双工通信,在连接两端的发送方都各自维护一个接收窗口rwnd,rwnd是动态变化的,下图对变量rwnd进行了图示。

接收窗口rwnd由以下公式得到:

rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]

其中,

LastByteRcvd:接收方上的应用程序从缓存读出的数据流的最后一个字节的编号。

LastByteRead:从网络中到达的并且已放入接收方的接收缓存中的数据流的最后一个字节的编号。

LastByteRcvd - LastByteRead <= RcvBuffer

        接收方通过把当前的rwnd值放入它发给发送方的报文段接收窗口字段中,通知发送方它在该连接的缓存中还有多少可用空间。开始时,接收方设定rwnd = RcvBuffer。

        发送方轮流跟踪两个变量, LastByteSent和LastByteAcked,这两个变量的意义很明显,注意到这两个变量之间的差 LastByteSent - LastByteAcked,就是发送方发送到连接中但未被确认的数据量, 通过将未确认的数据量控制在值 rwnd 以内,就可以保证发送方不会使接收方的接收缓存溢出。 因此,发送方在该连接的整个生命周期须保证
LastByteSent - LastByteAcked <= rwnd

滑动窗口机制:缓存中会有一个窗口,这个窗口中全部都是发送方已发送但未收到响应ACK的报文段,当窗口中最早的那个已发送但未收到响应收到了响应报文段之后,滑动窗口会右滑。

2.超时间隔加倍

TCP重传具有最小序号的还未被确认的报文段时,如果TCP下次重传的还是此分组,那么会将此分组的超时定时器的时间间隔增加为原先的二倍。

3.快速重传

TCP发送方会在超时事件发生之前通过注意是否有3个冗余的ACK来决定是否重新发送冗余ACK所对应的报文段及之后的报文段。

如果TCP发送方接收到对相同数据的3个冗余ACK,它会把这当做一种暗示,说明跟在这个已被确认过3次的报文段之后的报文段已经丢失,TCP就执行快速重传。

超时间隔加倍和快速重传只是大多数TCP实现中所做的一些修改,并非所有TCP均有此机制

相关文章:

TCP可靠数据传输

TCP的可靠数据传输 1.TCP保证可靠数据传输的方法 TCP主要提供了检验和、序号/确认号、超时重传、最大报文段长度、流量控制等方法实现了可靠数据传输。 检验和 通过检验和的方式&#xff0c;接收端可以检测出来数据是否有差错和异常&#xff0c;假如有差错就会直接丢失该TC…...

Python 私有变量和私有方法介绍

Python 私有变量和私有方法介绍 关于 Python 私有变量和私有方法&#xff0c;通常情况下&#xff0c;开发者可以在方法或属性名称前加上单下划线&#xff08;_&#xff09;&#xff0c;以表示该方法或属性仅供内部使用&#xff0c;但这只是一种约定&#xff0c;并没有强制执行禁…...

Kotlin Lambda表达式和匿名函数的组合简直太强了

Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先&#xff0c;在 Kotlin 中&#xff0c;函数是“第一公民”&#xff08;First Class Citizen&#xff09;。因此&#xff0c;它们可以被分配为变量的值&#xff0c;作为其他函数的参数传递或者函数的返回值。同样&…...

uniapp 小程序 获取手机号---通过前段获取

<template><!-- 获取手机号&#xff0c;登录内容 --><view><!-- 首先需要先登录获取code码&#xff0c;然后才可以获取用户唯一标识openid以及会话密钥及用于解密获取手机的加密信息 --><view click"login">登录</view><view…...

面板安全能力持续增强,新增日志审计功能,1Panel开源面板v1.3.0发布

2023年6月12日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.3.0版本。 在这一版本中&#xff0c;1Panel进一步增强了安全方面的能力&#xff0c;包括新增SSH配置管理、域名绑定和IP授权支持&#xff0c;以及启用网站防盗链功能。此外&#xff0c;该版本…...

k8s学习-CKS考试必过宝典

目录 CKS考纲集群安装&#xff1a;10%集群强化&#xff1a;15%系统强化&#xff1a;15%微服务漏洞最小化&#xff1a;20%供应链安全&#xff1a;20%监控、日志记录和运行时安全&#xff1a;20% 报名模拟考试考试注意事项考前考中考后 参考 CKS考纲 集群安装&#xff1a;10% 使…...

jmeter如何将上一个请求的结果作为下一个请求的参数

目录 1、简介 2、用途 3、下载、简单应用 4、如何将上一个请求的结果作为下一个请求的参数 1、简介 在JMeter中&#xff0c;可以通过使用变量来将上一个请求的结果作为下一个请求的参数传递。 ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测…...

JAVA如何学习爬虫呢?

学习Java爬虫需要掌握以下几个方面&#xff1a; Java基础知识&#xff1a;包括Java语法、面向对象编程、集合框架等。 网络编程&#xff1a;了解HTTP协议、Socket编程等。 HTML、CSS、JavaScript基础&#xff1a;了解网页的基本结构和样式&#xff0c;以及JavaScript的基本语…...

距离保护原理

距离保护是反映故障点至保护安装处的距离&#xff0c;并根据距离的远近确定动作时间的一种保护。故障点距保护安装处越近&#xff0c;保护的动作时间就越短&#xff0c;反之就越长&#xff0c;从而保证动作的选择性。测量故障点至保护安装处的距离&#xff0c;实际上就是用阻抗…...

从微观世界的RST包文视角助力企业网络应用故障排查和优化

1. 前言 随着互联网的普及和发展&#xff0c;各行业的业务和应用越来越依赖于网络。然而&#xff0c;网络环境的不稳定性和复杂性使得出现各种异常现象的概率变得更高了。这些异常现象会导致业务无法正常运行&#xff0c;给用户带来困扰&#xff0c;甚至影响企业的形象和利益。…...

企业微信开发,简单测试。

企业微信开发&#xff0c;参考文档&#xff1a; https://github.com/wechat-group/WxJava/wiki...

element日期选择设置默认时间el-date-picker

<el-date-pickerv-model"rangeDate"style"width:350px"type"daterange"value-format"yyyy-MM-dd"change"dataChange"start-placeholder"开始日期"end-placeholder"结束日期"></el-date-picker…...

AB32VG:SDK_AB53XX_V061(3)IO口复用功能的补充资料

文章目录 1.IO口功能复用表格2.功能映射寄存器 FUNCTION03.功能映射寄存器 FUNCTION14.功能映射寄存器 FUNCTION2 AB5301A的官方数据手册很不完善&#xff0c;没有开放出来。我通过阅读源码补充了一些关于IO口功能复用寄存器的资料。 官方寄存器文档&#xff1a;《 AB32VG1_Re…...

UnityVR--组件10--UGUI简单介绍

目录 前言 UI基础组件 1. Canvas 2. EventSystem 3. Image 4. Text/TextMeshPro/InputField 5. Button控件 其他 前言 UGUI是Unity推出的新的UI系统&#xff0c;它与Unity引擎结合得更紧密&#xff0c;并拥有强大的屏幕自适应和更简单的深度处理机制&#xff0c;更容易使用和…...

k8s 探针

1.前言 Kubernetes探针(Probe)是用于检查容器运行状况的一种机制。探针可以检查容器是否正在运行&#xff0c;容器是否能够正常响应请求&#xff0c;以及容器内部的应用程序是否正常运行等。在Kubernetes中&#xff0c;探针可以用于确定容器的健康状态&#xff0c;如果容器的健…...

【爬虫】4.4 Scrapy 爬取网站数据

目录 1. 建立 Web 网站 2. 编写 Scrapy 爬虫程序 为了说明 scrapy 爬虫爬取网站多个网页数据的过程&#xff0c;用 Flask 搭建一个小型的 Web 网站。 1. 建立 Web 网站 &#xff08;1&#xff09;books.html <!DOCTYPE html> <html lang"en"> <h…...

PureComponent和Component的区别和底层处理机制

PureComponent和Component都是React中的组件类&#xff0c;但它们在实现细节和使用上有些差别。 Component是React中定义组件的基类&#xff0c;它的shouldComponentUpdate方法默认返回true&#xff0c;也就是说&#xff0c;每次调用setState或forceUpdate方法都会引发组件重新…...

python3 爬虫相关学习9:BeautifulSoup 官方文档学习

目录 1 BeautifulSoup 官方文档 报错暂时保存 2 用bs 和 requests 打开 本地html的区别&#xff1a;代码里的一段html内容 2.1 代码和运行结果 2.2 用beautiful 打开 本地 html 文件 2.2.1 本地html文件 2.2.2 soup1BeautifulSoup(html1,"lxml") 2.3 用reque…...

物联网Lora模块从入门到精通(九)Flash的读取与存储--结题

一、前言 这将是"物联网Lora模块从入门到精通"系列的最后一篇文章&#xff0c;相信各位同僚通过前面八篇文章的分享已经极好的掌握了Lora模块的编程&#xff0c;本文的Flash的读取与存储将是Lora模块开发的最后一块&#xff0c;感谢大家的陪伴与支持&#xff01; 希望…...

STM32MP157_PRO开发板的第一个驱动程序

文章目录 目的&#xff1a;为什么编译驱动程序之前要先编译内核&#xff1f;编译内核编译设备树编译安装内核模块编译内核模块安装内核模块到 Ubuntu 的NFS目录下备用 安装内核和模块到开发板上编译 led 驱动在开发板安装驱动模块下载驱动程序安装驱动模块 目的&#xff1a; 在…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...