【剧前爆米花--爪哇岛寻宝】TCP实现可靠性的方法以及连接相关的三次握手四次挥手

news2024/11/15 19:59:38

作者:困了电视剧

专栏:《JavaEE初阶》

文章分布:这是一篇关于网络编程的文章,在这篇文章中我会具体介绍TCP是如何实现可靠性的并且分析建立断开连接的情况,希望对你有所帮助!

目录

可靠性

确认应答

超时重传机制

连接管理

三次握手

四次挥手


可靠性

TCP协议具有有连接,可靠传输,面向字节流,全双工的特性,其中可靠传输是TCP存在的初心,是其最核心的机制。TCP实现可靠性是确认应答+超时重传,TCP的可靠传输主要通过以下几个方面进行实现。

这是一个TCP协议段格式,接下来我将对这个格式中的每一个元素进行分析。

确认应答

确认应答是实现可靠性的最核心机制,现在有这样一个情景,我在微信上给朋友发消息,第一个消息是“晚上出不出去吃饭”,朋友回答“好的”,我接着又发了第二个消息“我最近手头有点紧,借点钱”,朋友回答“不行”,此时朋友给我的回答就是应答报文(ACK报文),但是信息在通信的时候会不会出现这样一种情况,就是朋友发给我的两次应答报文顺序弄错了,即当我出去吃饭朋友回答不行,当我借钱的时候朋友说好的,这显然是会造成巨大的误会的。

为了避免这种情况,TCP就进行了编号,注意:由于在TCP的严重并没有“一条消息”,“两条消息”的概念,所以TCP就对每一个字节进行编号,具体如图:

1856e9451d8b47fa9fdb7150b514dcdc.png (2340×925)

每一个 ACK 都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

超时重传机制

在一段网络通信的过程中,信息的传输需要经过许多个节点,如果中间的任何一个节点出现问题都会导致这个数据报的丢失,进而无法传输,这就是所谓的丢包,如果包丢了,接收方就收不到相关的数据了,自然也不会返回ACK。

不会返回ACK就这样一直等待下去吗,当然不会,TCP引入了超时重传的机制,如果发送方迟迟拿不到应答报文,在等待一段时间后就视为刚才的数据丢包了就会在重新发送一遍。

发送方对于丢包的判定,是一定时间内,没有收到ACK,那么此时就有两种情况了:

第一:发送方的数据丢包了,接收方没有收到自然不会有ACK。

第二:发送发的数据没有丢包,但是接收方收到数据过后发送的ACK丢包了,这样也会导致发送方触发超时重传机制,这时有人就会问了,如果是这种方式触发的,那接收方不就会收到了两份数据吗?这样的话,不也就造成了错乱了吗?

确实,在这种情况下接收方确实会收到两份数据,不过TCP非常贴心的帮我们处理好了这个问题,它会在接收缓冲区中根据收到的数据的序号,自动去重,保证了应用程序读到的数据只有一份。

拓:重传的数据会不会也发生丢包呢?答案是当然会,那此时的TCP又是怎样进行处理的呢?如果连续发多个数据都丢失,那说明当前丢包的概率已经非常大了,可能是50%以上了,当丢包率达到这个数据的时候表明网络此时很大概率出现了故障,所以TCP的处理思路就是,继续超时重传,但是每丢包一次,超时等待的时间都会变长(重传的频率降低了),因为此时TCP可能会觉得是网络出现了问题,如果连续很多次重传都无法得到ACK,那么此时的TCP就会尝试重新连接,如果重连也失效,TCP就会关闭连接放弃网络通信了。

连接管理

TCP建立连接:三次握手。TCP断开连接:四次挥手。

三次握手

握手指的是通信双方,进行一次网络交互,相当于客户端和服务器之间,通过三次交互,建立了连接关系,即双方各自记录对方的信息。

 syn称为同步报文段,意思是一方要向另一方,申请建立连接,首先客户端发送一个申请,服务端接受后回复一个应答报文,然后也发一个申请(可以理解为建立连接是双方的事情,所以需要共同同意),客户端收到这个申请后,再返回一个应答报文,完成连接的建立。

如何区分syn报文和ack等报文呢?观察TCP报头结构:

这时可能有人会问了,这不是四次交互过程吗,为什么说是三次握手,因为syn和ack报文是能进行合并的,如果一个TCP数据报,第二位和第五位都是1,则当前这个报文是syn+ack。

 为什么要进行三次握手,或者说三次握手达成了什么目标呢?

三次握手这个过程,本质上就是投石问路,验证了客户端和服务端各自的发送能力和接受能力是否正常。

首先客户端向服务端发送了一个syn报文,证明了客户端的发送能力正常,服务端接受到以后,发送ack报文和syn报文则证明了服务端的接受能力正常和发送能力正常,如果客户端的接收能力正常的话当客户端收到服务端发来的syn报文会响应一个ack报文,这些过程全部完成后,证明了双方都ok。

上述过程内核自动完成,应用程序干预不了。

从这个角度看,三次握手和可靠性也是有关系的,但是肯定没有确认应答和超时重传更重要。

四次挥手

断开连接,四次挥手。通信双方各自给对方发送一个FIN(结束报文),再各自给对方返回ACK。

ack 和 fin 是有一定概率合并成一个的,但是通常情况下不能合并。那为什么三次握手能100%合并而四次挥手就不能合并呢?

三次握手,ack和syn是同一个时机触发的(都是由内核来完成的)

四次挥手,ack 和 fin 则是不同时机触发的,ack是内核完成的,会在收到fin的时候第一时间返回,fin则是应用程序代码控制的,在调用到socket的close方法的时候才会触发fin。

 

 参考我之前建立TCP的博客,这里调用close方法可能是立即,也可能是隔很久,取决于我们具体的代码,如果立即close,趁着刚才ack还没发现,这里就可以合并,如果是隔很久再close,此时fin只能单独进行发送了。

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

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

相关文章

iOS开发进阶(一):走近iOS原生开发

文章目录 一、前言二、知识储备三、 Object-C四、启动流程五、拓展阅读 一、前言 在应用 uni-app 进行跨平台APP开发过程中,发现并不支持视频播放小窗功能,且插件市场提供的插件用户体验不好,遂决定自行开发 uni-app 原生插件。 uni-app原生…

力扣 450. 删除二叉搜索树中的节点

题目来源:https://leetcode.cn/problems/delete-node-in-a-bst/description/ C题解1:迭代法。删除节点需要分情况讨论: 找不到节点,返回原根节点;删除节点无子节点,那么其父节点指向空就行(注意…

Java前端编译与优化

一个编译器的前端把*.java文件转变成*.class文件的过程称为Java前端编译。像Javac这类前端编译器对代码的运行效率几乎没任何优化措施,但是其做了许多针对Java语言编码过程的优化措施来降低程序员的编码复杂度、提供编码效率。 1 Javac编译器 准备过程 初始化插入…

《PyTorch深度学习实践》第十讲 卷积神经网络(基础篇)

b站刘二大人《PyTorch深度学习实践》课程第十讲卷积神经网络(基础篇)笔记与代码:https://www.bilibili.com/video/BV1Y7411d7Ys?p10&vd_sourceb17f113d28933824d753a0915d5e3a90 上一讲中MNIST数据集的例子采用的是全连接神经网络&#…

自然语言处理从入门到应用——预训练模型总览:两大任务类型

分类目录:《自然语言处理从入门到应用》总目录 从大量无标注数据中进行预训练使许多自然语言处理任务获得显著的性能提升。总的来看,预训练模型的优势包括: 在庞大的无标注数据上进行预训练可以获取更通用的语言表示,并有利于下游…

python语法(高阶)-多线程编程

""" 演示多线程编程的使用 """ import time import threadingdef sing(msg):while True:print(msg)time.sleep(1)return Nonedef dance(msg):while True:print(msg)time.sleep(1)return Noneif __name__ __main__:# 创建一个唱歌的线程&#xf…

后台管理系统的权限(vue如何实现后台管理系统的权限,react如何实现后台管理系统的权限)

一、权限的解释 一般来说,在后台管理系统里肯定会使用到权限,权限一般分为功能级权限和数据级权限 1、功能级权限 1)、页面级权限(菜单): 不同的用户(角色)登录到管理系统后&#…

mysql load data infile 报错 1290 处理方法

mysql load data infile 命令导入数据报错"16:06:13 load data infile “/var/lib/mysql/test/employee.csv” into table emp fields terminated by ‘,’ ignore 1 lines Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cann…

Linux应用层开发--多线程进程编程

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、linux开发的方向二、Linux环境特点介绍Linux环境基本构成 三、进程与线程1、进程的概念2、进程的状态3、线程的概念4、线…

leetcode 559. N 叉树的最大深度

2023.7.2 这道题还是使用层序遍历&#xff0c;在N叉树的层序遍历的基础上增加一个求深度的操作即可。下面上代码&#xff1a; class Solution { public:int maxDepth(Node* root) {int depth 0;queue<Node*> que;if(root nullptr) return 0;que.push(root);while(!que…

json 压缩算法详解

概要 无论使用何种编程语言&#xff0c;json格式的数据已被广泛应用&#xff0c;不论是数据的传输还是存储&#xff0c;在很多应用场景下&#xff0c;你可能想进一步地压缩JSON字符串的长度&#xff0c;以提升传输效率&#xff0c;如果你使用的是nosql数据库&#xff0c;你可能…

2012年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

记一次tomcat版本升级导致的现网问题

前言 最近公司项目做安全漏洞审查&#xff0c;把一批服务的fastjson,tomcat,log4j版本做升级&#xff0c;那天上线了50个服务&#xff0c;所有服务上线之后&#xff0c;现网有客服反馈录音笔下单异常。查询了现网日志&#xff0c;发现适配服务有异常信息&#xff0c;报错信息如…

闲人闲谈PS之四十二——顾问的“禁忌之地”—制造能力计划

惯例闲话&#xff1a;上个月有幸成为乐老师乐谈IT系列培训课程的讲师&#xff0c;分享主题是&#xff0c;PS在装备制造和工程行业的应用。虽然培训规模不是很大&#xff0c;但是闲人很有信心&#xff0c;至少在小范围之内&#xff0c;参与培训的听友人来说&#xff0c;PS一直以…

什么条件下会出现死锁,如何避免?

文章目录 一、什么是死锁二、产生死锁的原因&#xff1a;三、如何避免死锁&#xff1a; 一、什么是死锁 死锁&#xff0c;简单来说就是两个或者两个以上的线程在执行过程中&#xff0c;去争夺同一个共享资源导致相互等待的现象。如果没有外部干预&#xff0c;线程会一直处于阻塞…

图像的算术操作

1.图像的加法 用途&#xff1a;图像的合成 Rain图片View图片 合成代码&#xff1a; import numpy as np import cv2 as cv import matplotlib.pyplot as pltrain cv.imread(rain.png) plt.imshow(rain[:, :, ::-1]) plt.show()view cv.imread(view.png) plt.imshow(view…

773. 滑动谜题

链接&#xff1a;773. 滑动谜题 题解&#xff1a;https://blog.csdn.net/INGNIGHT/article/details/131350054 滑动拼图 II class Solution { public:int slidingPuzzle(vector<vector<int>>& board) {// 异常判断if (board.size() < 0 || board[0].size…

怎么管理好一个团队?

一个成功的企业需要一个高效、有能力、积极的团队来支持其业务运营。管理一个团队需要领导者具备一定的技能和知识&#xff0c;怎么管理好一个团队对于许多企业领导者而言也是一项不小的挑战。对此&#xff0c;我想首先推荐一本非常优秀的团队书籍——《经理人参阅&#xff1a;…

js vuejs dagre-d3绘制流程图实用指南 有向图可视化

写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图,今天在这里给安排上,与大家分享。 明确一点,只要你的数据计算能力足够强,使用原生D3绘制流程图绝对可以的,但是,为了让大家更容易上手,避免重复造轮子,给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。 首…

idea tomcat js 汉字乱码

Run/Debug Configuiations->VM options:-Dfile.encodingUTF-8