【Linux】TCP协议简介

TCP协议简介

  • TCP协议格式
  • 面向连接
    • 1.连接管理机制
    • 2.包序管理
  • 可靠传输
    • 1.保证数据可靠到达对端
    • 2.保证数据的传输效率
  • 面向字节流
    • TCP粘包问题

TCP协议格式

在这里插入图片描述

16位源端口号和16位目的端口号:标识数据从哪个进程来,到哪个进程去;
32位序号:在包序管理中,发送消息方和接收消息方各自都维护了包的序号,要用包序来表示哪些数据包是收到的,哪些还未收到。
4位首部长度:表示TCP头部有多少个字节。
6位标志位:
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端立刻将数据从TCP缓冲区把数据读走
RST:对方要求重新建立连接
SYN:请求建立连接
FIN:通知对方,本端要关闭了
16位窗口大小:TCP有一个流量控制机制,对端会将自己的接收能力通过16位窗口大小告诉当前端,以便于当前端调整自己发送消息的流量大小
16位紧急指针:标识哪部分数据是紧急数据

面向连接

1.连接管理机制

  1. 三次握手
    下图是三次握手的详细流程图,左端为客户端,也就是发起连接方,右端为服务端
    在这里插入图片描述
    两次握手为什么不行?
    两次握手会导致服务端的状态不能从SYN_RCVD转换到ESTABLISHED状态,从而无法建立连接

  2. 四次挥手
    下图为四次挥手的详细流程图,左端为主动断开连接方,右端为被动断开连接方,双方发送的数据包名称和双方的状态
    在这里插入图片描述
    三次挥手可以吗?五次挥手可以吗?

三次挥手可以,但是很少见,三次挥手存在于被动断开连接时,没有数据要继续发送,此时利用捎带应答机制,将FIN和ACK一起发送给主动断开连接方,会变成三次挥手。但是大部分情况下,被动断开连接方很少在主动断开连接方发起断开时就完全没有消息要发送的了,所以三次挥手可以,但是可能性很小。

五次挥手可以,但是没有必要,因为四次挥手足以将双方完全断开,五次就显得多余了

2.包序管理

对于TCP协议格式中的32位序号和32位确认序号标识的是发送方和接收方各自维护的包序号,对于有数据的TCP包来说,会将每个字节都进行编号,这个编号就是包序号,(除了TCP协议头部之外的数据称为纯有效载荷)有应用层数据的包称为TCP数据包,没有应用层数据的称为TCP协议包,而纯的ACK协议包是不消耗序号的。

可靠传输

1.保证数据可靠到达对端

有两个机制:确认应答机制和超时重传机制

确认应答机制:
当A给B机器发送了1000字节的数据之后,B必须要给A回复1001,表示B已经接收到了A发送的1000个数据,这样就能确保数据是一定到达对端的。

超时重传机制:
当A给B发送了1000个字节,B迟迟不回复给A消息,表明可能A发送的消息已经丢失了,那么A就会重新给B发送消息,而这个超时时间是不固定的,它随着网络的情况和双方通信的情况而变化

2.保证数据的传输效率

保证数据传输效率可以从三个角度分析:
1.自身发送数据量
2.对方的接收能力
3.网络的转发能力

依据自身发送的数据量:滑动窗口机制
也就是说所有需要发送的数据如果为n个窗口大小,当前设置4位窗口,将当前四位窗口中的数据发送到网络中,暂时不用确认,只有收到较先的确认数据之后,窗口才能向后移动,这样就能在同一时刻发送多个数据,而提高发送的数据量,唯一的缺点是需要将窗口内的数据暂时维护起来。

在这里插入图片描述

依据对方的接收能力:有流量控制机制,延时应答机制,捎带应答机制

流量控制机制:TCP协议头部中有16位窗口大小,用于表示对方接收缓冲区的大小,当对方的接收能力强时,发送的数据就多,(收到的0表示0号窗口通告)当值为0表示对方接收缓冲区已满,就停止发送,直到接收方主动给发送发发送“窗口更新通知”或者发送方给接受方发送窗口探测数据包,探测接收方的接收能力。

延时应答机制:为了让接收方给发送方一个更大的窗口,会在向发送方应答时延时200ms,等待接收方将数据从缓冲区中读走,再向发送方应答。

捎带应答:当服务端给客户端发消息时,可以将上次向客户端确认的消息和此次需要发送的消息一起发送给客户端

依据网络的转发能力:拥塞控制

慢启动 机制:先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据;
在这里插入图片描述

面向字节流

创建一个TCP的socket, 同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区;
调用write,数据写入发送缓冲区,太长会被拆分,太短会在缓冲区内等待

TCP粘包问题

如果包长度是固定的,那么在应用层进行读取时,按照固定长度读取即可
如果包长度是不固定的,那么可以在每个数据包前定义一个字段记录当前数据包的长度,或者在每个数据包的尾部加上一个分隔符,用于标识到达了数据的尾部

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

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

相关文章

二叉树的讲解

💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大家三连关注&…

设计模式行为型——状态模式

目录 状态模式的定义 状态模式的实现 状态模式角色 状态模式类图 状态模式举例 状态模式代码实现 状态模式的特点 优点 缺点 使用场景 注意事项 实际应用 在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,把这种对…

windows环境下打印机无法打印的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

勘探开发人工智能技术:机器学习(1)

0 提纲 2.1 什么是机器学习 2.2 不确定性 2.3 数据类型 2.4 分类、回归、聚类 2.5 分类问题的训练与测试 2.6 性能评价指标 1 什么是机器学习 对于西瓜这个抽象类来说,它具有“色泽”,“根蒂”,“敲声”三个属性: 通过观察这个…

[SpringBoot3]基础篇

二、SpringBoot基础篇 2.1什么是SpringBoot SpringBoot是目前流行的微服务框架,倡导“约定优于配置”,其目的是用来简化新Spring应用的初始化搭建以及开发过程。SpringBoot提供了很多核心的功能,比如自动化配置starter(启动器&a…

微服务与Nacos概述-2

微服务间消息传递 微服务是一种软件开发架构,它将一个大型应用程序拆分为一系列小型、独立的服务。每个服务都可以独立开发、部署和扩展,并通过轻量级的通信机制进行交互。 应用开发 common模块中包含服务提供者和服务消费者共享的内容 provider模块是…

Ansible的安装和配置

安装和配置 Ansible 安装所需的软件包 创建名为 /home/greg/ansible/inventory 的静态清单文件,以满足以下要求: 172.25.250.9 是 dev 主机组的成员 172.25.250.10 是 test 主机组的成员 172.25.250.11 和 172.25.250.12 是 prod 主机组的成员 172.2…

闭环控制方法及其应用:优缺点、场景和未来发展

闭环控制是一种基本的控制方法,它通过对系统输出与期望值之间的误差进行反馈,从而调整系统输入,使系统输出更加接近期望值。闭环控制的主要目标是提高系统的稳定性、精确性和鲁棒性。在实际应用中,闭环控制有多种方法,…

深入浅出:MyBatis的使用方法及最佳实践

这里写目录标题 添加MyBatis框架⽀持配置连接字符串和MyBatis配置连接字符串配置 MyBatis 中的 XML 路径 添加业务代码创建数据库和表添加用户实体类添加 mapper 接⼝添加 UserMapper.xml添加 Service层添加 Controller层 增删改操作增加操作删除操作修改操作 添加MyBatis框架⽀…

无感部署 - 蓝绿部署、AB测试、灰度发布

蓝绿部署 蓝绿部署(Blue-Green Deployment)是一种软件发布和部署的策略,旨在实现无缝的应用程序升级和回滚。在蓝绿部署中,同时存在两个环境:一个是当前稳定的生产环境(蓝色环境),另…

Spring Cloud 智慧工地源码(PC端+移动端)项目平台、监管平台、大数据平台

智慧工地源码 智慧工地云平台源码 智慧建筑源码 “智慧工地”是利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术,彻底改变传统建筑施工现场参建各方现场管理的交互方式、工作方式和管理模式,实现对人、机、料、法、环的全方位实时监…

国产航顺HK32F030M: 基于NTC负温度系数的温度计

前言: 家里的一个儿童澡盆附带的温度计坏掉了,拆解后发现这东西做的真垃圾!索性自己做一个。拆下了里面的NTC热敏电阻,但是不知道NTC的性能参数,经过测量与查资料后,采用用中位值滤波 、 Steinhart-Hart方…

swagger 3.0 学习笔记

引入pom <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 import io.swagger.models.auth.In; import io.swagger.v3.oas.annotati…

三级城市展示省市区树

展示效果 数据库展示 业务代码 /*** 省市区树*/VLicenseApiOperation("查询经纬度")ApiImplicitParam(name "FnCity", value "省市区树", dataType "FnCity")GetMapping("/districtlist")public AjaxResult districtlist…

strlen和sizeof的区别

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C语言中的sizeof和strlen&#xff08;仅此一篇让你明白它们两的差别&#xff09;&#xff0c;如果大家觉得我写的不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 文章目录 strlensizeof 在…

Simulink仿真模块 -Scope

Scope模块的作用是显示仿真过程中生成的信号。它包含在以下库中: 库: Simulink / Commonly Used BlocksSimulink / SinksHDL Coder / Commonly Used BlocksHDL Coder / Sinks 如图所示: Simulink Scope 模块和 DSP System Toolbox™ Time Scope 模块显示时域信号。…

【APITable】教程:创建并运行一个自建小程序

1.进入APITable&#xff0c;在想要创建小程序的看板页面点击右上角的【小程序】&#xff0c;进入小程序编辑页面。 2.创建一个新的小程序区。 点击【 添加小程序】 点击创建小程序&#xff0c;选择模板&#xff0c;输入名字。 3.确定后进入小程序部署引导页面。 4.打开Xshell 7…

春秋云镜 CVE-2022-0410

春秋云镜 CVE-2022-0410 WordPress plugin The WP Visitor Statistics SQLI 靶标介绍 WordPress plugin The WP Visitor Statistics (Real Time Traffic) 5.6 之前存在SQL注入漏洞&#xff0c;该漏洞源于 refUrlDetails AJAX 不会清理和转义 id 参数。 登陆账户&#xff1a;u…

LeetCode 热题 100 JavaScript -- 74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …

D* 算法完全解析(应该是全网最详细的吧)

花了几天时间学习了下 D* 算法&#xff0c;只能说熟悉了一下流程&#xff0c;远不能说掌握&#xff0c;算法实在是非常巧妙 参考 《制造车间无人搬运系统调度方法研究》 《基于D*Lite算法的移动机器人路径规划研究》 人工智能: 自动寻路算法实现(四、D、D*算法) D* 算法 D*路径…