网络协议和Netty(4):大白话说三次握手及用一个数据库连接解释三次握手

本文主要是介绍网络协议和Netty(4):大白话说三次握手及用一个数据库连接解释三次握手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

想起了第一次听说“三次握手”概念的时候。那时候刚到北京,朋友傲娇的跟我讲,我花了两天我终于搞懂了三次握手。当时对网络一无所知的我,还以为是啥新的礼仪方式,心中感叹,帝都人民的热情,握手还要三次。说到半途才搞清楚,原来是TCP创建连接的礼仪。后面空闲的时候,经常从网上找些找些资料,接触“三次握手”。用网友经典的打电话例子,浅浅的理解。时间推移,由浅入深。大概所有人都跟我一开始有同样以下的这个问题:

提问:

为啥TCP建立连接需要进行三次握手?

三次握手

回答问题前,我还是想老生常谈的自己讲解下什么是三次握手。

何为三次握手?

比起语言叙述,有时候图会先的更具体和简单易懂:

 

 

图文讲解

讲解SYN和ACK:

客户端和服务端进行三次握手时除了必要的传输数据,还会有标志位信息。三次握手时,SYN和ACK就是标志位。标志位的作用是,让服务端/客户端根据不同的标志位来确定当前的数据进行对应处理。

比如当服务端发现标志位是SYN=1,就会知道当前的数据是进行第一次握手的请求,然后就会按照第一次握手的规则来处理信息。同样第二次握手时客户端根据SYN=1,ACK=1标志位就会确定是来自服务端的第二次握手的应答请求,然后进行相应的处理。

第一次握手:

由客户端发起,当客户端发起SYN请求后,将客户端状置为SYN_SENT状态,等待服务端确认。此时请求信息中标志位SYN=1,序列Seq=n。

第二次握手:

服务端接收到SYN请求,将Seq在原来值n得基础上加1,赋值Ack=n+1。并且服务端再生成一个序列号m,赋值Aeq=m。服务端应答请求,标志位SYN=1、ACK=1,序列信息Seq=m、Ack=n+1,同时将服务端状态置为SYN_RCVD,等待客户端确认。

第三次握手:

客户端接收到消息,根据标志位SYN=1、ACK=1解析数据,确认Ack=n+1,然后序列赋值Ack=m+1。客户端向服务端发起ACK=1请求。客户端接收到请求,根据标志位ACK=1,校验序列Ack=m+1。校验无误后,将客户端和服务端状态置为ESTABLISHED,建立连接,就可以进行正常的通讯了。

总结:

我们发现所谓三次握手,不过就是客户端和服务端,通过发送三次数据包,来确认连接建立。

我们又知道,TCP的是一个双工连接,即是一个双向连接,就是服务端和客户端都有数据的发送和接收能力。

这就很好的解答了,为何TCP建立连接需要三次握手

客户端和服务端都必须确认数据是否准确的发送和接收,而在三次握手中序列Seq和Ack的发送和接收,就代表着数据的准确发送和接收。

假如进行两次握手,只有客户端校验了自己生成的序列号,确认了自己的发送和接收能力,很明显是不够的。那为啥不能是四次?我只能说,任何事情三次能解决的事,没必要四次,更何况是作为程序员去解决问题。

用一个数据库连接来验证三次握手:

准备:wireshark(抓包工具),navicat(数据库可视化工具),mysql

说明:mysql的连接是一个TCP连接

1.打开wireshark

2.打开navicat

此时并没有创建连接。

3.wireshark编辑捕获器,监听3306端口(mysql连接端口)

4.点击开始

由于3306端口暂无通信所以为空

5.点击navicat其中一个数据库连接

6.我们发现3306端口有数据包

我们先简单看下前三No1、No2、No3

注意标志位和Seq是不是有些似曾相识,和我们上面上述的三次握手是不是有些相似?

详细看下:

第一个包No1:

下方红色框框SYN=1 ,说明这是第一次握手,上方黄色框为客户端生成的序列号Seq=0。

第二个包No2:

 下方红色框框SYN=1 和ACK=1,说明这是第二次握手,上方黄色框为服务端生成序列号Seq=0和应答序列号Ack=1(即Ack=客户端值为0的Seq+1)。

第三个包No3:

下方红色框框ACK=1,说明这是第三次握手,上方黄色框为客户端应答序列号Ack=1(即Ack=服务端生成的seq+1)。

总计:三次握手双方的序列号都校验无误,故三次握手成功,建立连接,所以有了下方的No4,5,6等等的数据传输

 

 

 

 

这篇关于网络协议和Netty(4):大白话说三次握手及用一个数据库连接解释三次握手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904590

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解