java网络原理(三)----三次握手四次挥手

三次握手

三次握手是建立连接的过程,四次挥手是断开连接的过程,三次握手发生在socket.accept()之前。
在这里插入图片描述
客户端和服务器尝试建立连接的时候服务器就会和客户端进行一系列的数据交换称为握手,这个过程建立完了后,连接就好了。
A和B完成建立连接的过程需要3次打招呼的数据交互。
在这里插入图片描述

三次握手是一种可靠性的机制。

tcp想要保证可靠性传输,可靠传输的前提是网络路径得通畅,tcp三次握手就是验证网路通信时候否通畅,以及验证每个主机发送能力和接收能力是否正常。
当我和女朋友连麦打游戏时得先验证麦克风和耳机是否正常。
在这里插入图片描述
第一次我发送喵喵喵,为了验证我的麦克风是否正常,也是在验证女朋友耳机是否正常,女朋友收到喵喵喵,他就知道我的麦克风和他的耳机是好的。
第二次女朋友发送喵喵,为了验证他的麦克风是否正常,也验证我的耳机收否正常,我收到喵喵,我就知道我的耳机是好的,他的麦克风也是好的。
第三次我发送喵。就是对上述的喵喵进行回应,他收到喵说明刚才他发的喵喵我收到了。也就意味着双方设备都正常,可以互相通信了。
三次握手为什么是三次呢?因为恰好3次就能验证双方的发送能力和接收能力是否正常,并且把这样的信息同步给双方。
四次是否可以?可以但是没有必要。
在这里插入图片描述

消息协商

三次握手还能起到消息协商的效果。通信的时候涉及到一些参数,需要双方保持一致,通过协商来确定具体的参数是多少。
Tcp通信过程中有很多信息需要协调,比如双方的序号从几开始(一般不会从0或者1开始),这样做主要是保证2次连接消息的序号能有较大的差异,从而判定出某个消息是否属于这个连接的。网路上传输的信息可能后发先至,极端情况下,某个信息迟到了很久。当消息到达对端的时候,服务器和客户端已经断开了上一个连接。这是重新建立的连接了。这个时候就可以通过序号,明显的识别出这是上一个连接的信息,就可以丢弃了。

综上三次握手:
1.投石问路。验证通信路径是否通畅,双方的发送接收能力是否正常。
2.协商必要的参数。使客户端和服务器使用相同的参数进行消息的传输。

四次挥手

通信过程中,通信双方都在内存中保存了对端的信息,如果不需要连接了就得及时释放上述存储空间。
四次挥手和三次握手非常相似,三次握手必然是客户端主动发起的,四次挥手不一定,服务器也可以主动发起,大多还是客户端发起的。
在这里插入图片描述
第一个FIN由内核控制,第二个FIN是应用程序来控制的,调用socket.close();或者结束进程,就会触发FIN,相比之下ACK则是内核控制的,收到FIN就会立马返回ACK。
如果服务器始终不进行close会咋样?客户端始终不关闭吗?当程序执行结束不进行close 操作,此时服务器的tcp状态就处于CLOSE_WAIT状态,此时虽然连接没有关闭,但是此时这个连接已经不能用了。针对当前的socket进行操作,如果数据从缓存区中没有读完,能正常读到。如果读完,此时就会抛出异常。无论如何此时已经不能使用了,关闭是唯一的选择。更严重的是比如代码写出bug了,close就忘记写了,此时站在客户端的角度收不到对方的fin,也会进行等待,等待一定的时间就会放弃连接。
如果重传过程中出现丢包了怎么办?
这里也是超时重传,如果重传多次失败也会单方面放弃连接。如果主机A第二次接收到FIN,并且发出ACK,站在A的角度四次挥手就结束了。如果A发出ACK主机B并没有收到,出现丢包,把A释放了会出现问题,无人能够ACK。因此就需要让A最后一次发出ACK后等待一定的时间,如果没有接到B重新发来的FIN说明没有出现丢包,让A释放掉,如果接收到,让A重新传ACK。

Tcp是如何实现可靠传输的?
确认应答,超时重传,三次握手,四次挥手
三次握手是探路的,一旦网络通畅,双方接收和发送能力正常,三次握手的任务就完成。确认应答才是真正保证每次传输可靠的。

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

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

相关文章

python的BBS论坛系统flask-django-nodejs-php

为了更好地发挥本系统的技术优势,根据BBS论坛系统的需求,本文尝试以B/S架构设计模式中的django/flask框架,python语言为基础,通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法&#xff…

数据挖掘与分析学习笔记

一、Numpy NumPy(Numerical Python)是一种开源的Python库,专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一,因为它高效地实现了向量化计算,并提供了对大型多维数组和矩阵的支持…

2024年企业级通用人工智能的关键技术趋势

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

爬虫(七)

1.批量爬取知网数据 lxml:是 Python 的一个功能强大且易用的 XML 和 HTML 处理库。它提供了简单又轻巧的 API,使得解析、构建和操作 XML 和 HTML 文档变得非常方便。lxml 库通常用于处理 XML 和 HTML 文档,例如解析网页、处理配置文件等。openpyxl:是 Python 中用于操作 Ex…

二、Kubernetes(k8s)中部署项目wordpress(php博客项目,数据库mysql)

前期准备 1、关机顺序 2、开机顺序 (1)、k8s-ha1、k8s-ha2 (2)、master01、master02、master03 (3)、node01、node02 一、集群服务对外提供访问,需要通过Ingress代理发布域名 mast01上传 ingress-nginx.yaml node01、node02 上传 ingress-nginx.tar 、kube-webh…

五、C#归并排序算法

简介 归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并排序,最终得到一个有序的序列。 归并排序实现原…

Android Studio实现内容丰富的安卓校园二手交易平台(带聊天功能)

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目编号083 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看二手商品列表 3.发布二手商品 4.商品详情 5.聊天功能…

【超全详解】Maven工程配置与常见问题解决指南

Maven工程 目录 Maven工程一、如何检查Maven工程是否配置正确?1、检查路径2、检查基本配置3、其他配置 二、Maven的基本操作基本操作install和package的区别 三、获取别人的Maven工程之后如何修改?四、如何正确写好配置文件?1.寻找配置资源2.…

第六十一回 放冷箭燕青救主 劫法场石秀跳楼-编译安装飞桨paddlepaddle@openKylin+RISCV

卢俊义在水里被张顺抓住,用轿子抬到了梁山。宋江等人下马跪在地上迎接,请他坐第一把交椅。卢俊义宁死不从,大家只好说留他在山寨几天,先让李固带着马车货物回去。吴用对李固说,你的主人已经答应坐第二把交椅了&#xf…

基于python+vue分类信息服务平台移动端的设计与实现flask-django-php-nodejs

分类信息服务平台是在Android操作系统下的应用平台。为防止出现兼容性及稳定性问题,框架选择的是django,Android与后台服务端之间的数据存储主要通过MySQL。用户在使用应用时产生的数据通过 python等语言传递给数据库。通过此方式促进分类信息服务平台信…

51单片机中断信号的种类及应用场景

在嵌入式系统中,中断是一种重要的事件处理机制,它可以在程序执行的任何时候暂停当前任务,转而执行与之相关的特殊任务或事件。51单片机作为一种常见的微控制器,其中断功能在各种应用中起着关键作用。然而,对于初学者和…

【理解机器学习算法】之分类问题的模型评估(ROC-AUC)

ROC曲线(接收者操作特性曲线)和AUC(曲线下面积)是在不同阈值设置下,用于分类问题的性能度量工具。下面是它们所代表的含义以及使用方法: ROC曲线 代表含义:ROC曲线是一个图形化的表示&#xf…

Unity---Lua语言

Lua Binaries Download 13.2 逻辑热更新——Lua1-3_哔哩哔哩_bilibili nil表示空 只有false和nil为false,其他值都为true ..连接两个字符串

浙江IGM机器人K5控制柜维修需要注意哪些问题?

IGM机器人K5控制柜常见故障及维修方法 1、电源故障: 表现为IGM机器人K5控制柜不能开机或突然断电。 检查:检查电源线是否连接良好,有无破损;检查电源模块的输出电压是否正常; 维修方法:如电源模块损坏&…

硬核分享|AI语音识别转文字与自动生成字幕

硬核分享|AI语音识别转文字与自动生成字幕_哔哩哔哩_bilibili 在现代快节奏的生活中,语音转文字工具成为了我们工作和学习中的得力助手。它能够将我们说出的话语迅速转化为文字或者将语音视频自动生成字幕,提供便捷和高效。 语音转文字转字幕工具是一种…

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…

【ReactJS】使用GoJS实现自己的图表App

目录 1:用于绘制自定义图表的JavaScript库:用于绘制UML(或BPMN或ERD …)图表的JavaScript库:2:为什么选择GoJS?3:让我们使用现有的React应用程序:步骤1:步骤2:步骤3:步骤4:推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战1:…

IDEA上的Scala环境搭建

Scala环境搭建 一、搭建Scala开发环境 安装Scala编译器 安装scala-2.12.10.msi 检查scala安装情况 在dos窗口输入scala,检查是否能够进入编译器。进行简单的scala命令计算 在IDEA中进行scala编码 File - Settings - Plugins - MarketPlace中搜索scala插件 安…

RabbitMQ在Java中使用 SpringBoot 从基础到高级

充分利用每一个监听者 需要充分利用每一个消费者,需要在配置文件中加上prefetch配置并设置为1 rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息创建交换机和队列 创建队列 "fanout.queue1"&…

集简云新增“文本语音转换”功能,实现智能语音交互

为丰富人工智能领域的应用集成,为用户提供更便捷和智能化的信息获取和视觉创作方式,本周集简云上线了内置应用—文本语音转换。目前支持OpenAI TTS和TTS HD模型,实现文本语音高效智能转换,也可根据你的产品或品牌创建独特的神经网…