TCP的相关性质

文章目录

  • 流量控制
  • 拥塞控制
    • 拥塞窗口
  • 延迟应答
  • 捎带应答
  • 面向字节流
  • 粘包问题
  • TCP的异常

流量控制

由于接收端处理数据的速度是有限的,如果发送端发的太快,那么接收端的缓冲区就可能会满。此时如果发送端还发数据,就会出现丢包现象,并且可能出现一系列连锁反应。

所以TCP支持根据接收端的处理能力去决定发送端的发送速度,这种机制就叫做流量控制

  1. 接收端会将自己的缓冲区大小,也就是报头中的窗口大小告知给发送端,发送端根据情况改变发送速度
  2. 窗口大小越大,说明网络的吞吐量就越高

拥塞控制

虽然TCP有滑动窗口这个机制可以高效可靠的发送大量数据,但是如果在刚开始的时候就发送了大量的数据就仍然可能出现问题

因此TCP在防止出现拥塞问题上加入了慢启动机制

顾名思义就是先发送少量的数据区探探路,摸清当前的网络拥堵情况,再决定应该按照多快的速度去传输数据

少量的丢包, TCP仅仅是触发超时重传; 大量的丢包, TCP就认为网络拥塞。

TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降.

所以拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案

拥塞窗口

此处就又引入一个概念—拥塞窗口

  1. 在通信开始前,拥塞窗口设为1
  2. 每收到一个ACK应答时,拥塞窗口加1
  3. 每次发送数据包时,都将拥塞窗口和报头中的窗口大小做比较,之后取较小的值作为实际发送的窗口大小

这样做就可以很符合慢启动机制,一开始的窗口大小就会呈指数型的增长,到后面就会慢下来呈线性增长,这种就相当于给了一个阈值,没超过这个值时就可以增长的快一点,一旦超过就慢下来

因此可以将这个阈值一开始启动时候就设为窗口大小的最大值,每次超过这个值那么TCP就会触发重发机制,这时候每一次触发重发都将这个阈值减少一半,同时拥塞窗口置为1

这样就可以很好的控制住拥塞

延迟应答

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。因为可能会出现应答一发出就有数据被读取了,那缓冲区就又大一点了,但是应答没有能够及时知道

又因为窗口越大,网络吞吐量就越大,传输效率就越高。最终的目标是在保证网络不拥塞的情况下尽量提高传输效率。因此就可以引入延迟应答的机制。

另外还有利用到TCP的应答机制原理,只要将该序号的数据应答回去,那么就说明该序号前的所有数据都已经收到了。所以延迟的时间就可以取在超时重发的时间前。

捎带应答

在很多情况下,两端主机都是一发一收的模式在通信,也就是说客户端给服务端发送数据,服务端也会回一个数据给客户端。那这个时候搭配着延迟应答,服务端可以在这段时间内将之前处理完的数据。等到服务端发送应答了,一并这数据带走发送,这样就可以省下一步,这就是捎带应答

面向字节流

TCP是以字节流的方式去读写的。

在创建TCP的套接字时,操作系统内核会同时创建一个发送缓冲区和一个接收缓冲区

  1. 调用write时, 数据会先写入发送缓冲区中;
  2. 如果发送的字节数太长, 会被拆分成多个TCP的数据包发出;
  3. 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去;接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区;
  4. 然后应用程序可以调用read从接收缓冲区拿数据;

另外TCP的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一个连接, 既可以读数据, 也可以写数据. 这个概念叫做 全双工

由于缓冲区的存在,TCP的读和写就不需要一一匹配了,只需要读写到指定的字节数就可以

粘包问题

因为字节流的原因,就可能会出现读取一个数据没读完或者读多了读了别的数据

因此为了解决这种粘包问题可以采用几种方案

  1. 定长读写,指定字节数
  2. 利用分隔符分隔数据
  3. 约定报头的位置,在报头里加上有效载荷的字节数

TCP的异常

  1. 进程终止:进程终止会释放文件描述符,仍然可以发送FIN和正常关闭没有什么区别。
  2. 机器重启:和进程终止的情况相同。
  3. 机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset(重置连接)。即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在,如果对方不在也会把连接释放

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

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

相关文章

轻量级自动化测试框架WebZ

一、什么是WebZ WebZ是我用Python写的“关键字驱动”的自动化测试框架,基于WebDriver。 设计该框架的初衷是:用自动化测试让测试人员从一些简单却重复的测试中解放出来。之所以用“关键字驱动”模式是因为我觉得这样能让测试人员(测试执行人员…

【Sklearn】基于线性判别法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于线性判别法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的模式识别和分类方法,它的目标是找到一个投影,将…

Linux系列讲解 —— FTP协议的应用

简单介绍一下FTP文件传输协议在linux系统中的应用。 目录 0. 基本概念1. FTP Server1.1 安装FTP Server1.2 FTP Server开启和关闭1.3 查看FTP Server是否开启1.4 FTP服务器配置 2. FTP Client2.1 lftp2.2 ftp2.3 sftp2.4 文件资源管理器集成的ftp和sftp 3. ftp常用命令 0. 基本…

IDE的下载和使用

IDE 文章目录 IDEJETBRAIN JETBRAIN 官网下载对应的ide 激活方式 dxm的电脑已经把这个脚本下载下来了,脚本是macjihuo 以后就不用买了

Neo4j之SET基础

在 Neo4j 中,SET 语句用于更新节点或关系的属性。它允许你修改节点或关系的属性值,可以单独使用,也可以与其他查询语句(如 MATCH、CREATE、MERGE 等)一起使用。以下是一些使用 SET 语句的常见例子,以及它们…

深入源码分析kubernetes informer机制(四)DeltaFIFO

[阅读指南] 这是该系列第四篇 基于kubernetes 1.27 stage版本 为了方便阅读,后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 client-go中的存储结构DeltaFIFOdelta索引 keyqueue push操作delta push 去重 queue pop操作 总结 client-go中的存储结构…

设计模式

本文主要介绍设计模式的主要设计原则和常用设计模式。 一、UML画图 1.类图 2.时序图 二、设计模式原则 1.单一职责原则 就是一个方法、一个类只做一件事; 2.开闭原则 就是软件的设计应该对拓展开放,对修改关闭,这在java中体现最明显的就…

什么是A股交易接口_(股票交易c接口)开发原理

A股交易接口是指用于与国内的证券交易所(上海证券交易所和深圳证券交易所)进行股票买卖交易的电子接口或软件系统。A股交易接口是金融机构、券商以及个人投资者的必备掌握操作技能之一,它提供了实时的股票行情、交易下单、撤单、查询账户信息…

基于Hadoop的表级监管

现状 大数据平台中,采用hadoop的方式存储数据,hdfs本质上是文件系统,而文件系统对数据的监管能力有限,但是数据安全领域问题日渐凸显,现目前,大数据平台一般以分层结构进行授权,但是对于一线开发人员而言,是能够接触到整个大数据平台中的所有表的,那么如何实现这样一…

yum install/update排除特定/某些包方式

1 什么是 yum? yum 代表 “Yellowdog Updater, Modified”。Yum 是用于 rpm 系统的自动更新程序和包安装/卸载器。 它在安装包时自动解决依赖关系。 2 什么是 rpm? rpm 代表 “Red Hat Package Manager”,它是一款用于 Red Hat 系统的功能…

PB:库管理函数

库管理函数 1、LibraryCreate() 功 能:创建一个空的PowerBuilder应用库,并可根据需要在创建应用库的同时添加库注解。 语 法:LibraryCreate ( libraryname{, comments } ) 参 数:libraryname:string类型,指定要创建应用库的名称,可以带上路径,不带路径时在当前目…

Docker本地镜像发布到阿里云

1. 本地镜像发布到阿里云 2. 镜像的生成方法 OPTIONS说明: -a :提交的镜像作者; -m :提交时的说明文字; 本次案例centosubuntu两个,当堂讲解一个,家庭作业一个,请大家务必动手,亲自实操。 docke…

Gradio部署应用到服务器不能正常访问

用Gradio部署一个基于ChatGLM-6B的应用,发布到团队的服务器上(局域网,公网不能访问),我将gradio应用发布到服务器的9001端口 import gradio as gr with gr.Blocks() as demo:......demo.queue().launch(server_port90…

ad+硬件每日学习十个知识点(34)23.8.14 (DCDC详细设计,续流二极管的选择,COMP引脚的环路设计)

文章目录 1.二极管的rrm电压和rms电压有什么不同2.DCDC续流二极管的选择3.充电电容4.COMP引脚的环路设计5.DCDC设计总结6.多路并联7.相位匹配8.工作模式9.低温输出偏离10.电源负载与效率11.降压升压模块 1.二极管的rrm电压和rms电压有什么不同 答: 二极管的 RRM &a…

redis主从复制、哨兵服务、持久化、数据类型

Top NSD DBA DAY10 案例1:配置主从复制案例2:配置带验证的主从复制案例3:哨兵服务案例4:使用RDB文件恢复数据案例5:AOF案例6:字符类型案例7:列表类型案例8:散列类型案例9&#xff…

Linux交叉编译opencv并移植ARM端

Linux交叉编译opencv并移植ARM端 - 知乎 一、安装交叉编译器 目标平台为arm7l,此为32位ARM架构,要安装合适的编译器 sudo apt install arm-linux-gnueabihf-gcc sudo apt install arm-linux-gnueabihf-g注意:64位ARM架构的编译器与32位ARM架…

【MyBatis】查询数据库

目录 一、什么是MyBatis 二、MyBatis框架的搭建 1、搭建MyBatis框架 2、设置MyBaits项目的配置 三、使用MyBatis完成数据库的操作 1、MyBatis程序中sql语句的即时执行和预编译 1.1、即时执行(${}) 1.2、预编译(#{}) 1.3、即…

tomcat设置PermSize

最近tomcat老是报错,查看了日志出现PermGen 内存不够用,重启tomcat后查询使用情况 通过启动参数发现没有设置 PermGen,继续通过jmap查看 jmap -heap 21179 发现99%已使用,而且默认是30.5M,太小了,这里设置成256M 1. 创建setenv.sh文件 在/usr/local/tomcat/bin目录下创建一个…

解锁编程的新契机:深入探讨Kotlin Symbol Processor (KSP)的编写

解锁编程的新契机:深入探讨Kotlin Symbol Processor (KSP)的编写 1. 引言 随着软件开发领域的不断发展,新的工具和技术不断涌现,以满足开发者在构建高效、可维护和创新性的代码方面的需求。Kotlin Symbol Processor(KSP&#xf…

从零开始,快速打造租车服务小程序的分享

随着移动互联网的发展,小程序成为了企业推广和服务的重要手段之一。租车服务行业也不例外,通过打造一款租车服务小程序,企业可以更好地与用户进行互动和交流,提供更方便快捷的租车服务。本文将介绍如何利用第三方制作平台/工具快速…