【Linux】TCP协议简介

news2024/12/27 13:58:59

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.coloradmin.cn/o/868487.html

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

相关文章

阿里云Windows服务器安装部署MySQL数据库流程

阿里云百科分享如何在Windows系统ECS实例上手动部署MySQL数据库。 目录 前提条件 操作步骤 前提条件 使用本教程进行操作前,请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册。操作系统:Windows Server 2012准备一台ECS云服务…

JDK、JRE、JVM:揭秘Java的关键三者关系

文章目录 JDK:Java开发工具包JRE:Java运行环境JVM:Java虚拟机关系概述 案例示例:Hello World结语 在Java世界中,你可能经常听到JDK、JRE和JVM这几个概念,它们分别代表了Java开发工具包、Java运行环境和Java…

计算机丢失msvcr71.dll解决办法,总结三个常见的解决方法

修复msvcr71.dll文件的过程中,我对系统动态链接库文件的重要性有了更深入的了解。这个文件对于许多使用Visual C编译的软件来说是必不可少的,缺失或损坏可能导致软件无法正常运行。因此,当遇到类似问题时,及时解决并修复这个文件是…

页面文件太小,无法完成操作。

1、右键“我的电脑”,选择“属性”; 2、点击“高级系统设置”; 3、点击“高级”,再点击“设置”; 4、选择“高级”,选择“程序”,点击“更改”; 5、 不要勾选“自动管理所有驱动器…

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏)

前言 Java也是测试必知必会的内容,特别是现在类似spring boot 等Java框架更是成为主流。之前实现的图书增删改查是用Python实现的,没看过的请移步:Flaskmysql 实现增删改查接口开发测试(图文教程附源码),本…

教你如何使用AES对接口参数进行加密

教你如何使用AES对接口参数进行加密 前言 我们作为程序猿,在浏览网站的时候偶尔也会打开控制台看看请求的接口,我们会发现有些接口的传输是 “乱码” ,那么这个乱码究竟是什么呢?为什么要这么做? 其实这个所谓的 “…

无涯教程-Perl - qq函数

描述 可以使用此函数代替双引号。这实际上不是一个函数,更像是一个运算符,但是如果您在其他程序员的程序中看到它却不记得它是什么,那么可能会在这里看。实际上,您可以使用任何一组定界符,而不仅仅是括号。 语法 以下是此函数的简单语法- qq ( string )返回值 该函数返回双…

De Bruijin序列与魔术(三)——De Bruijin序列的拓展思考

早点关注我,精彩不错过! 在前面的文章中,我们已经介绍完经典DeBruijin序列的原理和魔术,相关内容请戳: De Bruijin序列与魔术(二)——魔术《De Bruijin序列》 De Bruijin序列与魔术(…

Chord diagram | 啧啧啧!~人人必会的Chord diagram你不来学一学吗!?

1写在前面 啊啊啊啊啊!!!!~终于值完夜班休息了。😭 最近是大搞医疗反腐的日子,㊗️各位执法人员成绩满满!~🤒 听说以后医务人员要年薪制了,完全搞不懂这些东西的初衷和理…

七夕好物分享,哪些礼物适合送男/女朋友?这几款好物最为合适!

七夕是个值得纪念的日子,牛郎织女鹊桥相会的故事百年流传,七夕是一个表达爱意的节日,送礼物是必不可少的,情侣们可以选择一份有意义的礼物,也可以选择对方需要的东西当做礼物来赠送,总的来说,送…

STM32F429IGT6使用CubeMX配置按键检测

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、生成工程配置 5、部分代码 /* USER CODE BEGIN 0 */ //按键检测函数 void KEY_Test(void) {if(SET HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)){while(SET HAL_GPIO_ReadPin(…

HCIP 链路聚合技术

1、链路聚合概述 为了保证网络的稳定性,仅仅是设备进行备份还不够,我们需要针对我们的链路进行备份,同时也增加了链路的利用率,提高带宽。避免一条链路出现故障,导致网络无法正常通信。这就可以使用链路聚合技术。 以…

PyTorch翻译官网教程-NLP FROM SCRATCH: GENERATING NAMES WITH A CHARACTER-LEVEL RNN

官网链接 NLP From Scratch: Generating Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用字符级RNN生成名字 这是我们关于“NLP From Scratch”的三篇教程中的第二篇。在第一个教程中</intermediate/char_rnn_classification_tutor…

走进知识图谱(二)【世界知识图谱篇】知识表示的经典模型与平移模型及基于复杂关系建模的知识表示学习

上篇文章提到&#xff0c;该系列文章将主要围绕世界知识图谱和语言知识图谱这两大类知识图谱进行展开&#xff0c;并且提到知识图谱的主要研究包括了知识表示学习、知识自动获取和知识的推理与应用三大部分。今天主要介绍世界知识图谱的知识表示学习&#xff0c;其中包括经典的…

netty基础与原理

Netty线程模型和Reactor模式 简介&#xff1a;reactor模式 和 Netty线程模型 设计模式——Reactor模式&#xff08;反应器设计模式&#xff09;&#xff0c;是一种基于 事件驱动的设计模式&#xff0c;在事件驱动的应用中&#xff0c;将一个或多个客户的 服务请求分离&#x…

跑步运动耳机哪个牌子好、跑步运动耳机推荐

随着生活质量的提高&#xff0c;运动健身已经成为一种新的潮流&#xff0c;而跑步更是如今众多人参与的热门运动项目之一。在谈到跑步时&#xff0c;很多人习惯性地戴上耳机&#xff0c;在奔跑的过程中播放自己喜欢的音乐&#xff0c;以免运动变得枯燥&#xff0c;并增添一些轻…

开工大吉|华润鞋业二期自动化改造项目开工典礼圆满举行

2023年8月10日上午&#xff0c;山东百华鞋业有限公司择良辰吉时隆重举行了华润鞋业二期厂房动工仪式&#xff0c;公司总经理郭兴梅女士携公司管理层代表和施工单位代表参加了动工仪式。 根据公司发展规划&#xff0c;对未来发展的美好期许&#xff0c;以及公司生产与研发保持的…

从 Zebec Protocol 长期布局看,ZBC 通证的潜在应用场景

流支付协议 Zebec Protocol 在去年被推出以来&#xff0c;始终保持着较为迅猛的市场进展&#xff0c;与此同时其还基于 ZBC 构建了全新的治理体系&#xff0c;并上线了以 ZBC 资产为核心的治理系统&#xff0c;让生态逐渐走向 DAO。

题目大解析(3)

题目 字符串中的第一个唯一字符 字符串中的第一个唯一字符 原题链接&#xff1a;字符串中的第一个唯一字符 计数法&#xff1a; class Solution { public:int firstUniqChar(string s) {int arr[130] {0};for(auto x : s){arr[x-0];}int i 0;for(auto x : s){if(arr[x-0] …

《算法竞赛·快冲300题》每日一题:“造电梯”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 造…