传输层重点协议之【TCP协议】

news2024/9/22 17:35:48

1. TCP协议段格式

在这里插入图片描述

2. TCP原理

2.1 可靠性机制

2.1.1 确认应答

确认应答是实现可靠性的最核心机制
首先来看一个例子,下面是我和女神的对话~
在这里插入图片描述
所以为了解决上述问题呢,就需要针对消息进行编号!给发送的消息分配一个”序号“,同时应答报文,给出”确认序号“
在这里插入图片描述
在真实的TCP数据传输中也引入了 序号和 确认序号

TCP 将每个字节的数据都进行了编号。即为序列号

在这里插入图片描述
在这里插入图片描述

同时对TCP来说,自身也承担了这个整队的任务,TCP会有一个接收缓冲区(一个内核中的内存空间),每个 socket 都有一份自己的缓冲区。 TCP就可以按照序号针对收到的消息进行整队了。此时就可以确保应用程序读数据,读到的一定是有序的(和发送顺序一样)。

2.1.2 超时重传

网络中会出现一种非常典型的情况:丢包问题
为什么会丢包呢? 因为数据在传输过程中是受到网络的影响的,传输并不是直达的,而是会通过很多中转设备,而每个中转设备都是承担很多的转发任务,每个设备转发能力有限。如果在某一时刻,某个设备,上面的流量达到峰值,就可能引起部分数据被丢包~

发送方对于丢包的判定,是一定时间内,没有收到 ack 报文,分为两种情况:

  • 数据直接丢了,接收方没有收到,自然不会发 ack
  • 接收方收到数据,返回的 ack 丢了
    发送方是区分不了这两种情况的,都只能重传!
    在这里插入图片描述

TCP针对多个包丢失的情况,是继续超时重传,但是没丢包一次,超时等待时间就会增加(重传的频率降低),如果连续多次重传,都无法得到 ack,此时TCP就会尝试重置连接,如果重置连接也无效,TCP就会关闭连接。

如果一切顺利,使用确认应答保证可靠性;出现丢包,则使用超时重传作为补充~

2.1.3 连接管理

  • TCP建立连接(三次握手),存在的意义:验证了客户端和服务器,各自的发送能力和接收能力是否正常!在这里插入图片描述
  • TCP断开连接(四次挥手)在这里插入图片描述

2.2 效率机制

2.2.1 滑动窗口

在这里插入图片描述
在这里插入图片描述
但是在批量发送的过程中,如果出现了丢包该怎么办? 丢包分为两种情况

  • 情况1:数据报到达,ACK丢了在这里插入图片描述
  • 情况2:数据报直接丢了在这里插入图片描述上述重传过程中,没有任何冗余操作!丢了数据才会重传,不丢是不会重传的,整体比较快,这个重传过程也称为 快速重传

滑动窗口,快速重传,是在批量传输大量数据的时候,会采取的措施~
如果只传输一两条,少量的,低频的操作,就不会按滑动窗口这么搞了
仍然是前面朴素的确认应答和超时重传~

2.2.2 流量控制

滑动窗口,批量发送,窗口越大,相当于批量发送的数据越多,整体的速度就越快~ 但是并不是越快越好!
如果你发的太快,瞬间把接收方缓冲区给打满了,接下来的继续发送,此时数据就会丢包

通过流量控制,本质上就是让接收方来限制下发送方的速度,具体如何控制?
在这里插入图片描述
在这里插入图片描述
上述过程是把返回的窗口大小,当作实际的窗口,实践中可能会有所出入~
发送窗口大小 = 流量控制 + 拥塞控制

2.2.3 拥塞控制

上述中说到,滑动窗口的大小 = 流量控制 + 拥塞控制

流量控制:衡量了接收方的处理能力
拥塞控制:衡量了传输路径的处理能力
实际发送的窗口大小 = min(拥塞窗口,流量控制窗口)

在这里插入图片描述
拥塞控制做的事情,就是衡量中间节点的传输能力。拥塞控制,要衡量中间路径,中间路径上有多少个节点?每个节点当前的情况?甚至,每次传输,走的路径都不同。
通过实验的方式,找到一个合适的发送速率。 开始的时候按照一个小的速率发送,如果不丢包,可以提高下速率(扩大窗口大小);如果出现丢包,则立即把速率再调小,反复执行上述过程。

在这里插入图片描述

2.2.4 延时应答

我们知道TCP可靠性的核心,就是确认应答。但是ACK要发,并不是立即发送,而不是稍等一会再发。
在这里插入图片描述
延时应答的效果,就是通过这个延时,让接收方应用程序,趁机多消费点数据,此时反馈的窗口大小,就会更大一点。此时发送方的发送速率也能快一些(同时也能满足让接收方能够处理过来)

那么所有的包都可以延时应答? 答案不是

  • 数量限制:每隔N个包就延时应答一次
  • 时间限制:超过最大延迟时间就延时应答一次
    具体的数量和超时时间,依据操作系统不同也有差异;一般N取2,超时时间取200ms

2.2.5 捎带应答

捎带应答是基于延时应答的,由于客户端服务器之间的通信模型,通常是一问一答这种模式。
在这里插入图片描述为啥四次挥手,有可能是三次挥完?? 同理~ 捎带应答起到的效果!

3. 面向字节流

在这里插入图片描述

  • 可能会出现粘包问题,首先要明确 此处的 ”包“,是应用层的数据包
  • 在TCP的协议头中,没有如同UDP一样的”报文长度“这样的字段,但是有一个序号这样的字段
  • 站在传输层的角度,TCP是一个一个报文过来的,按照序号排好序放在缓冲区中
  • 站在应用层的角度,看到的只是一连串的字节数据
  • 那么应用层看到了一连串的字节数据,就不知道从哪个部分开始到哪个部分结束

那么如何解决粘包问题, 定义分隔符或者是约定长度

思考:对于UDP协议来说,是否也存在”粘包问题“呢?

  • 对于UDP,如果还没有向上层交付数据,UDP的报文长度仍然在。同时,UDP是一个一个把数据交给应用层,有很明确的边界。
  • 站在应用层的角度,使用UDP的时候,要么收到完整的报文,要不么收,不会出现”半个“的情况。

4. 异常情况

4.1 进程关闭/进程崩溃

进程没了,socket是文件,随之也会被关闭。 但是虽然进程没了,但是连接还在,仍然可以继续四次挥手

4.2 主机关机(正常流程关机)

  • 先杀死所有的用户进程,后续就是进程没了,socket是文件,随之也会被关闭。 但是虽然进程没了,但是连接还在,仍然可以继续四次挥手。
  • 如果挥完更好,如果没挥完。比如对方发的 FIN 过来,咱们没来得及ACK就关机了~ 此时对端就会重传FIN,发现都没有ACK,尝试重置连接,如果还不行,就直接释放连接!

4.3 主机断电(拔电源,迅速关机)

  • 对端是发送方:对方接收不到ACK => 超时重传 => 重置连接 => 释放连接
  • 对端是接收方:对方没法立即知道,你这边没来得及发送数据,还是直接没了
    • TCP内置了心跳包机制, 对端是接收方,会定期向发送方发一个心跳包,如果有及时的回应说明状态良好,否则就是挂了

4.4 网线断开

这个情况和主机断电是一样的~

5. 应用场景

  • TCP可靠传输,效率没那么高:绝大部分场景下,都可以使用TCP
  • UDP不可靠传输,效率高:对于效率要求比较高,但是可靠性没那么高的场景(同一个机房内部的内网之间的数据传输)

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

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

相关文章

【蓝桥杯省赛真题21】python二十四节气 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python二十四节气 一、题目要求 1、编程实现 2、输入输出 二、解题思路

SpringBoot整合ClickHouse

目录 1 ClickHouse准备操作2 使用jdbc方式操作ClickHouse3 SpringBoot的整合ClickHouse 1 ClickHouse准备操作 使用的JDBC方式操作clickhouseclickhouse与springboot的整合使用 提前创建一张表,并为该表插入一些实验数据 create table t_order01(id UInt32,sku_id…

卡片+递增三元组——蓝桥杯(JAVA解法)

1、卡片 题目链接:用户登录https://www.lanqiao.cn/problems/2383/learning/?page5&first_category_id1&sortstudents_count 问题描述 小蓝有 k 种卡片, 一个班有 n 位同学, 小蓝给每位同学发了两张卡片, 一 位同学的两张卡片可能是同一种, 也可能是不同…

xubuntu16.04下安装向日葵并设置开机自启

1.安装Sunlogin 下载 SunloginClient-11.0.1.44968-amd64.deb 解压后将SunloginClient-11.0.1.44968-amd64.deb拷贝到目标设备上,终端运行: dpkg -i SunloginClient-11.0.1.44968-amd64.deb进入到\usr/local/sunlogin/bin目录下,运行向日葵…

第一章 Maven概述

第一节 为什么要学习Maven? maven-作为依赖管理工具 ①jar 包的规模 随着我们使用越来越多的框架,或者框架封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里面用到上百个jar包是非常正常的。 比如下面的例子…

FreeRTOS 队列(二)

文章目录 一、向队列发送消息1. 函数原型(1)函数 xQueueOverwrite()(2)函数 xQueueGenericSend()(3)函数 xQueueSendFromISR()、xQueueSendToBackFromISR()、xQueueSendToFrontFromISR()(4&…

GIT的常见命令

前言: 在日常生活或者工作中,我们都会是不是用到Git,今天我就总结了一些Git常见命令。若有些木有的,可以使用git help 获取到git的常见命令,那我们接下来就从git help 中的介绍常见命令。 一:建立本地仓库…

TCP 与 bufferbloat

说到既能降低成本,又能降低时延,总觉得这在 pr,兜售自己或卖东西。毕竟哪有这么好的事,鱼与熊掌兼得。可事实上是人们对 buffer 的理解错了才导致了这种天上掉馅饼的事发生。 人们总觉得 buffer 越大越好,buffer 越大…

Maven安装教程以及修改下载镜像源等配置

第一步:下载maven(本教程安装的是3.8.4) 官方下载链接:Maven – Download Apache Maven Binary是可执行版本,已经编译好可以直接使用。 Source是源代码版本,需要自己编译成可执行软件才可使用。 我们选择…

【WSN定位】基于RSSI的加权质心定位算法【Matlab代码#14】

文章目录 1. 原始质心定位算法2. 基于RSSI的加权质心定位算法基本思想3. 基于RSSI的加权质心定位算法流程图4. 部分代码展示5. 运行结果展示6. 资源获取 1. 原始质心定位算法 可参考质心定位算法 2. 基于RSSI的加权质心定位算法基本思想 传统的质心算法在求解过程中只是将未…

Windows逆向安全(一)之基础知识(十六)

指针三 通过先前指针的学习,了解了指针和地址以及数据的关系,现在结合先前的知识继续学习巩固 指针遍历数组 有了先前的基础,再来看看如何用指针遍历数组 代码 #include "stdafx.h" void function(){short arr[5]{1,2,3,4,5};…

【ARM Coresight 4 - Rom Table 介紹】

文章目录 1.1 ROM Table1.1.1 Entry 寄存器 1.2 ROM Table 例子 1.1 ROM Table 在一个SoC中,有多个Coresight 组件,但是软件怎么去识别这些 Coresight 组件,去获取这些Coresight 组件的信息了?这个时候,就需要靠 Core…

COPU助力北大研究生开源公选课丨2023开源PostgreSQL内核开发通识课顺

COPU & Peking Univerisity 导读:2020年1月COPU(中国开源软件推进联盟)成员开会讨论面向高校的开源示范课程,由联盟副秘书长北京大学荆琦老师牵头筹备,并首先在北大软微学院试点。本次是中国PostgreSQL分会联合…

尚硅谷_宋红康_第14章_数据结构与集合源码

第14章_数据结构与集合源码 本章专题与脉络 1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bgDcr8wF-1682075329317)(images/image-20220412011531879.png)] **战场&#x…

本地白嫖AI绘画 ,Stable Diffusion 初探!

本文介绍我在本地搭建 Stable Diffusion Web UI 的体验过程,予以记录分享。 Stable Diffusion 是 2022 年 8 发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像,官方项目其实并不适合新手直接使用,好在有使用 Stable …

把握数字中国建设重大契机,实在智能携手山东商业职业技术学院共建“现代金融数字化实训中心”

今年2月,中共中央、国务院印发《数字中国建设整体布局规划》(以下简称《规划》),明确了数字中国建设的整体框架,强调全面提升数字中国建设的整体性、系统性、协同性,促进数字经济和实体经济深度融合。其中&…

本地部署Stable Diffusion Webui AI 记录

Stable Diffusion Webui AI本地部署基本分为两种方式: 1、使用大佬的打包好的安装包一键部署 b站秋葉aaaki 2、手动部署(个人实践记录)参考文章 本地部署基本要求 1、 需要拥有NVIDIA显卡,GTX1060 (或者同等算力的…

CopyOnWriteArrayList简介

1. 简介 CopyOnWriteArrayList 是 ArrayList 的线程安全版本 就是在进行写操作的时候会 copy 原数组,然后写完将指针指向新的数组,是一种读写分离的思想,可以并发的读,不能并发的写 优点: 保证线程安全读取时不加锁…

基于PyQt5的图形化界面开发——自制MQTT客户端软件

基于 PyQt5 的图形化界面开发——自制MQTT客户端 0. 前言1. 第三方库的安装及注意事项2. Editor.py2.1 配置界面效果演示: 3. Publish.py3.1 消息发布界面演示 4. Subcribe.py4.1 订阅消息效果演示: 界面切换——main.py5. 写在最后 0. 前言 使用 PyQt5…

葛兰一季度规模再度跌破900亿

一季度末管理规模再度跌破900亿元,中欧基金葛兰交出了公募主动权益基金管理规模的头把交椅。 4月22日零点刚过,葛兰在管基金悉数披露2023年一季报,从管理规模来看,一季度葛兰在管5只公募基金合计规模降至844.40亿元,较…