【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粘包问题

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

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

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

相关文章

RocketMQ Learning(二)

目录 一、RocketMQ 1、顺序消息 2、延时消息 3、批量消息 批量切分发送 4、消息的过滤 Tag过滤 Sql过滤 5、分布式事务消息 6、Request-Reply消息 7、死信队列 一、RocketMQ 1、顺序消息 消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证…

STM32F429IGT6使用CubeMX配置外部中断按键

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、NVIC配置 PC13相同 5、生成工程配置 6、部分代码 中断回调函数 /* USER CODE BEGIN 0 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0){HAL_GPIO…

阿里云服务器部署Drupal网站教程基于CentOS系统

阿里云百科分享如何在CentOS 7操作系统的ECS实例上搭建Drupal电子商务网站。Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。它用于…

如何实现Excel中多级数据联动

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在类Excel表格应用中,常用的需求场景是根据单元格之间的数据联动&…

C++ STL list

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C之 STL list介绍和模拟实现 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;上次我们详细的介绍了vector&#xff0c;今天我们继续来介绍…

VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIOR

文章目录 VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIORABSTRACT1 INTRODUCTION2 COMPRESSION WITH VARIATIONAL MODELS3 INTRODUCTION OF A SCALE HYPERPRIOR 个人总结动机流程思路 VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIOR ABSTRACT We describe …

【BASH】回顾与知识点梳理(十七)

【BASH】回顾与知识点梳理 十七 十七. 什么是 Shell scripts17.1 干嘛学习 shell scripts自动化管理的重要依据追踪与管理系统的重要工作简单入侵检测功能连续指令单一化简易的数据处理跨平台支持与学习历程较短 17.2 第一支 script 的撰写与执行撰写第一支 script 17.3 撰写 s…

css flex 上下结构布局

display: flex; flex-flow: column; justify-content: space-between;

腾讯云服务器远程连接的方法大全

腾讯云服务器怎么连接登录&#xff1f;腾讯云服务器支持多种远程连接方法&#xff0c;可以使用腾讯云管理控制台自带的远程连接工具&#xff0c;也可以使用第三方远程连接工具&#xff0c;如如PuTTY、Xshell等&#xff0c;Linux操作系统可以SSH登录&#xff0c;Windows可以使用…

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…

Linux计算机名自动变为bogon,修改计算机名

Linux计算机名自动变为bogon&#xff0c;修改计算机名 问题&#xff1a;这次机房停电&#xff0c;部分VM计算机名自动变为bogon&#xff0c;判断故障&#xff1a;因开启VM的时候&#xff0c;网卡需要获取DNS&#xff0c;但是DNS服务器还没有起来&#xff0c;故自动在resolv.con…

innodb buffer pool

buffer pool是主存中的一个区域&#xff0c;InnoDB 在访问时缓存表和索引数据。缓冲池允许直接从内存访问频繁使用的数据&#xff0c;这加快了处理速度。在专用服务器上&#xff0c;高达80% 的物理内存通常分配给缓冲池。为了提高大容量读取操作的效率&#xff0c;将缓冲池划分…

npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to resolve dependency tree

拉取项目到本地 执行 npm install 报错 遇到这个问题首先确认的就是版本是不是太高了&#xff0c;降一下版本。或者通过yarn命令替代npm install命令安装&#xff0c;同理&#xff0c;启动也可以采用yarn dev 启动代替npm run dev 下面教大家用一个NVM工具&#xff0c;这个工…

IntellIJ Idea 连接数据库-MySql

前言&#xff1a;可以用mariaDB工具&#xff0c;在本地创建服务器主机和数据库&#xff0c;而后用intellIJ Idea尝试连接 MariaDB创建数据库练习 1.IntellIJ Idea打开界面右侧Database工具&#xff0c;选择MySQL数据库。 2.填写数据库账号密码&#xff0c;地址端口号&#xff…

Kafka:springboot集成kafka收发消息

kafka环境搭建参考Kafka&#xff1a;安装和配置_moreCalm的博客-CSDN博客 1、springboot中引入kafka依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…

无涯教程-Perl - print函数

描述 此函数将LIST中的表达式的值打印到当前的默认输出文件句柄或FILEHANDLE指定的句柄中。 如果设置,则$\变量将添加到LIST的末尾。 如果LIST为空,则打印$_中的值。 print接受一个值列表,列表中的每个元素都将被解释为一个表达式。 语法 以下是此函数的简单语法- print…

idea+gradle阅读spring5.2.9源码之源码构建报错解决方案

注意 1、先确保gradle版本和spring、jdk版本对应 本文:gradle:5.6.4/spring 5.2.9/jdk1.8&#xff08;gradle和jdk都要先安装好&#xff0c;gradle还要配置好本地资源文件路径&#xff09; 2、原来项目乱了的话&#xff0c;先重新导入下载的源码项目 3、进入源码所在根目录&…

AST入门与实战(三):if节点转switch节点(瑞数5)

原文地址:https://zhuoyue360.com/jsnx/110.html 1. 期望 这是一个瑞数5代解混淆的案例&#xff0c;我们本章节需要做的是把if节点的内容转换成switch-case内容.以此来熟悉AST对JS混淆的对抗. 原始代码: function whileState() {while (1) {aV cA[wU];if (aV < 4) {if (…

Xcode 基座打包

Xcode基座打包-APP更新版本内容无效 问题&#xff1a;解决&#xff1a; 问题&#xff1a; 使用xcode基座打包之后&#xff0c;上传到appstore进行提审发布。 用户在appstore商城进行更新下载&#xff0c;打开更新后的APP发现版本号是最新的&#xff0c;APP里面的其他内容还是上…

Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;文件写入&#x1f407;writeFile 异步写入&#x1f407;writeFileSync 同步写入&#x1f407;appendFile / appendFileSync 追加写入&#x1f407;createWriteStrea…