传输控制协议TCP

目录

TCP报文格式

TCP的特点

TCP原理:

1.确认应答机制

2.超时重传机制

3.连接管理机制

建立连接

​编辑关闭连接

4.滑动窗口机制

​5.流量控制

6.拥塞控制

7.延迟应答

8.捎带应答


TCP报文格式

1.源端口号:发送端的哪一个端口发出的

2.目的端口号:接收端的哪一个端口所接收

3.序号:每一个字节数据都进行了编号

 4.确认序号:通知发送端已接收的TCP信息

5.首部长度:TCP报头的长度总和

6.保留:空着,方便日后对TCP进行调整或升级

7.标志位(一个一位):

  • URG:紧急指针是否有效
  • ACK:确认字符表明信息接收无误
  • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
  • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
  • SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
  • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

8.窗口大小:窗口大小的信息(后面解释)

9.校验和:确认TCP信息传输是否正确

10.紧急指针:标识TCP信息中哪一部分数据是紧急数据

11.选项:可有可无,有就是对TCP报文进行一定的拓展.因为选项的存在,TCP的报头长度是不固定的.

TCP的特点

  1. 面向字节流:随意的读取数据,不像数据报一样规定发出的大小与读取的大小需要一致
  2. 拥有缓冲区:创建Socket时同时会在内核中分别创建一个发送缓冲区与接收缓冲区
  3. 全双工:既可以发送也可以接收
  4. 保活定时器:不定时的向对方发送一个包,检查连接是否还存在.如果不存在了,会自动释放掉连接

TCP原理:

1.确认应答机制

 A给B发送信息后,只有收到B相应的应答信息,才会继续发送下一条信息.

2.超时重传机制

情况一:

A发送信息后,可能会丢包.在一定时间没有收到B的应答信息后,A会重传上一条发送的信息. 

情况二:

A发送信息后,B的应答信息丢失了.在一定的时间后,A重传上一条信息.

此时B就会收到两条相同的信息.可以在B端的接收缓冲区中根据序列号对信息进行去重操作

3.连接管理机制

建立连接

根据前面的确认应答机制,A向B发起连接时需要分四步:

  1. A向B发送SYN请求建立连接
  2. B向A发送ACK表示确认收到信息
  3. B向A发送SYN请求建立连接
  4. A向B发送ACK表示确认收到信息

为了节省资源,可以发现第2步与第3步分别的发出对象与接受对象都是一致的且时间连续.

所以,第2步与第3步可以合并一齐发送.

就有了TCP建立连接中的三次握手.

TCP的三次握手操作,既可以确认连接双方的身份,也可以反映出连接双方的接受功能与发送功能是否正常,并在一定程度上对TCP传输的可靠性起到了辅助作用.

关闭连接

同样的,A向B关闭连接也是一共分为四步:

  1. A向B发送FIN表示即将关闭连接
  2. B向A发送ACK表示确认应答
  3. B向A发送FIN也表示即将关闭连接
  4. A再向B发送ACK表示确认应答

在A最后一次向B发送ACK后,才会分别真正的关闭连接,释放资源

以上就是TCP的四次挥手.

此处中的B不会把ACK与FIN合并成一条TCP发送给A.

因为两条语句之间可能会有一定的时间间隔.

这个if语句中的hasNext是接收到A端的FIN信息后判断的.

在break之后B会立即发送ACK.

至于什么时候发送FIN取决于编写的代码是如何运行的.

(代码来源于:[JAVAee]网络编程-套接字Socket_HY_PIGIE的博客-CSDN博客的TCP示例一中的服务器截取) 

4.滑动窗口机制

我们通过确认应答机制其实可以发现,其效率并不是非常高效.

发送信息后要等待对方发送确认应答后才能发送下一条,不然就要等待超时重传了.

于是,便有了滑动窗口机制.

滑动窗口机制是:

根据一定的大小,可以等待返回的AC发送后面的TCP信息

如下图:

在A发送1~1000后没有收到ACK也可以紧接着发送后两条TCP信息. 

在A收到了发送1~1000的ACK后,窗口会相应的向后移动一条TCP信息.

当然其中也会发送丢包的情况

情况一:

B端返回的ACK丢包.

像上图中,如果接收了1~1000,下一条为1001的ACK丢包了,但下一条1001~2000的ACK没有丢包.

A就可以通过1001~2000的ACK来确实1~1000已经被B接收到了.

(ACK的含义能够涵盖上面所有的ACK,所以之前的ACK丢包了也没有太大的影响)

情况二:

A发送的信息丢包.

A发送的1~1000丢包,并继续发送后面的TCP信息.

B端照常接收,但会申请1~1000的信息,当连续三次申请后.

A会重传1~1000的信息 

5.流量控制

接收端处理数据的速度是有限的。

如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制

(如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一
个窗口探测数据段,使接收端把窗口大小告诉发送端。)

6.拥塞控制

在网络上,计算机可能会进入拥塞状态.如果在拥塞状态下,TCP还使用滑动窗口增大效率的进行传输信息.会导致许多信息丢失,加重拥塞状态.

对此,TCP引入了慢启动.

开始先发少量的数据,对网络状态进行试探,并使用窗口对信息的发送进行了一定的限制.

初始,窗口大小为1,在发送M1并收到确认应答后.窗口的大小成倍的增加,发送方继续根据扩大后的窗口发送信息.

(图片来自《计算机网络》[第七版]谢希仁编著) 

虽然叫"慢启动",但他增加的速度是以指数形式增加的.到了后面速度会非常快.

这就不符合为了应对计算机拥塞状态的初心了.

于是,便有了一个阈值.在窗口大小达到这个阈值后,会以线性的方式递增.

拥塞控制主要作用是,在避免给网络造成太大压力的同时尽快传输信息的方案.

7.延迟应答

在接收端中的接收缓存区,加设内存空间为10.

一次收到了5大小的信息并返回ACK.

返回ACK后,接收端就会将缓存区的信息进行刷新.那缓存区还有额外5的空间就会一直没有被使用到,浪费了许多性能.

对此,TCO引入了一个延迟应答.

接收端接收一次信息,往缓存区中写入了5.且并没有立刻返回ACK.

而是,间隔一段时间后再返回ACK.在这段间隔的时间中,就可以接收第二次发送的信息,这时接收缓存区又写入了5.

再返回ACK的时候就可以一次性将10大小的缓存区全部刷掉

但也并不是每一条信息都会延迟应答.

  • 数量限制:每隔N个包就应答一次;(N一般为2)
  • 时间限制:超过最大延迟时间就应答一次
     

8.捎带应答

在延迟应答的基础上,我们发现,很多情况下,客户端服务器在应用层也是 "一发一收" 的.

在A发送了1~24后并向B申请1~5的信息.

B可以将确认1~24的ACK与发送1~5的信息合并成一个包发送.

总的来说,TCP这么多原理与属性.实现了其可靠性和帮助提升性能的为: 

可靠性:

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

提高性能:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter Notebook 500 : Internal Server Error

1. 这个问题的根本原因在于: pygments 包 版本过高。 安装pygments 2.6.1 2.jupyter版本如下 如果某个版本有冲突,卸载了重新安装一下就行。 安装命令: pip install pygments 2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 另外…

NanoPi NEO移植LVGL8.3.5到1.69寸ST7789V屏幕

移植前准备 移植好fbtft屏幕驱动 参考链接:友善之臂NanoPi NEO利用fbtft驱动点亮1.69寸ST7789V2屏幕 获取源码 名称地址描述lvglhttps://github.com/lvgl/lvgl.gitlvgl-8.3.5lv_drivershttps://github.com/lvgl/lv_drivers.gitlv_drivers-6.1.1 创建工程目录 创…

UGUI组件EventTrigger用法

一.Unity编辑器中EventTrigger组件用法 1.添加事件类型 2.绑定gameObject指定组件的方法 3.方法执行逻辑 public class NewBehaviourScript : MonoBehaviour {public void PointerDown(){Debug.Log("Trigger PointerDown");} } 4.按下鼠标,绑定方法成功…

Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 (1)创建自定义拦截器 (2)将自定义拦截器添加到系统配置中,并设置拦截的规则 1.4 练习:登录…

idea如何上传项目到github(超详细)

idea如何上传项目到github 1、IDEA配置2、项目上传到本地仓库2.1、创建本地git仓库2.2、Add操作2.3、Commit操作 3、项目上传到Github4、拿到登录Github的token 1、IDEA配置 File-Settings-VersionControl-Git Git的安装路径下bin目录下的git.exe可执行文件 可以直接点 Gene…

UVA-1601 万圣节后的早晨 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 以三个点的当前位置作为状态,广度优先遍历,找到终点即为最短次数。 注意: 一次可以移动多个点,但是每个点只能移动一步。在同一次中&#xf…

tomcat服务七层搭建动态页面查看

一个服务器多实例复制完成 配置tomcat多实例的环境变量 vim /etc/profile.d/tomcat.sh配置tomcat1和tomcat2的环境变量 进入tomcat1修改配置 测试通信端口是否正常 连接正常 toncat 2 配置修改 修改这三个 端口配置修改完成 修改tomcat1 shudown 分别把启动文件指向tomcat1…

Spring Cloud 面试突击2

Spring Cloud 面试突击2 高并发:是一种系统运行过程中遇到的短时间大量的请求操作 响应时间: 吞吐量: QPS:数据库为维度 TPS 并发用户数 并发的维度:很多的 并发是不是达到的当前系统的瓶颈 缓存 &#xff08…

2023牛客暑期多校训练营7

Beautiful Sequence 贪心,二进制,构造 Cyperation 模拟 ,数学 We Love Strings 分块,二进制枚举,二进制容斥dp Writing Books 签到 根据相邻两个异或值B,因为前小于等于后,故从高到低遍历B的每一…

实验二十六、RC桥式正弦波振荡电路参数选择

一、题目 电路如图1所示。利用 Multisim 分析下列问题: (1)选择合适的 R f R_f Rf​ 和稳压管,使电路产生正弦波振荡,并观察起振过程; (2)调整电路参数,使输出电压峰值…

CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104 Linux串口驱动使用教程

CH343 Linux串口驱动 ch343ser_linux 支持USB转串口芯片 ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104等 ,同时该驱动配合ch343_lib库还提供了芯片GPIO接口的读写功能,内部EEPROM的信息配置和读取功能等。 芯片型号串口数量GPIO数量CH342F/K2C…

CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别

协议的不同,数据读取困难,这是很多生产管理系统的难题。但是现在,捷米JM-CCLKIE-TCP通讯网关,让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中,连接到MODBUS-TCP总线…

cpu的架构

明天继续搞一下cache,还有后面的, 下面是cpu框架图 开始解释cpu 1.控制器 控制器又称为控制单元(Control Unit,简称CU),下面是控制器的组成 1.指令寄存器IR:是用来存放当前正在执行的的一条指令。当一条指令需要被执行时,先按…

模型性能的主要指标

主要参数 ROC 曲线和混淆矩阵都是用来评估分类模型性能的工具 ROC曲线(Receiver Operating Characteristic curve): ROC曲线描述了当阈值变化时,真正类率(True Positive Rate, TPR)和假正类率&#xff0…

Android Studio跳过Haxm打开模拟器

由于公司权限限制无法安装Haxm,这个时候我们可以试试Arm相关的镜像去跳过Haxm运行模拟器。解决方案:安装API27以下的Arm Image. #ifdef __x86_64__if (sarch "arm64" && apiLevel >28) {APANIC("Avds CPU Architecture %s i…

NPM与外部服务的集成(上)

目录 1、关于访问令牌 1.1 关于传统令牌 1.2 关于粒度访问令牌 2、创建和查看访问令牌 2.1 创建访问令牌 在网站上创建传统令牌 在网站上创建粒度访问令牌 使用CLI创建令牌 CIDR限制令牌错误 查看访问令牌 在网站上查看令牌 在CLI上查看令牌 令牌属性 1、关于访问令…

mysql数据库第十二课------mysql语句的拔高2------飞高高

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

【C++】开源:CGAL计算几何库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍CGAL计算几何库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…

【java】mybatis-plus代码生成

正常的代码生成这里就不介绍了。旨在记录实现如下功能: 分布式微服务环境下,生成的entity、dto、vo、feignClient等等api模块,需要和mapper、service、controller等等分在不同的目录生成。 为什么会出现这个需求? mybatis-plus&am…

【计算机视觉|生成对抗】用深度卷积生成对抗网络进行无监督表示学习(DCGAN)

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks 链接:[1511.06434] Unsupervised Representation Learning with Deep Conv…