TCP如何实现可靠传输

2023-11-15

TCP的特点:面向字节流、面向连接、可靠传输
可靠传输的实现:
1.确认应答机制
:对收到的信息给发送方发送报文确认收到数据
2.超时重传机制:等待200ms没有收到接收方的确认应答则说明数据丢失,那么就要进行重新发送。
3.序号+确认号:告诉发送方自己接收到数据了,下次应该从哪里开始发。
4.序号+16位校验和:校验数据的正确性
但是TCP为了实现可靠传输做了一些不必要的牺牲,于是作为弥补,增加了一些机制:
1.滑动窗口,进行数据传送前进行协商,确定窗口大小,窗口大小的数据无需等待应答就只可以直接发送,每次进行固定大小数据的发送,发送到窗口最大值再进行确认回复,节省了每次发送数据确认回复。
2.快速重传机制:如果客户端收到服务器端发送来的三个冗余ack就说明数据包丢失(ack内容是服务器端收到数据的下一个序号,比如1000以后的数据丢了,就发送1001给客户端,并连续发送三次),客户端就可以立即将1001以后的数据发送给服务端。
冗余的ack还被用在拥塞控制中。
3.拥塞控制;以慢启动快增长的方式来调节窗口大小,防止网络出现问题,大量数据发送到缓冲区造成数据堆积的情况。少量丢包触发拥塞控制,大量丢包则认为是网络拥塞。
4.流量控制:通过控制协议字段中的窗口大小字段控制发送数据大小(发送数据的大小不能大于接收方缓冲区剩余的大小)
5.延迟应答机制,不是立即回复;如果接收方的主机在收到数据后立即回复,那么窗口就会变得很小,影响发送效率。一般是每隔两个数据包回复一次,超过最大延迟时间就停止一次。
6.捎带应答机制,每次确认回复发送一个数据包有点浪费,可以将确认回复和数据一起捎带着发送。

面向字节流:数据不会直接发送,而是放在一个缓冲区,操作系统选择一个合适的时机将数据以二进制数据串发送出去;接收方也可以选择一次性接收整条数据也可以选择一次接收一点点,多次接收。
但是会引起粘包问题:数据不是直接接收,而是放在缓冲区,那么接收方读取数据的时候就可能会把两条数据当做一条数据接收。
发生粘包问题主要是因为TCP在传输层,对数据的格式没有明确的划分。
解决方案:1、给数据定长,以规定大小发送和接收;变长数据,在应用层协议声明中声明数据长度
2、以特殊字符作为分隔符,但是发送和接收时要进行编码和解码。

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

TCP如何实现可靠传输 的相关文章

  • c++ 优先队列(priority_queue)

    优先队列的本质是堆 但它具有队列的所有操作特性 与普通队列不同的地方就是出队的时候按照优先级顺序出队 这个优先级即最大堆或最小堆的规则 即大的为top优先出队或小的为top优先出队 在队列的基础上加了个堆排序 以O log n 的效率查找一
  • Qt for iOS:将ipa安装包发布到App store

    终于到了这一步了 我希望你阅读这篇文章的时候 已经按照顺序阅读了我之前的文章 Qt for iOS 基础环境搭建 Qt for iOS 真机调试环境部署 Qt for iOS 申请发布证书 App配置文件 Qt for iOS 从Qt工程到
  • spring boot 项目开发常用目录结构

    在spring boot开发中一些常用的目录划分 一 代码层结构 根目录 net csdn 1 启动类 CsdnApplication java 推荐放在根目录net csdn包下 2 实体类 domain A net csdn domai

随机推荐

  • delphi操作png的单元pngimage.pas包括引用的ZlibExApi.pas和 PngLang.pas

    有需要的可以去这里下载源码 http download csdn net detail sushengmiyan 4662715 delphi操作png是在delphi2009版本之后 网上这么说的 于是乎 我找了源码来共享 希望对大家有帮
  • 【软件工程师学硬件】之 开关电源(4) —— 初识Viper12a

    Viper12a是一个很不错的电源芯片 至少我是这样认为的 当然了 肯定有很多其他的很好的电源芯片 我之所以以Viper12a为例 一方面是其电路简单 便于说明问题 其次它用得比较广 什么电磁炉 影碟机上面电源芯片大部分都是它 其三价格也比
  • 初识 python - 数组及其简单使用(一)

    目录 1 创建数组 2 数组的属性 3 数组的运算 4 查看数组 切片 5 特殊构建数组
  • 稳压芯片TPS54531的设计和分析

    2020 9 5补充 最终5 28V转3 3V的输出电路可以推算出来 输入的电压下限为4V R1为330K R2为160K 输出的电压为3 3V R5为10K R6为3 3K 输出的电流0 1A L1为47uH 根据相位增益进行补偿 C6为
  • 二叉排序树与平衡二叉树(BST&AVLT)

    平衡二叉树的一些操作 平衡二叉树相对于二叉排序树来说是二叉排序树的一个优化版 避免了二叉排序树中的极端情况 想更好的理解还是要结合图片自己动手做做QwQ 这里写的是双平衡 双旋转版 并非LL RR LR RL四种特殊情况单独处理 平衡二叉树
  • STM32速成笔记—中断

    文章目录 一 什么是中断 二 中断的相关概念 2 1 中断优先级 2 2 中断嵌套 2 3 中断服务函数 2 4 中断标志位 三 外部中断EXIT 四 中断程序配置 4 1 设置中断分组并使能中断 4 2 初始化EXIT 4 3 编写中断服
  • twinbasic开发浏览器edge webview2包装

    twinbasic开发浏览器edge webview2包装 QQ 2776478814 有需要写制浏览器控件 写爬虫 数据采集 自动输入的可以找我
  • 爬取嘉兴市人才网即时招聘信息并写入文本TXT完整案例

    上一次讲到爬取嘉兴市人才网即时招聘栏目输出每一页的标题链接 点此查看 这次接着上一次的内容把完整的爬虫代码讲解完 再次声明 代码仅供技术学习交流 不作其他用途 思路 接着上一篇文章 接下来就是循环遍历列表中的每一个url 这个url指的就是
  • 爬虫入门第10课:实现代理池的API模块

    爬虫学习知识点及案例篇 汇总 爬虫入门第1课 代理池概述及开发环境 爬虫入门第2课 代理池的设计 爬虫入门第3课 实现代理池思路 爬虫入门第4课 定义代理IP的数据模型类 爬虫入门第5课 实现代理池工具模块 爬虫入门第6课 实现代理池的校验
  • AtCoder Beginner Contest 203 Pond(二分+二维前缀和)

    样例输入 样例1 3 2 1 7 0 5 8 11 10 4 2 样例2 3 3 1 2 3 4 5 6 7 8 9 样例输出 样例1 4 样例2 5 据说这个题用对顶堆维护被卡了 先挂一手官方该题题解链接 大体思路 二分 将原矩阵根据二分
  • 企业和软件工程师外包公司合作有哪些好处呢

    互联网技术的快速发展和普及也加速了企业信息化进程步伐 目前很多企业在加快信息化建设过程中遇到软件人才资源配置问题 正面临如下困境 临时及灵活的用人需求 招聘团队对专业软件开发人员招聘困难 内部软件人力不足 没有招聘编制 软件技术人员用工及管
  • 简单的 C/C++ 项目自动化构建--Xmake

    Xmake 简介 https xmake io XMake是一个基于Lua的轻量级跨平台自动构建工具 支持在各种主流平台上构建项目 Xmake Build backend Project Generator Package Manager
  • k8s-1.25高可用部署

    文章目录 k8s 1 25高可用部署 亲测可用 1 安装要求 2 准备环境 3 所有master节点部署keepalived 3 1 安装相关包和keepalived 3 2配置master节点 3 3 启动和检查 4 部署haproxy
  • kvm CPU绑定与查询

    cpu绑定 格式 virsh vcpupin domain name vcpu hostcpu config live 例如 virsh vcpupin 16 3 15 config live 说明 将kvm虚拟机第4个vcpu与宿主机第1
  • 计算机网络分层结构—OSI参考模型、TCPI参考模型、五层体系结构

    计算机网络分层结构 5层体系结构是在参考 OSI参考模型 与 TCP IP参考模型 得出的 一 OSI七层模型 OSI七层协议模型包括 应用层 Application 表示层 Presentation 会话层 Session 传输层 Tra
  • C++ Primer Plus P31 编程练习(编写一个C++程序,它使用3个用户定义的函数(包括main),并生产以下输出)——中职

    C Primer Plus P31 编程练习 第三题 编写一个C 程序 它使用3个用户定义的函数 包括main 并生产以下输出 Three blind mice Three blind mice See how they run See h
  • STM32---内部FLASH

    FLASH 1 FLASH介绍 主存储器 分为4个16KB扇区 1个64KB扇区和7个128KB扇区 boot0 boot1都接GND时从0x08000000开始运行代码 系统存储器 器件在系统存储器自举模式下从该存储器启动 主要存放芯片的
  • Python学习中阶:面向对象程序设计

    终于到了面向对象的编程这部分 看完了基本数据类型 函数以及文件的操作 终于开始 面 向 对 象 的 编 程 啦 本部分主要涉及四部分 面向对象的编程 异常处理 进程和线程 重点主要是面向对象的编程 进程和线程 此外 本部分内容是以 Pyth
  • php sybase存储过,SYBASE存储过程详解

    SYBASE存储过程 一 存储过程简介 二 存储过程的创建 修改 删除 三 存储过程中的参数 返回值和变量 四 存储过程中的流程控制语言 五 存储过程中的事务 游标 六 ASE存储过程和IQ存储过程的常见区别 附例子 1 存储过程简介 存储
  • TCP如何实现可靠传输

    TCP的特点 面向字节流 面向连接 可靠传输 可靠传输的实现 1 确认应答机制 对收到的信息给发送方发送报文确认收到数据 2 超时重传机制 等待200ms没有收到接收方的确认应答则说明数据丢失 那么就要进行重新发送 3 序号 确认号 告诉发