TCP协议原理三

news2024/9/24 6:11:32

在这里插入图片描述

文章目录

  • 七、延时应答
  • 八、捎带应答
  • 九、面向字节流
    • 粘包问题
  • 十、TCP异常情况
  • 总结

七、延时应答

如果说滑动窗口的关键是让窗口大一些,传输速度就快一些。那么延时应答就是在接收方能够处理的前提下,尽可能把ack返回的窗口大小尽可能大一些。
如果在接受数据后立即返回ack应答报文,这时候返回的窗口大小比较小。

假设我们接收端的缓冲区大小为64kb,收到了32kb的数据,如果立即应答,返回的窗口大小就是32kb.
但实际上我们接收端处理数据的速度很快,10ms内就将这32kb的数据处理掉了,这种情况下,接收端处理还没有达到自己的极限,这时我们将窗口放大一些,也是可以处理过来的。
如果我们接收端稍等一会在应答,比如等待200ms后,这时候返回的ack窗口大小就是64kb。

所有的包都可以延时应答吗?
不是。

  1. 数量限制:每隔N个包就应答一次
  2. 时间限制:超过最大延迟时间就应答一次
    这里的数量和时间不同操作系统有差异,一般超时时间取200ms,N取2
    在这里插入图片描述
    我们可以发现延时应答的方式下,在滑动窗口下并不是每条ack都返回,这里是隔1条发一条。在这等待的时间里,接收方的程序就能把缓冲区的数据处理一波,ack返回的窗口大小就更大了。

八、捎带应答

大多数情况,客户端服务器是"一收一发"的,比如客户端给服务器说了“what’s your name?" ,服务器回回一个"fine, zd"。在我们延时应答的基础上,我们ack就可以一次性将"fine, zd"发给客户端。
在这里插入图片描述
这两个响应是处于不同时机的,但是我们TCP存在延时应答,我们就可以让业务数据响应和ack一起发给客户端A
在这里插入图片描述
大家需要注意这里和TCP三次握手的区别,TCP三次握手本身就是相同时机,所以一定会合并的。而我们这里是处于不同时机的,只是在延时应答机制下,可能会成为同一时机,所以是有机会合并的。

九、面向字节流

我们在创建一个TCP的时候会在内核中创建一个发送缓冲区接收缓冲区

我们在调用write时首先数据回写入到发送缓冲区中,如果发送字节数的太短就先在缓冲区里等待,等到缓冲区长度差不多了,或者其他时机发出来。如果发送的字节数太长就会拆分多个TCP数据包发出去。
接受数据的时候,从网卡驱动程序拿到内核的接收缓冲区,然后程序调用read去缓冲区拿数据。
我们TCP的连接也是有发送,接收缓冲区的,对于这一连接既可以读数据,也可以写数据,这也就是全双工

正是因为上述缓冲区的存在,我们TCP的读和写不需要一一匹配。
在这里插入图片描述
我们在读15字节数据时,不需要考虑数据时怎么写的,可以一次read15个字节,也可以一次read一个字节,读15次,这就导致我们一次性读到的数据,可能是半个应用层数据报,也可能是一个应用层数据报,也可能是多个应用层数据报
正是因为上述情况,会出现一个经典问题:粘包问题

粘包问题

首先大家需要明确,我们这里的包指的是应用层的数据包,因为站在应用层的角度,看到的只是一连串的字节数据,不知道从那部分到哪部分是一个完整的应用层数据包。
在这里插入图片描述
我们应用程序在调用read
如果read 3个字节,此时刚好读到 a b c,读到了一个完整的数据报
如果read 4个字节,此时读到a b c d,读到了一个半数据报
如果read 2个字节,此时读到a b,读到了半个数据报
在我们TCP层次,并没有socket api去告诉我们该读多少字节,完全靠我们程序员字节去负责。
那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界
1.约定好分隔符

//伪代码
while(true) {
   byte c = s.read();
   if(c == '分隔符') {
       bread;
    }
}   

我们之间在写网络通信的时候,使用println写数据就是为了加上这个分隔符。
2.约定好包的长度

byte[] lenBuffer = new byte[4096];
s.read(lenBuffer);
int len = parseInt(b);
byte[] dataBuffer = new bytep[len];
s.read(dataBuffer);

UDP协议,是否会出现粘包问题?
对于UDP来言,如果没有交付给应用层,那么UDP报文长度依然存在,UDP是一个一个将数据交付给应用层,有明确的数据边界,应用层要么收到完整的UDP报文,要么不收。

十、TCP异常情况

这里我们TCP异常分为两大类型
第一类:
进程挂掉了,主机关机了(我们手动关机).
这一类TCP异常,进程挂了,对应的PCB也就没了,对应文件描述符表也就释放了,相当于调用了socket.close(),然后内核会继续完成四次挥手。主机关机也是会杀掉进程然后才关机,和上述进程挂了是相同的过程,此时这些都是属于一个正常断开的流程。

第二类:
主机断电,网线掉网
大家需要注意这种情况,是无法进行四次挥手的。
如果是接收方出现异常,发送方在ack的时候,一直等不到,超时重传之后也收不到ack,如果重传几次后都没有应答,就会重置TCP连接,如果重置后仍然还不能收到ack,那么发送方就单方面放弃了。
如果是发送方出现异常,我们接收方发现没数据了,对方是正在发还是挂掉了,不管什么原因先等一会,但接收方需周期性的给发送方发送一个消息(心跳包 保活机制),确认对方是否在正常工作。

总结

我们TCP是十分负责的,因为不仅要保证可靠性,而且也要尽可能的提高性能
可靠性:

校验和
序列号(按序到达)
确认应答
超时重传
连接管理
流量控制
拥塞控制

提高性能:

滑动窗口
快速重传
延迟应答
捎带应答

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

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

相关文章

关于事务的理解

事务的概念 事务处理几乎是每一个信息系统中都会涉及到的问题,它存在的意义就是保证系统中的数据是正确的,不同数据间不会产生矛盾,也就是保证数据状态的一致性(Consistency)。 关于一致性,我们重点关注的…

MySQL —— 基本查询

文章目录1. 向表中插入数据2. 查询操作2.1 全列查询2.2 指定列查询2.3 查询字段带表达式2.4 为查询结果指定别名2.5 去重操作3. where 条件3.1 比较运算符和逻辑预算符的运用3.2 like的细节3. 3 null查询4. 对查询的结果进行排序4.1 对单一字段进行排序4.2 对多个字段排序4.3 对…

密码学基础概念

把一段原始数据通过某种算法处理成另外一种数据(原始数据为明文,处理后的数据为密文)。明文->密文:称之为加密。密文->明文:称之为解密。 在加密过程中我们需要知道下面的这些概念: 1)明文…

操作系统——10.进程通信

这篇文章我们来讲一下进程通信的相关内容 目录 1.概述 2.什么是进程通信 2.1进程通信——共享存储 2.2进程通信——管道通信 2.3进程通信——消息传递 3.小结 1.概述 首先,我们来看一下这节内容的大体框架 2.什么是进程通信 顾名思义,进程通信就是…

QML 鼠标事件

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 QML 中有一些元素本身是不具备交互能力的(例如:Rectangle、Text、Image 等),那么如何通过鼠标来控制它们的行为呢?这里就需要用到 MouseArea 元素了,它继承于 Item 且不可见,通常需要与可见元素结合使…

【vue2小知识】路由守卫的使用与解决RangeError: Maximum call stack size exceeded问题的报错。

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:当我们在路由跳转前与后我们可实现触发的操作 【前言】当我们在做类似于登录页面的时候&…

jmeter-如何在多线程一起执行时,控制请求的执行顺序【临界部分控制器】

前言:一个线程多个脚本的时候,发现只要100个用户同时执行,请求就会乱。期望2个线程执行结果:获取验证码-注册-登录这个流程获取验证码-注册-登录这个流程实际2个线程执行结果:a. 登录-获取验证码-注册b. 注册-获取验证…

运动无线蓝牙耳机哪款好、运动无线蓝牙耳机推荐

作为 运动爱好者,每天早晨醒来后的第一件事就去家门口的湿地公园跑上一圈。各种运动装备都齐了,不过在耳机选择上还真的犯难,打着“运动耳机”旗号的产品也是种类繁多,那么到底什么样的无线耳机更适合运动呢?于是我花时…

零基础入门网络安全,看这一篇就够了!

前景 很多零基础朋友开始将网络安全作为发展的大方向,的确,现如今网络安全已经成为了一个新的就业风口,不仅大学里开设相关学科,连市场上也开始大量招人。 那么网络安全到底前景如何?大致从市场规模、政策扶持、就业…

vxe-table 表格多选框回显

1.弹框表格结构 <a-modal v-if"visibleQuality" title"请选择需要提高的能力素质要求" :maskClosable"false" :visible"visibleQuality && switchStatus" ok"handleOkQuality" cancel"handleCancelQuality&…

【微信小程序-原生开发+TDesign】通用功能页封装——地点搜索(含腾讯地图开发key 的申请方法)

效果预览 核心技能点 调用腾讯地图官方的关键字地点搜索功能&#xff0c;详见官方文档 https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/methodGetsuggestion 完整代码实现 地点输入框 <t-input value"{{placeInfo.title}}" bindtap"searchPlace" dis…

华为OD机试模拟题 用 C++ 实现 - 端口合并(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明端口合并题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明

力扣299.猜数字游戏(java语言实现)

题目描述&#xff1a; 你在和朋友一起玩 猜数字&#xff08;Bulls and Cows&#xff09;游戏&#xff0c;该游戏规则如下&#xff1a; 写出一个秘密数字&#xff0c;并请朋友猜这个数字是多少。朋友每猜测一次&#xff0c;你就会给他一个包含下述信息的提示&#xff1a; 猜测…

JVM系统优化实践(5):什么时候GC以及有哪些GC

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;既然程序运行会产生大量的废弃物&#xff0c;也就是「垃圾」&#xff0c;那总不能一直堆着不管吧。现在就来粗浅地谈谈Java里面什么时候会触发GC以及有哪些GC。通…

NBA Top Shot 跌落神坛

近日&#xff0c;美国职业篮球联盟&#xff08;NBA&#xff09;授权的NFT 项目“NBA Top Shot Moments”被纽约法院初步裁定为“可能符合证券的定义”&#xff0c;虽然这不是对2021年用户指控该项目违法的最终判决&#xff0c;但这个裁定引发了市场担忧&#xff0c;部分NFT的地…

Java的运算操作

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【JavaSE_primary】 文章目录算术运算符增量运算符注意自增自减运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非&#xff01;…

直觉外科:手术机器人领域的领导者,未来还有巨大的增长空间

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 虽然直觉外科(ISRG)多年来一直在强劲的增长&#xff0c;但猛兽财经认为它未来仍有足够的空间进一步扩大收入和利润。虽然这个行业的竞争正在加剧&#xff0c;但猛兽财经认为从长远来看&#xff0c;这个市场可能会整合&…

如何修改JAR包内的代码

有时候由于找不到源码&#xff0c;只有一个jar包&#xff0c;但又想去修改jar包中的代码&#xff0c;就可以进行将jar包反编译后&#xff0c;修改&#xff0c;再重新编译的方式来实现。 一、下载反编译软件JD-GUI https://github.com/java-decompiler/jd-gui/releases 二、用…

Android 项目必备(四十二)-->Android 多窗口模式

简介 自由窗口模式: 该模式类似于常见的桌面操作系统&#xff0c; 应用界面的窗口可以自由的拖动和修改大小。 分屏模式 该模式可以在手机上使用&#xff0c; 该模式将屏幕一分为二&#xff0c; 同时显示两个应用界面。 画中画模式: 该模式主要用于TV&#xff0c; 在该模式下…

项目--基于RTSP协议的简易服务器开发(1)

RTSP协议简介&#xff1a;RTSP&#xff08;Real Time Streaming Prcotol&#xff09;是位于TCP\IP体系应用层的数据传输协议&#xff0c;通常的RTSP协议包含 RTSP、RTP、RTCP协议。一般而言&#xff1a;RTSP负责服务器与客户端之间的请求与响应RTP负责服务器、客户端之间传输媒…