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

作者:困了电视剧

专栏:《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.mfbz.cn/a/34062.html

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

相关文章

leecode-下一排列

题目 题目 分析 妈呀,其实我直接调用函数,一行代码就通过了hhh,不过这种取巧的方式不可取,还是得老老实实的写。 首先需要明白什么叫下一排列? 比如输入: 1 5 8 4 7 6 5 3 1 答案就是: 1 5 …

macOS上下载安装Kibana并连接ES

下载Kibana 执行以下命令进行,版本号根据你所用的ES版本选择,比如我的是7.10.0 curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.0-darwin-x86_64.tar.gz解压安装Kibana tar -zxvf kibana-7.10.0-darwin-x86_64.tar.gz进行config…

QT——使用QListWidget、QListWidgetItem、QWidget实现自定义管理列表

作者:小 琛 欢迎转载,请标明出处 文章目录 需求场景思路描述Qt模块QListWidgetQListWidgetItem自定义QWidget配合QListWidget 例子:实现一个json文件管理窗口 需求场景 因工作需要,开发一个文件管理窗口,要让使用者可…

【python爬虫应用03】csdn个人所有文章质量分查询

🛠️ 环境准备 在开始编写代码之前,我们需要进行一些环境准备。以下是所需的环境和库: 操作系统:Windows编程语言:Python 3编辑器:VSCode(可选) 安装所需的库: reque…

Git快速入门

Git 1、Git概述Git简介Git下载与安装 2、Git代码托管服务常用的Git代码托管服务使用码云托管服务 3、Git常用命令Git全局设置获取Git仓库工作区、暂存区、版本库概念本地仓库常用命令远程仓库操作命令分支操作标签操作 4、在IDEA中使用Git在IDEA中配置Git获取Git仓库本地仓库操…

OpenAI Gym入门与实操(2)

本文内容参考: Getting Started With OpenAI Gym | Paperspace Blog, 【强化学习】 OpenAI Gym入门:基础组件(Getting Started With OpenAI Gym: The Basic Building Blocks)_iioSnail的博客-CSDN博客 3. 环境&#…

Blender导出gltf格式ThreeJS不显示问题-

1. 检查代码 import { GLTFLoader } from three/addons/loaders/GLTFLoader.js; 。。。。。。initRoomGltf() {const _this this;// const loader new OBJLoader();const loader new GLTFLoader();// load a resourceloader.load(// resource URL// this.commonFunc.getPat…

vcruntime140_1.dll无法继续执行代码,有哪些方法可以解决?

关于vcruntime140_1.dll无法继续执行代码的错误问题,其实还是非常的普遍的,这属于经常丢失的dll文件之一,当然还有一个vcruntime140.dll也是非常容易丢失的,本文下面会介绍到这两种有啥区别,以及怎么去修复这些文件丢失…

spring复习:(4)AbstractEnvironment

该类中指定了激活profile属性的名称(spring.profiles.active),默认profile属性的名称(spring.profiles.default),以及默认的profile的名字(default)。

【Leetcode】19.删除链表的倒数第 N 个结点

一、题目 1、题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例2: 输入:head = [1], n = 1 输出:[]示例3: 输入:head = [1,2], n = 1 输出:[1]提示: 链表中结点的数目为 sz…

【剑指offer专项突破版】二叉树篇——“C“

文章目录 前言一、二叉树剪枝题目分析思路分析代码 二、序列化与反序列化二叉树题目分析思路分析代码 三、从根节点到叶节点的路径数字之和题目分析思路分析代码 四、 向下的路径节点之和题目分析思路分析思路①代码思路②代码 五、节点之和最大的路径题目分析思路分析代码 六、…

XSS注入——DOM型XSS

DOM型xss XSS根据恶意脚本的传递方式可以分为3种,分别为反射型、存储型、DOM型,前面两种恶意脚本都会经过服务器端然后返回给客户端,相对DOM型来说比较好检测与防御,而DOM型不用将恶意脚本传输到服务器在返回客户端,这…

Elasticsearch 地理空间计算

地理位1置搜索:使用查询API进行搜索 1、Geo Distance Query Geo Distance Query是在给定的距离范围内搜索数据的查询。例如,可以搜索给定地理位置附近指定距离内的所有文档。 GET /my_index/_search {"query": {"bool" : {"fi…

9、Redis集群(cluster)

是什么 Redis集群是一个提供在多个Redis节点间共享数据的程序集,Redis集群可以支持多个master 能干嘛 Redis集群支持多个master,每个master又可以挂载多个slave 读写分离 支持数据的高可用 支持海量数据的读写存储操作 由于Cluster自带Sentinel的故障转…

软考高级系统架构设计师(九) 作文模板-论设计模式及其应用(未完待续)

目录 掌握的知识点 创建型 结构型 行为型 掌握的知识点 设计模式分为哪3类 每一类包含哪些具体的设计模式 创建型 创建型模式是对对象实例化过程的抽象,他通过抽象类所定义的接口,封装了系统中对象如何创建、组合等信息。 创建型模式主要用于创建对…

Buildroot 取消默认QT桌面-迅为RK3588开发板

本小节将讲解如何取消掉默认的 qt 桌面。 首先对开发板进行上电,开发板正常启动后,使用命令“cd /etc/init.d”进入到/etc/init.d 目录 下,然后使用以下命令对开机自启动脚本 rcS 进行查看,如下图所示: vi rcS 从上…

视觉SLAM十四讲需要提前知道的数学基础知识

学习视觉SLAM十四讲之前的必备数学基础知识 1. 正交矩阵2. 线性关系3. 求矩阵的逆4. 叉乘5.反对称矩阵6. 复数 1. 正交矩阵 定义: 设n阶矩阵A满足AATATAI ,则称A为正交矩阵 性质: 以下为手写,从小字丑,请多担待。。 …

红色通信史(一):红色通信的萌芽

1927年4月和7月,蒋介石、汪精卫分别在上海、武汉发动“四一二”、“七一五”反革命政变,实行“清党”、“分共”,大肆逮捕和杀害中共党员,制造“白色恐怖”。 面对敌人的残酷镇压,我党决定创建自己的革命军队&#xff…

元宇宙装备展正式拉开帷幕,深眸科技CEO周礼出席产业论坛发表主题演讲

6月27日,一场令人期待已久的工业元宇宙盛会在昆山国际会展中心拉开帷幕,大会由昆山市人民政府主办,昆山市工业和信息化局、赛迪工业和信息化研究院集团(苏州)有限公司联合承办,并得到了十数家单位的支持&am…

计算机网络那些事之 MTU 篇 pt.2

哈喽大家好,我是咸鱼 在《计算机网络那些事之 MTU 篇 》中,咸鱼跟大家介绍了 MTU 是指数据链路层能够传输的最大数据帧的大小 如果发送的数据大于 MTU,则就会进行分片操作(Fragment);如果小于 MTU&#x…
最新文章