计算机网络---TCP的可靠传输机制和面向字节流传输

2023-05-16

在了解了TCP的面向连接传输之后我们讲解TCP的可靠传输相关的机制和面向字节流传输
一,TCP的可靠传输

  • 可靠应答机制
  • 超时重传机制
  • 报文中的序号和确认序号
    可靠应答机制
    就是在每次发送数据或者请求之后对方都要回复一个应答信号,告知信息已经完整的接收到了
    超时重传机制
    在一段发送数据给另一端之后,可能因为网络拥堵的原因或者其他原因数据无法到达另一端,在一定的时间没有收到对方的确认应答,就会进行重新发送
    报文中的序号和确认序号
    报文中的序号和确认序号是保证数据的正确性和有序性,在发送的数据中可能不是按照书序到达的,在序号和确认序号来及逆行排序就能进行重新按照正确的顺序进行排序。
    因为TCP为了实现可靠传输牺牲了部分常熟性能,并且有可能确认应答丢失就要重新传输数据,因此又提出几种机制来避免大量的丢包以及ACK丢失重传保证性能

滑动窗口机制
TCP通过双方协商窗口大小进行流量控制,避免因为缓冲区不够而导致丢包重传。通过协商,一次可以对多传输多条数据,之后然后等待确认应答,不需要一一停留。
在这里插入图片描述

  • 窗口大小指的是无需等待确认应答可以继续发送数据的最大值,上图中就是4000个字节(分为四次发送)
  • 发送前四个段的时候不需要等待任何的ACK,直接发送
  • 收到第一个ACK之后华东窗口向后移动,继续发送的五段的数据,一次类推
  • 操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来纪录当前还有那些数据没有应发,只有确认应答过的数据,才能从缓冲区中删除
    在这里插入图片描述
  • 窗口越大,则网络的吞吐率就越高
    16位的窗口大小,最多2^16字节。
    滑动窗口的快速重传机制
    (前提是每条数据的确认回复都必须按序回复),若前面的没有收到回复后面的不回发送ACK应答
  • 发送方:若收到一条回复,表示ACK确认回复的数据全部安全到达,不会因为前面数据的ACK丢失而重传数据
    在这里插入图片描述
    比如此时ACK丢失之后我们发送了ACK请求2001,表示2001以前的数据都已经接收到了。此时是不会重新传送的。
  • 接收方:若前面数据丢失,则接收方后发的数据以及发送重传请求,并且连发三次,若发送方连续收到三次重传请求,则认为数据丢失,进行重传。
  • 在这里插入图片描述
    加入1001-2000的数据丢失之后一段会连续发送上一次收到数据之后的ACK就是1001,连续发送三次,若还是没有收到数据就重新发送。

滑动窗口中的拥塞控制
虽然已经有了滑动窗口机制,但是如果在开始的时候就发送大量的数据,仍然可能造成问题,比如网络状态比较拥堵的时候,发送大量的数据仍然会导致大量数据的重传。
TCP引入了慢启动,快增长,
慢启动快增长就是先发少量的数据,探探路,摸清当前网络拥堵状态,再决定按照多大的速度传输数据,在增长中速度是指数级别的,但是包含了一个阈值,当月色窗口超过这个阈值的时候就不再按照指数方式增长,而是按照线性方式增长。
在这里插入图片描述
黑色的就是发送的数据,红色就是应答

  • 此处引入一个概念程为拥塞窗口
  • 发送开始的时候定义拥塞窗口大小为1
  • 每次收到一个ACK应答,窗口加1
  • 每次发送数据包的时候讲拥塞窗口和接收端主机反馈的窗口大小作比较,取较小值作为实际发送的窗口
    在这里插入图片描述

流量控制
接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送就会造成谍报,继而引起丢包重传等等一系列连锁反应。
因此TCP支持根据接受端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制

  • 接收端将自己饿可以接受的缓冲区大小放入TCP首部中的窗口大小中,通过ACK端通知发送端,
  • 窗口大小字段越大,说明网络的吞吐量越大
  • 接收端一旦发现字节的缓冲区块满了,就会将窗口大小设置成一个更小的值通知给发送端
  • 发送端接收到这个窗口之后,就会减慢自己的发送速度
  • 如果接收端缓冲区满了,就会将窗口置为0,这时候发送端不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

延迟应答机制
接收端收到数据后并不立即进行确认回复,而是等待一段时间,因为在这段延迟时间内,用户可以recv将缓冲区的数据取走,窗口就可能保证最大大小,保证传输吞吐量

捎带应答机制
接收方对每一个数据的确认回复都需要发送一个TCP数据包,当时空包头的传输会降低性能,因此会考虑在即将发送的数据包中发送一个ACK确认信息,这样就可以减少一个空包头的发送。

二,面向字节流传输
发送方每次调用send都会将数据发送到缓冲区中,然后内核选择合适时机发送数据
接收方:网卡接收到数据都会讲数据放到缓冲区,用户用recv从缓冲区中读取数据。
在这里插入图片描述
此时有三条数据共3000字节,可能我们每次发送1500字节,在接收缓冲区不recv的话也是3000字节,但是此时问题出来了,怎样去区分我们的数据的开始和末尾了,这时候就导致了粘包的问题。
粘包的问题主要出现在发送缓冲区和接收缓冲区的数据的堆积,主要是因为数据之间没有明显的边界,TCP只管传输数据的字节流,导致发送端接收端因为数据的堆积在实际发送或者recv的时候一次获取到半条或者多条数据。
解决办法:TCP没有数据边界,可以在应用层进行边界处理
常见的办法:在边界中设置特殊的字符间隔(比如HTTP协议中的/r/n)。或者定长数据长度进行发送。

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

计算机网络---TCP的可靠传输机制和面向字节流传输 的相关文章

  • STM32F103驱动LD3320语音识别模块

    STM32F103驱动LD3320语音识别模块 LD3320语音识别模块简介模块引脚定义STM32F103ZET6开发板与模块接线测试代码实验结果 LD3320语音识别模块简介 基于 LD3320 xff0c 可以在任何的电子产品中 xff
  • Arduino UNO驱动土壤湿度传感器检测

    Arduino UNO驱动土壤湿度传感器检测 简介运行要求Arduino UNO与传感器接线程序展示实践效果总结 简介 本次使用到是这个新款土壤湿度传感器 xff01 这款电容式土壤湿度传感器区别于市面上绝大部分的电阻式传感器 xff0c
  • ESP32使用TCP HTTP访问API接口JSON解析获取数据

    ESP32使用TCP HTTP访问API接口JSON解析获取数据 API接口代码解析获取时间代码烧录效果总结 API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据 xff0c 这里以ESP32联网获取时间信息作为获取API
  • 电池保护板 - 问题归纳

    电池保护板 问题归纳 简介充电锂电池磷酸铁锂电池 放电总结 最近更新日期 xff1a 2023 03 07 简介 电池充放电过程中 xff0c 如果电压 电流或温度等参数不稳定或超出电池的安全范围 xff0c 就会对电池造成损害 xff0c
  • Arduino驱动DS1302显示时钟

    Arduino驱动DS1302显示时钟 前言电气参数经典应用电路接线程序实验结果 前言 目前有许多流行的串行时钟电路 xff0c 例如 DS1302 xff0c DS3231 xff0c DS1307 xff0c PCF8485 等 它们由
  • 计算机网络---应用层以及HTTP协议

    网络层是程序员接触最多的一个层级 xff0c 应用层是层级体系中的最上层的一级 xff0c 是我们做逻辑处理最多的 应用层的功能什么是urlhttp协议 应用层的功能 是程序员写的一个一个解决的实际的问题都是在应用层 xff0c 是做逻辑运
  • 51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信

    51驱动NRF24L01通信 xff0c NRF24L01与TTL转NRF24L01模块通信 NRF24L01一 简介二 引脚功能描述 程序设计一 对 24L01 的程序编程的基本思路如下 xff1a 二 Tx 与 Rx 的配置过程1 Tx
  • 51单片机驱动K型热电偶 OLED0.96显示

    51单片机驱动K型热电偶 OLED0 96显示 一 基本参数二 接线三 部分代码引脚定义时序对用代码 四 实验现象五 注意事项 一 基本参数 二 接线 K型热电偶 MAX6675 模块引脚说明GNDGND接地 单独供电需要与MCU共地VCC
  • 基于ESP32做低功耗墨水屏时钟

    基于ESP32做低功耗墨水屏时钟 电子墨水屏概述 ESP32实验低功耗电子时钟功能描述接线开发实验结果 电子墨水屏 概述 电子墨水是一种革新信息显示的新方法和技术 和传统纸差异是电子墨水在通电时改变颜色 xff0c 并且可以显示变化的图象
  • STC89C52制作可程控低频信号发生器

    STC89C52制作可程控低频信号发生器 准备工作操作流程关于PCF8591实现构思 相关代码定时器相关代码串口控制频率和LCD显示函数 相关功能现象总结 准备工作 由于51单片机本身并不自带DAC的功能 xff0c 因此需要借助外置模块实
  • Arduino UNO驱动 Si3531A三通道时钟信号发生器

    Arduino UNO驱动 Si3531A三通道时钟信号发生器 Si3531A模块简介模块引脚定义Arduino UNO与模块接线测试代码实验结果 Si3531A模块简介 Si3531A是一个IIC接口可编程时钟信号频率发生器 xff0c
  • Arduino驱动HC-SR04超声波测距

    Arduino驱动HC SR04超声波测距 前言电气参数基本工作原理时序图接线程序实验结果总结 前言 HC SR04超声波测距模块可提供2cm 400cm的非接触式距离感测功能 xff0c 测距精度可达3mm xff0c 包括发射器 接收器
  • stm32f103c8t6新建环境+点灯

    stm32f103c8t6新建环境 43 点灯 简介步骤一 新建文件二 建立启动 43 用户端本身文件三 mdk内部设置四 实现基础工作效果五 点灯 总结 简介 STM32F103C8T6是一款由意法半导体公司 xff08 ST xff09
  • ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)

    ESP32驱动1 28寸GC9A01播放视频 xff08 一 视频分辨率的调整和视频格式的转换 xff09 播放前准备转换视频分辨率用FFmpeg将 MP4转换为 mjpeg格式FFmpeg的win10环境搭建FFmpeg的下载环境变量的搭
  • Arduino UNO驱动micro SD卡读写模块

    目录 一 简介二 使用前准备三 测试方法四 实验现象 一 简介 Micro SD卡模块TF卡读写卡器板载电平转换电路 xff0c 即接口电平可为5V或3 3V xff0c 支持支持Micro SD卡 2G Micro SDHC高速卡 32G
  • ESP32驱动1.28寸GC9A01播放视频(二、程序说明和效果展示)

    ESP32驱动1 28寸GC9A01播放视频 xff08 二 程序下载和效果展示 xff09 1 28寸GC9A01屏幕屏幕引脚定义 程序说明程序更改1 Arduino DataBus bus和Arduino GC9A01 gfx要改成ES
  • 计算机网络---传输层的udp协议

    首先我们认识要在应用层对数据封装之后需要传输到传输层进行封装 xff0c 但是在应用层只是对数据进行了处理 xff0c 所以在传输层上需要对传输到那个进程进行设置 xff0c 所以在传输层需要对port进行设置 所以port是标志一个进程
  • c++中 ->,c++中::

    gt gt 用于指针 gt 用于指向结构体的指针 gt 用于指向结构体的指针 xff0c 表示结构体内的元素 include lt stdio h gt struct role 定义一个结构体 char name 8 姓名 int leve
  • U8W/U8W-Mini使用与常见问题解决

    U8W U8W Mini使用与常见问题解决 U8WU8W U8W mini简介准备工作U8W U8W mini在线联机下载U8W U8W mini脱机下载第一步 xff0c 把程序下载到U8W U8W mini烧录器中 xff1a 第二步
  • Arduino 驱动GP2Y1014AU检测PM2.5

    Arduino 驱动GP2Y1014AU检测PM2 5 一 基本参数二 接线三 部分代码引脚定义对应代码 四 实验现象五 注意事项 一 基本参数 二 接线 三 部分代码 引脚定义 define measurePin span class t

随机推荐

  • STM32F103ZET6驱动TOF250激光测距传感器

    STM32驱动TOF250激光测距传感器 TOF250介绍I2C通讯协议I2C寄存器地址 TOF250引脚说明和STM32的接线和STM32的接线 程序实验结果总结 TOF250介绍 TOF250是一款基于TOF原理的单点测距雷达 xff0
  • STM32驱动SG90舵机

    STM32驱动SG90舵机 关于SG90舵机SG90转动角度与占空比的关系驱动SG90舵机代码 确定控制引脚 写代码 SG90舵机正常驱动现象总结 关于SG90舵机 SG90是一种小型伺服电机 xff0c 通常用于模型制作和小型机械应用中
  • Arduino驱动L298N控制直流电机的正反转和调速

    Arduino驱动L298N控制直流电机的正反转和调速 一 前言二 产品参数三 驱动直流电机三 接线图四 程序五 实验结果总结 一 前言 本模块使用ST公司的L298N作为主驱动芯片 xff0c 具有驱动能力强 xff0c 发热量低 xff
  • Livox MID-70连接及使用

    ROS下载安装 本文选用ros xff0c 未使用ros2 在Ubuntu18 04下配置ros 下载安装参考 xff1a Ubuntu18 04安装 ROS桌面完整版 其中注意在第8部分 span class token function
  • 微信小程序 宠物论坛1

    微信小程序宠物论坛1 一个简单的论坛包括以下几个方面 xff1a 登录模块发帖模块首页模块帖子详情模块搜索模块个人主页模块 下面将从这6个方面介绍如何用微信小程序开发一个简单的论坛 登录模块 先看界面图 打开小程序首先看到这个界面 xff0
  • 微信小程序宠物论坛6

    微信小程序宠物论坛6 个人主页页面 JS部分 const db 61 wx cloud database Page data openid 34 34 nickname 34 34 heads 34 34 onLoad function o
  • 激光SLAM从理论到实践学习——第三节(传感器数据处理2:激光雷达运动畸变的去除)

    传感器数据处理2 xff1a 激光雷达运动畸变的去除 激光雷达运动畸变的去除比里程计标定更重要 xff0c 但也取决于用的雷达型号 我用的思岚A2雷达频率小于10Hz xff0c 畸变也是比较明显的 概念介绍 激光雷达传感器介绍 xff08
  • Ubuntu16.04 ROS环境中RealSense D435i安装使用

    Ubuntu16 04 ROS环境中RealSense D435i安装使用 弄了三四天 xff0c 网上说法很多 xff0c 有的说需要编译内核 xff0c 然而编译内核下载的补丁特别慢 xff0c 有的说catkin make的需要加其它
  • 计算机网络---传输层(tcp协议,三次握手,四次挥手)

    tcp报头三次握手四次挥手状态改变WIME WAIT状态相关的问题 tcp协议是面向连接 xff0c 可靠传输 xff0c 面向字节流的传输层协议 xff0c 首先我们认识一下tcp的协议报头 源 目的端口 xff1a 表示数据是从哪个进程
  • C++中 对》和《的重载

    在 C 43 43 中 xff0c 左移运算符 lt lt 可以和 cout 一起用于输出 xff0c 因此也常被称为 流插入运算符 或者 输出运算符 实际上 xff0c lt lt 本来没有这样的功能 xff0c 之所以能和 cout 一
  • 深入理解 http 反向代理(nginx)

    要理解什么是 反向代理 reverse proxy 自然你得先知道什么是 正向代理 forward proxy 另外需要说的是 一般提到反向代理 通常是指 http 反向代理 但反向代理的范围可以更大 比如 tcp 反向代理 在这里 不打算
  • 面试必问的红黑树,从根源上探究红黑树的本质

    前言 本文主要讲解下面试经常会问到的红黑树 xff0c 看看究竟是什么神仙鬼怪 二叉树 满足以下两个条件的树就是二叉树 xff1a 本身是有序树 xff08 若将树中每个结点的各子树看成是从左到右有次序的 即不能互换 xff0c 则称该树为
  • C++后台开发面试题总结(涉及C++基础、多线程多进程、网络编程等)

    C 43 43 后台开发面试题总结 涉及C 43 43 基础知识 多线程多进程 TCP IP网络编程 Linux操作 数据结构与算法 因巩固知识体系 xff0c 面试 xff0c 梳理以往看到过的知识点 xff0c 故总结如下相关题目 xf
  • 实战项目:手把手带你实现一个高并发内存池

    项目介绍 1 这个项目做的是什么 xff1f 当前项目是实现一个高并发的内存池 xff0c 他的原型是google的一个开源项目tcmalloc xff0c tcmalloc全称Thread Caching Malloc xff0c 即线程
  • HTTP keep-alive和TCP keepalive的区别,你了解吗?

    1 从文中找出我的IP 2 http请求中是客服端还是服务端主动关闭的tcp连接 xff1f 请阅读到最后的彩蛋部分 HTTP和TCP都是老生常谈的知识点 xff0c 本文不进行铺开赘述 我们可能在HTTP和TCP中都听说 长连接 的说法
  • Linux下各种锁的理解和使用及总结解决epoll惊群问题(面试常考)

    一 锁 锁出现的原因 临界资源是什么 多线程执行流所共享的资源 锁的作用是什么 可以做原子操作 在多线程中针对临界资源的互斥访问 保证一个时刻只有一个线程可以持有锁对于临界资源做修改操作 任何一个线程如果需要修改 xff0c 向临界资源做写
  • 一个10年C++程序员对技术和业务的感悟,献给还在迷茫中的你

    我越来越担心我作为一个C 43 43 程序员的未来 恍然间 xff0c 发现自己在这个行业里已经摸爬滚打了十年了 xff0c 原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了 xff0c 但是今年在换工作的
  • 大专程序员毕业五年税后18K,想进BAT,网友:吃shi都赶不上热的

    现在很多互联网公司招聘程序员 xff0c 招聘要求上面都明确需要本科 xff0c 并且985 211优先 现在有很多中专大专的程序员很优秀很积极 网友一 xff1a 女生 xff0c 92年 xff0c 毕业四年 xff0c 坐标深圳 xf
  • “天才少年” 27岁华为副总裁 百度CTO 成为阶下囚的传奇经历

    今天的主角是李一男 xff0c 也许你未曾听过他的名字 xff0c 但他却有金光闪闪的履历 毕业于华中科大少年班 xff0c 最年轻的华为副总裁 xff0c 百度CTO xff0c 12580CEO xff0c 金沙江创投合伙人 xff0c
  • 计算机网络---TCP的可靠传输机制和面向字节流传输

    在了解了TCP的面向连接传输之后我们讲解TCP的可靠传输相关的机制和面向字节流传输 一 xff0c TCP的可靠传输 可靠应答机制超时重传机制报文中的序号和确认序号 可靠应答机制 就是在每次发送数据或者请求之后对方都要回复一个应答信号 xf