面试官:说说TCP如何实现可靠传输

news2024/11/30 2:46:58

今天来讲一下TCP是如何保证可靠传输的。这也是面试常问的一个题目,这个问题不单止能看出你是否真的了解TCP原理,更看出你是否有一个总结的能力。

我们从三个部分来讲TCP是如何实现可靠传输的。

滑动窗口

首先是讲TCP中的滑动窗口,它和TCP的可靠传输息息相关。TCP的滑动窗口是以字节为单位的,假设现在发送端收到了接收端发送过来的确认报文段,其中窗口值给予的是14字节,确认号为36(表明接收端期望收到下一个序号是36,35为止的数据都已经收到了)。根据接收端的确认报文段,发送方可以维护自己的发送窗口(注意前沿和后沿的位置!!!

 发送端可以连续把窗口内的数据都发送出去,发送出去后,如果没有收到确认,那么都必须暂时的保留,便于在超时重传(后面会讲到)时使用。假设接收端接收到了39-49序号,但是36没有收到,那么滑动窗口就不会向前移动,而是等到后沿的字节被确认接收到后,那么滑动窗口才会开始移动

发送窗口越大,发送方就可以在接收方确认之前连续发送更多的数据,因而可能获得更高的传输效率。发送窗口后沿后面的部分表示已经发送并且已经确认收到,所以这些数据显然不需要了;发送窗口前沿的部分表示不允许发送,因为接收方没有为这部分数据保留存放的缓存空间。

滑动窗口的大小由前沿和后沿共同决定,发送窗口的后沿变化情况有两种:前移和不动

发送窗口的后沿是不可能向后移动的,因为不能撤销掉已经确认的数据前移代表接收到了靠近后沿处的数据,所以滑窗向前移,不移动代表还没有收到后沿数据新的确认

发送窗口的前沿有三种情况,前移,保持不动,后移。前移好理解,可能是确认报文段顺带的窗口信息告诉发送方,窗口变大了,或者是收到了后沿处的ACK,都会往前移动。保持不动分为两种情况,一种是没有收到新的确认,接收端发送的窗口信息也不改变;第二种是收到了新的确认,但是对方通知的窗口缩小,所以滑窗前沿会保持不变。滑窗的前沿也有可能向后收缩,这发生在没有收到新的字节确认报文段(发送方和接收方还是有交互,只是没有ack没有更新,还是之前的值),并且窗口缩小了。TCP强烈不赞成这样做,因为可能导致某些问题

TCP规定接收方必须有积累确认的能力,这样可以减少传输的开销。接收方可以在适合的时候去发送确认,或者在自己有数据要发送的时候顺带去发送确认信息。但是接收方不能过分的推迟发送确认,否则会导致发送方不必要的重传,浪费网络资源。TCP规定确认推迟的时间不应该超过0.5秒。如果接收方收到了一连串具有最大长度的报文段,那么每隔一个报文段就要发送一个确认。

因为TCP的通信是全双工的,所以在通信的每一方都有发送和接收窗口

 相关视频推荐

支撑互联网的基石 tcp/ip,5个方面全面解析

网络原理tcp/udp,网络编程epoll/reactor,面试中正经“八股文”

100行代码开启自己的协议栈,《tcp/ip详解》的代码注解|

学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

 

超时重传时间

第二点是讲超时的重传时间,之前我们讲到过,TCP发送方如果在规定的时间内没有收到确认报文就要重传已发送的报文段。这个重传概念说起来是很简单,但是重传时间的选择可以说是TCP中最复杂的问题之一

TCP的下一层是IP层,发送的IP数据报可能经过高速率网络,也可能经过低速率网络每个数据报选择的路由可能不一样,如果把超时重传时间设置的太短,会引起不必要的重传,增大网络负荷;如果把超时时间设置的过长降低了传输效率,使得网络空闲时间增大。

 TCP采用了一种自适应算法,它会去记录一个报文段发出的时间,以及收到确认的时间,这两个时间的差即报文段往返时间RTT(Round-Trip Time),同时TCP会去保留RTT的加权平均往返时间RTT[S]。第一次测量时,RTT[s] = RTT,随后每次测量到一个新的RTT样本,就会按照下面的公式重新计算一次RTT[s]。

新的RTT[s] = (1 - α) x (旧RTT[s]) + α x (新RTT)

上面的表达式α是[0, 1)的,如果α接近于0,那么表示新的RTT样本对RTT[s]影响不大,如果α接近于1,那么新的RTT样本对RTT[s]影响较大。建议标准推荐将α设置为1/8,即0.125

所以说超时计时器设置的超时重传时间RTO(RetransmissionTime-Out)要略微的大于加权平均往返时间RTT[s]。

RTO=RTT[s] + 4 x RTT[d]

RTT[d]是RTT的偏差的加权平均值,大家可以做个了解:

新的RTT[d] = (1-β) x (旧RTT[D]) + β x |RTT[s] - 新RTT样本|

β推荐为1/4,即0.25。

现在来考虑这么一个问题,假设发送方发出了一个报文段,设定的重传时间到了没有收到确认报文,于是重传了报文段,经过了一段时间后,收到了确认报文段。那么这个确认报文段是对第一次发送的报文段的确认呢,还是对第二次发送的报文段确认呢?而这个的判断就会影响到当前的RTT,导致影响RTT[s]偏大或者偏小

根据这种情况,Karn提出,如果报文段重传了,那么我们就不去记录它的往返时间样本,这样得出来的RTT[s]和RTO就会比较的准确。

但是这也会引发一个新的问题,如果报文段的时延突然增大了很多,在原来设置的重传时间内没有收到确认报文,那么就重传报文段,但因为对重传的数据不做样本,所以超时重传时间不会更新

所以对Karn的算法做修正,每超时重传一次,就会将RTO增大些,一般是取旧时间的2倍,当不再发生报文段重传的时候,再通过之前的公式去计算,使得计算结果更加合理。

确认SACK

第三点是确认SACK,很多人可能不了解这个。我来举一个场景,当主机A和主机B在交互,此时此刻,主机A充当发送端,主机B充当接收端。

 接收端接收到了主机A发送过来的数据字节流,但是目前接收到的是不连续的序号,最前方的我们叫做连续的字节块1-500第一个字节块与连续的字节块之间还有序号为501-100没有收到,第一个字节块与第二个字节块中间有1501-2000序号没有收到。

因为TCP的机制,确认报文段中的ACK位 = 1,ack字段为501,是接收端期望收到发送端下一个数据序号501。虽然它收到了1001-1500的数据字节,但是TCP机制只会让它告诉给发送端,最接近窗口后沿处未收到的字节序号

那么这个时候,如果发送方发现接收方ack = 501,就知道501之前的数据接收成功了,500之后的数据没有收到,就会重新发送数据,所以第一个字节块的内容可能重复的去发送了。那么怎么去解决这个问题呢

TCP首部中有一个选项字段,这个字段最大为40个字节通信的双方在事先需要商定好允许使用SACK选项,这样的话,在选项中,我们可以传递收到不连续的字节块信息。因为一个序号需要占用4个字节,指明你收到一个字节块的范围需要用到8个字节来表示,因为需要把左右边界告诉给发送方,正常来说是可以传输5个字节块信息,因为5 x 8 = 40字节,但是由于需要用1个字节来指明SACK选项,一个字节说明这个选项要占用几个字节,所以只能传输4个字节块的信息

这一块可以做了解,因为大多数的实现还是重传所有没有被确认的数据块。好啦,本期TCP如何实现可靠传输就说到这里啦。

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

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

相关文章

基本的Dos命令

基本的Dos命令 打开CMD的方式 开始系统命令提示符win键R输入cmd (推荐使用)在任意的文件夹下,按住Shift键鼠标右击,打开命令行窗口在资源管理器地址栏路径前面加 “cmd ”管理员运行方式:命令提示符右键以管理员身份运行(最高权…

动态规划--01背包问题详解

代码随想录day42和day43 动态规划 模块01背包问题 “即使到不了远方,心中也要有远方的模样。” 文章目录1. 01背包理论基础1.1什么是背包问题1.2二维dp数组01背包1.3一维dp数组(滚动数组)01背包2.leetcode 416.分割等和子集2.1 详细思路及思考难点2.2具体步骤及代码…

当食品制造业遇见数字化工具,如何借助S2B2C电商系统实现企业新增长

食品制造业是我国产业发展中的重要组成部分,具有点多、面广、投资小、见效快的特点,在经济发展中发挥着重要作用。根据工信部数据统计,从2018至2021年我国食品制造业经营规模稳步增长,2021年我国食品制造业营业收入达21268.1亿元&…

QT·移植Qt到ARM平台及搭建Qt交叉编译环境

目录 一、编译tslib库 二、移植 tslib 到文件系统 三、编译Qt源码(用于移植到ARM) 四、移植Qt到文件系统 五、搭建 Qt Creator 交叉编译环境 六、获得Qt可执行文件的另一种方法 要想在ARM平台上运行Qt程序,得满足以下两个点:1、…

【表达式求值】

目录:前言一、有效的括号(一)题目分析(二)整体代码二、表达式求值(一)题目分析1.栈的基本操作:2. 大体思路:3.具体计算过程:(二)整体代…

【代码随想录】二刷-哈希表

哈希表 《代码随想录》 哈希表一般用来快速查找某个元素是否在一个集合中。如果使用枚举的话时间复杂度为O(n),而使用哈希表只O(1)就可以做到。——元素查询。 242.有效的字母异位词 使用unordered_map // 时间复杂度 O(n) // 空间复杂度 O(n) class Solution { pub…

嵌入式分享合集94

一、单片机硬件电路设计 减少后级电源对前级的影响,防止电源正负接反烧坏后级电路,防止电源关电时电流倒灌,但经过二极管有0.4V左右压降,需要考虑经过0.4V降压后会不会低于后级电路的正常工作电压。 一、按键电路 R1上拉电阻&…

用C语言开发入门游戏FlappyBird

前言 《flappy bird》是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红。2014年2月,《Flappy Bird》被开发者本人从苹果及谷歌应用商店撤下。2014年8月份正式回归APP Store&#xf…

java从零开始系统性学习完整笔记(一)

java从零开始系统性学习完整超全资源笔记(还在更新中) 前言 资源来自:王汉远java基础, B站视频: https://www.bilibili.com/video/BV1b4411g7bj/?spm_id_from333.1007.top_right_bar_window_custom_collection.content.click&a…

渗透测试之分享常用工具、插件和脚本(干货)

BRUP插件: 漏洞挖掘插件:Autorize、CSRF Token Tracker、XSS Validator、Turbo Intruder 辅助插件:HaE、sqlmap4brup、hackbar、Software Vulnerability Scanner 浏览器插件: wappalyzer、MySSL、Cookie Editor 脚本: …

Vue学习:vue生命周期

Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。生命周期又称为生命周期回调函数&#…

水果叠叠乐

水果叠叠乐 介绍 消消乐是一款益智类小游戏,最近比较火爆的一种是立体叠叠乐式的,然后小蓝也想开发一个自己练练手,给它起名叫“水果叠叠乐”。 准备 本题已经内置了初始代码,打开实验环境,目录结构如下&#xff1…

OSPF高级配置——学习OSPF路由协议的高级应用

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.路由重分发及配置 1.路由重分发概述 2.理解路由重分发 3.路…

【HMS Core】华为分析SDK如何申请数据导出功能?

1、问题描述 项目中集成了华为分析SDK,现在有一个需求,想要申请数据导出功能,申请页面提示数据导出功能目前仅对部分邀请伙伴开放,需要通过在线提单的方式申请开通此功能,那么具体该如何操作呢? 2、解决方…

校园跑腿微信小程序,校园跑腿小程序,微信小程序跑腿系统毕设作品

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHPMySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。 意义…

C++ Reference: Standard C++ Library reference: C Library: cwchar: wcstoll

C官网参考链接&#xff1a;https://cplusplus.com/reference/cwchar/wcstoll/ 函数 <cwchar> wcstoll long long int strtoll (const wchar_t* str, wchar_t** endptr, int base); 将宽字符串转换为long long整数 解析C宽字符串str&#xff0c;将其内容解释为指定base的…

高级FPGA设计结构实现和优化_(六)静态时序分析

高级FPGA设计结构实现和优化_静态时序分析标准分析锁存器组合反馈标准分析 静态时序分析(STA)指的是在一个设计中与一组约束有关的所有时序路径的综合性分析&#xff0c;为了确定一个设计是否是“时序一致的”。由FPGA设计者遇到的基本路径是输入到触发器、触发器到触发器、触发…

MySQL进阶一 一条select语句的执行流程

文章目录前言MySQL的执行流程第一步&#xff1a;连接器第二步&#xff1a;查询缓存第三步&#xff1a;解析SQL第四步&#xff1a;执行 SQL预处理器优化器执行器主键索引查询全表扫描索引下推总结前言 有一位同志问我为什么很久没更新了&#xff0c;因为前一个礼拜在复盘JavaSE…

【详解】手撕 一维、二维、三维差分数组原理(附图解,模板,例题分析)

【差分专题】 引言 ​ 差分是一种处理数据巧妙而简单的方法&#xff0c;可以应用于区间修改和询问问题。例如&#xff0c;将给定的数据集合 A 分成很多区间&#xff0c;并对这些区间进行很多次操作&#xff0c;每次都是对某段区间内的所有元素做相同的加减操作&#xff0c;此…

YOLOv7学习笔记(一)——概述+环境+训练

一、环境安装测试 1、创建环境conda create -n yolo python3.7conda activate yolo2、安装pytorchconda install pytorch torchvision cudatoolkit11.3 -c pytorch11.3为cuda版本号3、克隆yolov5git clone https://github.com/WongKinYiu/yolov7 # clonecd yolov7pip install…