「网络原理」三次握手四次挥手
🎇个人主页:Ice_Sugar_7
🎇所属专栏:计网
🎇欢迎点赞收藏加关注哦!
三次握手&四次挥手
- 🍉连接管理
- 🍌三次握手
- 🍌意义
- 🍌四次挥手
- 🍌TCP 状态转换
- 🥝LISTENING 状态
- 🥝ESTABLISHED 状态
- 🥝CLOSE_WAIT & TIME_WAIT 状态
🍉连接管理
有连接是 TCP 的特点之一
socket = new Socket(serverIp,serverPort);
执行这行代码其实就是在建立连接,不过这只是在调用 socket api,真正建立连接是在操作系统内核完成的,见下图:
🍌三次握手
内核通过三次握手
来完成建立连接的过程
在此之前得先介绍一种数据报—— syn
syn 是一个特殊的 TCP 数据报,它
没有载荷
,因此不会携带应用层数据;
同时标志位中的 SYN 值为 1
虽说无载荷,但是它也有 IP 报头、以太网数据帧帧头、TCP 报头等。其中 TCP 报头和 IP 报头分别包含客户端自己的端口和 IP
syn 其实是 synchronized 的缩写,它是多线程的常客,意为同步。多线程使用 synchronized 加锁实现的同步是协调多个线程间的执行顺序;而 TCP 这里的同步是指进入连接状态,客户端和服务器相互配合完成一系列工作。可以理解为 syn 就是客户端给服务器打个招呼,表示要与它建立连接,服务器收到后要发个 ack 回应一下,同时发个 syn 表示同意连接
🍌意义
- 三次握手可以初步确认通信
链路是否畅通
,这是确保可靠性的前提条件
- 三次握手可以验证通信双方发送能力和接收能力是否正常
由此衍生出一道面试题:能否握两次手?四次呢?
A:两次肯定不行,因为服务器这边还无法确认自己的发送能力和对端的接收能力是否正常,因此需要服务端再来一次握手,把信息同步给服务器;四次可以,但是没必要
- 三次握手的过程中也会协商一些必要的参数
通信是客户端和服务器两端共同配合完成的,所以有些参数要进行协商,这些参数往往是在“选项”中体现的
我们前面说“选项”可有可无,最少占 0 个字节,最多占 40 字节(报头最大长度为 60,去掉固定的 20,就剩下 40 字节)。选项中的信息我们不用去深究,不过有一个信息是比较关键的 —— TCP 通信的序号起始值
TCP 在一次通信过程中,序号不是从 0 或 1 开始的,而是先选择一个比较大的数字,从它开始计算,而且即使是同一个客户端和服务器,每次连接的起始值都不同。这里的“不同”不是随机给一个值,而是经过一系列的分配策略得出的。这样做的好处在于避免处理到上次连接的数据报
数据报在传输过程中遇到阻塞,迟迟没有到达对端,可能在本次连接断开后还没到达,等到下次连接建立时才到达,但此时已经是别的客户端了,不适合处理上次连接的数据报,应该把它丢弃
🍌四次挥手
每个客户端/服务器都要保存对端的信息,这些信息需要使用一定的数据结构来存储,断开连接的本质就是把对端的信息从数据结构中删掉/释放掉
四次挥手中,服务器和客户端其中一方先调用 socket.close(),然后触发 FIN,即向对端发送 FIN 结束报文段
(除了调用 close(),结束进程也会触发 FIN。这两种方式本质都是关闭 socket 文件)
假设是客户端请求断开连接,那么四次挥手流程如下:
注意四次挥手中间的两步不像三次握手,不一定可以合并
下面总结一下这两者之间的相似之处和不同之处
相似点:
都是通信双方中某一方给对方发起一个 syn/fin,交互过程中中间两个数据报是由同一个机器发出的
不同点:
- 三次握手中间两次可以合并为一次;四次挥手不一定
- 三次握手一定是客户端主动发起连接请求;而四次挥手可以由客户端或服务器发起
🍌TCP 状态转换
前面说 TCP 服务器和客户端都有一定的数据结构保存连接的信息,在数据结构中有个属性叫作状态
,操作系统内核根据不同的状态决定应该干什么
🥝LISTENING 状态
表示服务器创建好 serverSocket,并且绑定好端口号了
设定端口号为 5000,启动服务器后在控制台查询服务器状态,得到如下信息:
🥝ESTABLISHED 状态
表示客户端和服务器已经建立连接(三次握手结束了)
启动客户端后,再次查询状态:
接下来看一下三次握手中的状态变化
🥝CLOSE_WAIT & TIME_WAIT 状态
前者表示接下来代码中需要调用 close 来主动发起 FIN。收到对方的 FIN 后会进入这个状态
本端给对方发起 FIN 后,对端也给本端发 FIN 之后,本端就会进入 TIME_WAIT 状态
主动断开连接的一端会进入 TIME_WAIT 状态;被动断开的一端则是进入 CLOSE_WAIT 状态
接下来看一下四次挥手中的状态变化,假设是客户端主动断开 TCP 连接
相关文章:
「网络原理」三次握手四次挥手
🎇个人主页:Ice_Sugar_7 🎇所属专栏:计网 🎇欢迎点赞收藏加关注哦! 三次握手&四次挥手 🍉连接管理🍌三次握手🍌意义🍌四次挥手🍌TCP 状态转换…...
第二十四章 SOAP 错误处理 - 发生故障时添加 WS-Addressing 标头元素
文章目录 第二十四章 SOAP 错误处理 - 发生故障时添加 WS-Addressing 标头元素%SOAP.Fault12.Code 属性SubcodeValue %SOAP.Fault12.Text 属性Textlang 发生故障时添加 WS-Addressing 标头元素 第二十四章 SOAP 错误处理 - 发生故障时添加 WS-Addressing 标头元素 %SOAP.Fault…...
CSS真题合集(一)
CSS真题合集(一) 1. 盒子模型1.1 盒子模型的基本组成1.2 盒子模型的实际大小1.3 盒子模型的两种类型1.4 设置盒子模型1.5 弹性盒子模型 2. BFC2.1 主要用途2.2 触发BFC的方法2.2 解决外边距的塌陷问题(垂直塌陷) 3. 响应式布局3.1…...
Golang | Leetcode Golang题解之第144题二叉树的前序遍历
题目: 题解: func preorderTraversal(root *TreeNode) (vals []int) {var p1, p2 *TreeNode root, nilfor p1 ! nil {p2 p1.Leftif p2 ! nil {for p2.Right ! nil && p2.Right ! p1 {p2 p2.Right}if p2.Right nil {vals append(vals, p1.V…...
离奇问题:java通过poi读取excel单元格的小数时会出错
问题 java通过poi读取excel单元格的小数时会出错,分析后发现是因为会损失精度。 处理的代码 /*** DataFormatter 直接new就行:DataFormatter df new DataFormatter();*/ private String getNumericCellValue(Cell cell, DataFormatter df) {String val…...
前端框架是什么
前端框架是预先编写好的JavaScript代码集合,旨在帮助开发者快速搭建Web应用程序的界面和交互逻辑。以下是一些常见的前端框架,按照字母顺序排列,并简要介绍其特点: Angular 由Google开发,原名AngularJS,后…...
Feign的动态代理如何配置
Feign 本身已经内置了动态代理的功能,它允许你声明一个接口,并通过这个接口来发送 HTTP 请求,而不需要你手动编写发送 HTTP 请求的代码。Feign 会为你创建这个接口的代理实现,并在运行时拦截对这些方法的调用,将它们转…...
ReactRouter——路由配置、路由跳转、带参跳转、新route配置项
目录 写在前面 (一)初步使用router 1.安装react-router-dom 2.创建router结构 3.嵌套路由 4.配置not found页面 (1)确切路由报错页面 (2)未配置路由报错页面 5.重定向 (二)路由跳转 1.组件跳转 2.NavLink 3.js跳转 (三)传递参数 1.searchParams(query)参数 2…...
异步处理耗时逻辑
在 Spring Boot 中实现 RESTful 接口的快速响应,同时在后台继续处理耗时逻辑,可以使用异步处理技术。以下是一个详细的示例,展示如何使用 Async 注解和 CompletableFuture 来实现这一需求。 使用 Async 注解 步骤 1:启用异步支持…...
Switch 之 配置SNMP
Description SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于网络管理的协议,它用于在网络中对设备进行监控和管理。 SNMP定义了一种管理框架,其中包括管理站、代理和管理信息库(M…...
微软如何打造数字零售力航母系列科普13 - Prime Focus Technologies在NAB 2024上推出CLEAR®对话人工智能联合试点
Prime Focus Technologies在NAB 2024上推出CLEAR对话人工智能联合试点 彻底改变您与内容的互动方式,从内容的创建到分发 洛杉矶,2024年4月9日/PRNewswire/-媒体和娱乐(M&E)行业人工智能技术解决方案的先驱Prime Focus Techn…...
Nginx之正向代理配置示例和说明
一、NGINX正向代理功能简介 Nginx的正向代理功能允许局域网中的客户端通过代理服务器访问Internet资源。具体来说,Nginx作为一种流行的Web服务器和反向代理服务器,在正向代理方面的应用也相当实用。以下是其正向代理功能的几个关键点: 访问外…...
Linux文件与目录管理
#Linux系统基础 文件与目录管理 一、常用命令 文件、目录操作命令说明cd(cd …/ cd ~/ cd/ cd path)切换目录 cd ~等于 cd /rootls显示目录文件ls -l 或者 ll以详细信息的方式显示目录文件pwd查看当前工作目录cp (-i -r)复制文件或目录mkdir创建目录,…...
08.组件间通信-插槽
1.默认插槽 父组件 <template><div class"father"><h3>父组件</h3><div class"content"><Category title"热门游戏列表">//默认插槽内容<ul><li v-for"g in games" :key"g.id&quo…...
在AWS上运行的EKS Elastic Kubernetes Service 创建集群Cluster,Node group, Nodes
1. 前提条件 AWS Account: https://aws.amazon.com/free/Installing KubeCtl CLI https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.htmlEKS Cluster RoleIAM Role for Node GroupVPCEC2 Key Pair which can be used to SSH to the worker nodesAWS …...
10款堪称神器的宝藏软件,相见恨晚
今天给大家带来10款堪称神器的宝藏软件,每一个都非常好用,让你直呼相见恨晚。 1、知犀思维导图 知犀思维导图是大家组织信息、梳理思维的重要利器,它可以帮助我们以图形化的方式呈现思维过程,让整体思路变得清晰直观。通过使用知…...
为什么会选择厚膜作为芯片电阻?
引线键合 引线键合是集成电路 (IC) 或其他半导体器件与其封装之间互连的常见解决方案。它还可用于将IC连接到其他电子设备或将其他厚膜电路相互连接。引线键合通常被认为是最具成本效益和最灵活的互连技术,用于组装大多数半导体封装。引线键合…...
基本药物采购使用
--医院采购基本药物金额数 select sum(采购基本药物金额数) 采购基本药物金额数 from ( select sum(t.实收金额) 采购基本药物金额数 from 住院费用记录 t,药品规格 a where t.收费细目ida.药品id and t.记录状态1 and a.基本药物基药 and t.收费细目id not in( …...
k8s小型实验模拟
(1)Kubernetes 区域可采用 Kubeadm 方式进行安装。(5分) (2)要求在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上,Pod使用hostPat…...
leetcode168:Excel表列名称
题目链接:168. Excel表列名称 - 力扣(LeetCode) class Solution { public:string convertToTitle(int columnNumber) {string ss1;int MOD 0;if(columnNumber < 26){ss1 (columnNumber A - 1);return ss1;}while(columnNumber){int MO…...
排课系统1
参考:https://gitee.com/lequal/CourseArrange 软件技术栈 当然,我会逐一解释这些技术栈的含义:### 前端技术栈1. **Vue2.x**:- Vue.js 是一个流行的前端 JavaScript 框架,用于构建用户界面和单页应用程序(SPA)。- 2.x 表示 Vue.js 的第二个主要版本,它提供了一套响应…...
uni-popup
UniPopup是uni-app框架中的一个轻量级组件,它提供了一种便捷的方式来显示弹出窗口(如对话框、通知、选择器等)。uni-popup可以帮助开发者在不同平台(如Web、H5、小程序等)上快速实现一致的用户体验,支持自定…...
torchmetrics,一个无敌的 Python 库!
更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个无敌的 Python 库 - torchmetrics。 Github地址:https://github.com/Lightning-AI/torchmetrics 在深度学习和机器学习项目中,模型评估是一个至关重要的环节。为了准确…...
如何快速上手Python,成为一名数据分析师
如何快速上手Python,成为一名数据分析师 成为一名数据分析师需要掌握Python编程语言以及数据分析相关的知识和技能。以下是一些步骤和建议,帮助你快速上手Python并成为一名数据分析师: 学习Python基础知识:首先,你需要…...
MC服务器怎么搭建
MC服务器怎么搭建?随着《我的世界》(Minecraft,简称MC)的火爆,越来越多的玩家和社区开始搭建自己的MC服务器,与朋友共享创造的乐趣。但搭建一台稳定、高效的MC服务器并不是一件容易的事。今天,我们就来聊聊…...
JavaScript正则表达式
search()方法 用来检索与正则表达式相匹配的子字符串,并返回子字符串开始的位置。若结果为-1则表示没有与之匹配的子字符串例: var str"well pemper" var str1str.search(/em/g) console.log(str1) //返回6replace()方法 用于替换一个与正…...
Redis实战宝典:基础知识、实战技巧、应用场景及最佳实践全攻略
背景 在Java系统实现过程中,我们不可避免地会借助大量开源功能组件。然而,这些组件往往功能丰富且体系庞大,官方文档常常详尽至数百页。而在实际项目中,我们可能仅需使用其中的一小部分功能,这就造成了一个挑战&#…...
[FFmpeg学习]初级的SDL播放mp4测试
在之前的学习中,通过AVFrame来保存为图片来认识了AVFrame, [FFmpeg学习]从视频中获取图片_ffmpeg 获取图片-CSDN博客 在获取到AVFrame时,还可以调用SDL方法来进行展现,实现播放效果。 参考资料 SDL,ffmpeg实现简单…...
情景题之小明的Linux实习之旅:linux实战练习1(下)【基础命令,权限修改,日志查询,进程管理...】
小明的Linux实习之旅:基础指令练习情景练习题下 前景提要小明是怎么做的场景1:初识Linux,创建目录和文件场景2:权限管理,小明的权限困惑场景3:打包与解压,小明的备份操作场景4:使用G…...
k8s 证书更新
如何使用脚本更新Kubernetes集群证书 引言 Kubernetes集群中,由kubeadm初始化的证书有效期默认为一年。当这些证书接近或已经超过有效期时,它们必须被更新以保证集群的正常运作。本文将介绍如何使用特定脚本来更新这些证书,将它们的有效期延…...
网站对公司的重要性/搜索引擎关键词广告
Python提供了一些内建函数用于基本对象类型:cmp(),repr(),str(),type()和等同于repr()的( )操作符 (1)type&am…...
网站手机版管理链接/今日国内新闻头条15条
在linux中如何查看服务器配置也是一个常常要用到的工作linux的硬件配置信息(除存储和外置设备dev)一般放置于/proc目录下,有如meminfo内存信息、cpuinfo主机CPU信息、version系统版本信息等1.比如查看服务器的内存信息cat /proc/meminfo或者free命令2.查看服务器cpu…...
电商运营主要做什么工作/网站运营推广选择乐云seo
51nod 1244 莫比乌斯函数之和 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。具体定义如下: 如果一个数包含平方因子,那么miu(n) 0。例如…...
系部网站开发计划/全面落实疫情防控优化措施
走进异步编程的世界 - 在 GUI 中执行异步操作 【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继《开始接触 async/await 异步编程》、《走进异步编程的世界 - 剖析异步方法》后的第三篇。主要介绍在 WinForm 中如何执行异步操作。 目…...
坪山网站建设哪家效益快/深圳百度总部
1 概述目前,火电机组正向着大容量、高参数的方向发展,其运行安全性和经济性在一定程度上依赖于运行控制水平的高低,因此对运行人员的熟练操作及处理事故的能力有了更高的要求,同时随着机组的自动化控制水平的提高,运行…...
东凤网站/佛山网站建设十年乐云seo
题目描述 53.给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,…...