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

TCP协议原理三

在这里插入图片描述

文章目录

  • 七、延时应答
  • 八、捎带应答
  • 九、面向字节流
    • 粘包问题
  • 十、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是十分负责的,因为不仅要保证可靠性,而且也要尽可能的提高性能
可靠性:

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

提高性能:

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

相关文章:

TCP协议原理三

文章目录七、延时应答八、捎带应答九、面向字节流粘包问题十、TCP异常情况总结七、延时应答 如果说滑动窗口的关键是让窗口大一些,传输速度就快一些。那么延时应答就是在接收方能够处理的前提下,尽可能把ack返回的窗口大小尽可能大一些。 如果在接受数据…...

mac在命令行里获取root权限

1、为什么要获取root权限? 答:一些命令在正常状态下没有权限会报错,只有获取了root权限才能正常操作。 比如我们想修改一些系统的文件: vim /etc/shells 1 修改后保存,发现没权限,报错了。如下图&#xf…...

文献阅读 Improving Seismic Data Resolution with Deep Generative Networks

题目 Improving Seismic Data Resolution with Deep Generative Networks 使用深度生成网络提高地震数据分辨率 摘要 叠前数据的使用,通常可以来解决噪声迹线、覆盖间隙或不规则/不适当的迹线间距等问题。但叠前数据并不总是可用的。作为替代方案,叠后…...

mysql数据库之子查询练习

1、查询员工的姓名、年龄、职位、部门信息(隐式内连接)。 #emp、dept #连接条件:emp.dept_iddept.id select e.name,e.age,e.job,d.name from emp e,dept d where e.dept_idd.id; 2、查询年龄小于30岁的员工姓名、年龄、职位、部…...

西电计算机通信与网络(计网)简答题计算题核心考点汇总(期末真题+核心考点)

文章目录前言一、简答计算题真题概览二、网桥,交换机和路由器三、ARQ协议四、曼彻斯特编码和差分曼彻斯特编码五、CRC六、ARP协议七、LAN相关协议计算前言 主要针对西安电子科技大学《计算机通信与网络》的核心考点进行汇总,包含总共26章的核心简答。 【…...

【博学谷学习记录】超强总结,用心分享丨人工智能 Python基础 个人学习总结之列表排序

目录前言简述list.sort()语法返回值实例无参参数key参数reversesorted()语法返回值实例无参参数key参数reverseoperator.itemgetter功能简述实例List.sort与sored区别sorted原理:Timsort算法扩展list原理数据结构心得前言 经过一周的学习,对Python基础部…...

深度讲解React Props

一、props的介绍 当React遇到的元素是用户自定义的组件&#xff0c;它会将JSX属性作为单个对象传递给该组件&#xff0c;这个对象称之为“props”。 函数声明的组件&#xff0c;会接受一个props形参&#xff0c;获取属性传递的参数 function ComponentA(props) { return <…...

WebRTC现状以及多人视频通话分析

1.WebRTC 概述WebRTC&#xff08;网页实时通信技术&#xff09;是一系列为了建立端到端文本或者随机数据的规范&#xff0c;标准&#xff0c;API和概念的统称。这些对等端通常是由两个浏览器组成&#xff0c;但是WebRTC也可以被用于在客户端和服务器之间建立通信连接&#xff0…...

【Windows】Windows下wget的安装与环境变量配置

1 wget安装 GNU Wget常用于使用命令行下载网络资源&#xff08;包括但不限于文件、网页等&#xff09;。 GNU Wget官网&#xff1a;GNU Wget GNU Wget for Windows&#xff1a;GNU Wget for Windows 安装时首先下载主安装包&#xff1a;Complete package, except sources&…...

密码学基础概念

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

科技巨头争相入局,卫星通信领域将迎来怎样的发展?

近年来&#xff0c;全球卫星通信产业进入了一个高速发展的阶段 与卫星通信相关的新技术和新应用不断出现&#xff0c;成为了媒体报道的热点&#xff0c;也引起了公众的广泛关注。 尤其是刚刚过去的2022年&#xff0c;华为和苹果公司分别发布了搭载卫星通信技术的手机&#xf…...

银行软件测试面试题目总结,希望可以帮到你

目录 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、根据题目要求写出具体LINUX操作命令 1、分别写出一种…...

MySQL数据定义

系列文章目录前言创建数据库删除数据库修改数据库修改表结构修改表中列修改表中约束创建表删除表前言 创建数据库 创建数据库CREATE DATABASE 数据库名 使用数据库use 数据库名; MySQL数据库如何建表 删除数据库 删除数据库语句DROP DATABASE 数据库名 这条语句会删除数据…...

跨设备文件传输工具横评

文章目录对比QQ微信SnapDropLocalSendIntelUnisonLANDropTailscaleAirDroidSendAnywhere参考文献对比 传输速度测试条件大致相同&#xff0c;文件大小约为 100 MB 工具优点缺点传输速度备注QQ支持断点续传不要求同一局域网需要安装1.81 MB/s微信方便需要安装不支持大文件传完还…...

Oracle通过SQL找出ID不连续的位置

文章目录1 前言2 SQL3 结语1 前言 工作中要求我找到 ID 不连续的地方, 然后拿这个 ID , 给数据库里面 INSERT 一条数据. 比如: ID备注… 省略连续的部分232425就是想找到这里断开的地方, 下一个可以 INSERT 的 ID 就是 2674915751157512075122… 省略连续的部分 2 SQL 假设数据…...

学习一个Java项目

你想学习一个项目&#xff0c;一行一行去看代码 效率很低&#xff0c;看了就忘了 理清学习的思路 项目分为两部分&#xff1a;业务和代码 一、如何熟悉业务 1、看项目的文档&#xff08;需求概要文档、设计文档&#xff09; 2、同事/前辈言传身教 3、自己动手使用功能 …...

《数据库系统概论》学习笔记——第三章 关系数据库标准语言SQL

教材为数据库系统概论第五版&#xff08;王珊&#xff09; 最重量级的一章。从后续的学习&#xff0c;基本所有实验&#xff0c;大作业和考试都会涉及SQL&#xff0c;SQL实际上是有很多变化的&#xff0c;书上讲的只是最基本的&#xff08;做了大作业才知道SQL能有这么多变化&a…...

linux shell 入门学习笔记17 mysql脚本开发

开发mysql监控脚本 需要了解的命令&#xff1a; ss命令展示 xiao123xiao123:~/Downloads/shscripts$ ss -tunlp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 …...

产品新说 | 指标的异常检测怎么做,能更好配合业务变化(二)

前言&#xff1a;上期分享我们提到了指标异常检测实践要素中的三个方面&#xff1a;以面对业务变动为前提&#xff0c;确定业务波动是周期性还是非周期性&#xff0c;进而选对算法&#xff1b;通过确认业务的常规指标&#xff0c;确定异常方向进行监测&#xff08;上基带 / 下基…...

华为OD机试题,用 Java 解【最短耗时】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...