深入理解TCP网络协议(1)

目录

1.TCP协议的段格式

2.TCP原理

2.1确认应答

2.2超时重传

3.三次握手(重点)

4.四次挥手

1.TCP协议的段格式

我们先来观察一下TCP协议的段格式图解:

源/目的端口号:标识数据从哪个进程来,到哪个进程去

32位序号/32位确认号:TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收

4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP头部最大的长度是15*4=60 

6位标志位:

URG:紧急指针是否有效

ACK:确认号是否有效

PSH:提示接收端应用程序立刻从TCP缓冲区中把数据读走

RST:要求对方重新连接,我们把携带RST表示的称为复位报文段

SYN:请求建立连接,我们把携带SYN标识的称为同步报文段

FIN:通知对方,本端要关闭了.我们称携带FIN的叫结束报文段

16位校验和:发送端填充,CRC校验,如果接受端校验不通过,则认为数据有问题,这里的校验和不仅仅有TCP首部,也包含的有TCP数据部分

16位紧急指针:标识哪部分数据是紧急数据

40位头部选项和16位窗口大小;我会在后面的博客中详细介绍

2.TCP原理

TCP协议对于数据的管控主要有两个方面:安全和效率

在保证安全的时候,尽可能的提升效率

TCP是如何保证安全的呢,这就要涉及到我们的确认应答机制

2.1确认应答

我们用一张图来描述一下:

TCP协议对每个字节都进行了编号,有与之对应的序列号,当发送数据包到另一端以后,另一端就会确认应答发送应该数据包的最后一位+1,回馈给发送方,发送方下一次就以这个序列号为开始接着发.

2.2超时重传

在数据发送到接收方,没有得到及时响应的时候,就会触发超时重传机制.这也是TCP能保证安全的重要机制.

超时重传有以下两种情况:

1.数据发送给接收端的时候丢包

2.接收端确认应答的时候数据丢包,发送方不清楚数据是否到达,也会触发超时重传

这种情况,接收方会受到重复的数据,所以TCP协议会始别重复的包,并且把多余的给丢弃掉.

这时候我们就可以使用序列号来区分是不是相同的数据,很容易做到去重的效果.

那么这个超时重传的超时,具体时间如何确定呢?

如果时间太长的话,就会影响性能,而时间太短的话,极有可能会造成大量的重复包,造成资源浪费.

TCP协议为了兼顾到这两者,会动态的计算这个最大时间.

在Linux中(windows中也是如此),会以500ms为一个单位去控制,每次判定超时重传的时间都是这个数值的整数倍,如果依旧没有得到应答,就会在2*500ms的时间后再次重传,以此类推,每次都是上一次的两倍,但是如果时间过长又会发生什么呢?

答案是TCP会认为网络出现了问题,强制关闭连接.

3.三次握手(重点)

我们来深入理解,通过画图的方式来生动形象的的描述一下三次握手这个过程.

有的同学可能会有疑惑了,这明明是四次握手,为什么说是三次呢?实际上,第二次和第三次刚好一个在TCP协议格式第二位和第五位,刚好这两个可以一起发送过去,而TCP协议也确实是这样做的.

那么TCP协议的三次握手有什么好处呢?为什么不是两次不是四次,而偏偏是三次?且容我细细道来.

1.可以起到"投石问路"的效果,判断网络是否通畅,这个就像行军打仗的时候,前面的先锋部队会先去前面探路,确定路上没有阻碍了,后面的大部队才会跟着上来.

2.让发送端和接收端都能明白自己和对方的发送接收功能是否是好的.

比如在第一次握手的时候,接收端既然能收到请求就会知道 自己的接收功能莫问题,而发送端的发送功能莫问题

在第二次握手的时候,接收端返回一个应答报文和一个请求连接报文,接收端收到了以后,就知道自己的发送功能和接收功能都没问题.会回给接收端一个应答报文.

第三次握手的时候,接收端收到发送端的应答报文,就明白自己的发送功能和对方的接收功能都是好的.

这样,双方都明白自己和对方的发送功能和接收功能都是否完好.

如果是两次握手,那么就只是在我们上面提到的第二次握手,这样,接收端就不知道自己的发送功能和发送端的接收功能是不是好的,起不到我们想要的效果.

而三次握手已经满足了我们的需求,如果是四次或者多次,虽然也能做到,但是多余了,没有必要在做这么多重复没有意义的工作

4.四次挥手

四次挥手是客户端和服务器端断开连接的一个过程

 和三次握手不同的是,四次挥手不仅仅可以是客户端向服务器端发起,服务器端也可以向客户端发起.

三次握手建立连接的本质就是,客户端和服务器端都保存对端的信息,而断开连接则是在数据结构中删除这些信息.我们先用一张图来观察一下四次挥手的过程.

有兄弟可能会问了,凭什么三次握手就可以把中间的两次合并在一起,而四次挥手却不行呢?

这个问题的原因是因为,三次握手的时候,中间服务器确认应答ack和同步报文段syn都是在操作系统内核中完成的,它百分之百都可以同步的完成,所以可以一起发给客户端,

而四次挥手中,ack是在FIN过来以后立刻又内核给返回,而第二个FIN是由代码来完成的,在Java中就是调用了socket.close()方法来完成,如果代码逻辑很长,运行的时间长的话,这两个是不可能同时在一起发送过去,所以这个事并不是百分之百的,尽管有可能合并,但我们通常情况下,把断开连接的这种操作还是称之为四次挥手

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

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

相关文章

linux 的nobody是什么用户? 对安全有没有影响?

目录 一、nobody是不是可疑用户? 二、Linux系统中的nobody用户? 三、有nobody用户存在,安全吗? 一、nobody是不是可疑用户? 在Linux系统中,nobody是一个特殊的用户账户,通常用于运行系统服务…

UE5在VisualStudio升级后产生C++无法编译的问题

往期的虚幻引擎项目在VS更新后,编译时会报错,这一般出现在VS升级之后,UE对于VC的编译器定位没有更新导致; 有出现如下问题: 问题1: Running I:/EPCI/Epic Games/UE_5.3/Engine/Build/BatchFiles/Build.ba…

C++设计模式介绍:优雅编程的艺术

物以类聚 人以群分 文章目录 简介为什么有设计模式? 设计模式七大原则单一职责原则(Single Responsibility Principle - SRP)开放封闭原则(Open/Closed Principle - OCP)里氏替换原则(Liskov Substitution …

市场复盘总结 20240124

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 昨日主题投资 连板进级率 19/43 28.2% 二进三: 进级率低 47% 最常用的二种方法: 方…

【数据结构四】栈与Stack详解

目录 栈与Stack 1.实现一个自己的栈 2.Stack的基本使用 3.栈的一些oj题训练 4.栈,虚拟机栈,栈帧的区别 栈与Stack 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶…

【音视频原理】音频编解码原理 ③ ( 音频 比特率 / 码率 | 音频 帧 / 帧长 | 音频 帧 采样排列方式 - 交错模式 和 非交错模式 )

文章目录 一、音频 比特率 / 码率1、音频 比特率2、音频 比特率 案例3、音频 码率4、音频 码率相关因素5、常见的 音频 码率6、视频码率 - 仅做参考 二、音频 帧 / 帧长1、音频帧2、音频 帧长度 三、音频 帧 采样排列方式 - 交错模式 和 非交错模式1、交错模式2、非交错模式 一…

微信小程序-04

rpx(responsive pixel)是微信小程序独有的,用来解决屏适配的尺寸单位。 import 后跟需要导入的外联样式表的相对路径,用 ; 表示语句结束。 定义在 app.wxss 中的样式为全局样式,作用于每一个页面。 在页面的 .wxss 文…

薅运营商羊毛?封杀!

最近边小缘在蓝点网上看到一则消息 “浙江联通也开始严格排查PCDN和PT等大流量行为 被检测到可能会封停宽带”。 此前中国联通已经在四川和上海等多个省市严查家庭宽带 (部分企业宽带也被查) 使用 PCDN 或 PT,当用户的宽带账户存在大量上传数据的情况,中…

【USTC】verilog 习题练习 46-50

46 上升沿检测 题目描述 在实际应用中,我们经常需要对某个信号的边沿进行检测,并以此作为后续动作的触发信号(例如电脑键盘的某个按键被按下或者被松开,在电路中则对应的是电平的变化)。 设计一个电路,包…

幻兽帕鲁服务器价格,这个价格不够电费的

幻兽帕鲁服务器价格多少钱?4核16G服务器Palworld官方推荐配置,阿里云4核16G服务器32元1个月、96元3个月,腾讯云换手帕服务器服务器4核16G14M带宽66元一个月、277元3个月,8核32G22M配置115元1个月、345元3个月,16核64G3…

QT之 QDebug 调试(一)

在QT中&#xff0c;进行调试&#xff0c;则需要在头文件地方加上 #include <QDebug> 加上之后&#xff0c;在编译之后则其输出的信息则在应用程序输出那里显示信息。 其QDebug 信息调试则如&#xff1a; qDebug() << " 需要插入的信息 "…

2000-2022年上市公司全要素生产率测算固定效应FE法(含原始数据+测算代码do文档+计算结果)

2000-2022年上市公司全要素生产率测算固定效应FE法&#xff08;含原始数据测算代码do文档计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、统计截止日期、固定资产净额、year、股票简称、报表类型…

C# RichTextBox常用属性、方法学习1

1 字体 Font font1 new Font("宋体", 18); richTextBox1.Font font1; Font font2 new Font("宋体", 10, FontStyle.Underline); richTextBox1.SelectionFont font2; 定义字体&#xff0c;可以带2个参数&#…

服务端开发小记03——vsftpd

这里写目录标题 vsftpd简介vsftpd在Linux下的安装vsftpd验证vsftpd常用命令 vsftpd简介 vsftpd是“very secure FTP daemon”的缩写&#xff0c;是一个用于Linux环境下的免费开源的ftp服务器软件。vsftpd在Linux发行版中最受推崇&#xff0c;小巧轻快&#xff0c;安全易用&…

(黑马出品_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_01&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术栈导学 1.认识微服务1.1.学习目标1.2.单体架构1.3.分布式架构1.4.微服务1.5.SpringCloud1.6.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示…

深度强化学习(王树森)笔记07

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

内部类 --java学习笔记

内部类 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;那么这个类就是内部类当一个类的内部包含了一个整体的事务&#xff0c;且这个事务没必要单独设计时&#xff0c;就可以把…

C51 单片机学习(二):定时器与中断系统

参考 51单片机入门教程 1. 定时器 1.1 定时器定义 51 单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成 C51 单片机学习&#xff08;一&#xff09;&#xff1a;基础外设 讲的都是单片机的 IO 口控制的外设 1.2 定时器作用 用于计时系…

数据湖技术之应用场景篇

数据湖技术有较多的应用场景&#xff0c;本篇文章是针对一些典型的痛点场景做了一些介绍和说明。比如说在线数据抽取场景原有模式对线上库表产生较大压力&#xff0c;flink多流join维护的大状态导致的稳定性问题等等&#xff0c;具体场景如下图所示&#xff1a; 场景1:在线数据…

259:vue+openlayers: 显示海量多边形数据,10ms加载完成

第259个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中通过WebGLVectorLayerRenderer方式加载海量多边形数据。这里相当于将海量的数据放在同一个层的source中,然后通过webglTile的方式渲染出这一层。 本示例数据为5000个多边形,加载速度超级快。 直接…