「网络原理」三次握手四次挥手

2024-06-11 04:12

本文主要是介绍「网络原理」三次握手四次挥手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🎇个人主页: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 表示同意连接

在这里插入图片描述

🍌意义

  1. 三次握手可以初步确认通信链路是否畅通,这是确保可靠性的前提条件
  2. 三次握手可以验证通信双方发送能力和接收能力是否正常

在这里插入图片描述
由此衍生出一道面试题:能否握两次手?四次呢?
A:两次肯定不行,因为服务器这边还无法确认自己的发送能力和对端的接收能力是否正常,因此需要服务端再来一次握手,把信息同步给服务器;四次可以,但是没必要

  1. 三次握手的过程中也会协商一些必要的参数
    通信是客户端和服务器两端共同配合完成的,所以有些参数要进行协商,这些参数往往是在“选项”中体现的

在这里插入图片描述
我们前面说“选项”可有可无,最少占 0 个字节,最多占 40 字节(报头最大长度为 60,去掉固定的 20,就剩下 40 字节)。选项中的信息我们不用去深究,不过有一个信息是比较关键的 —— TCP 通信的序号起始值
TCP 在一次通信过程中,序号不是从 0 或 1 开始的,而是先选择一个比较大的数字,从它开始计算,而且即使是同一个客户端和服务器,每次连接的起始值都不同。这里的“不同”不是随机给一个值,而是经过一系列的分配策略得出的。这样做的好处在于避免处理到上次连接的数据报
数据报在传输过程中遇到阻塞,迟迟没有到达对端,可能在本次连接断开后还没到达,等到下次连接建立时才到达,但此时已经是别的客户端了,不适合处理上次连接的数据报,应该把它丢弃


🍌四次挥手

每个客户端/服务器都要保存对端的信息,这些信息需要使用一定的数据结构来存储,断开连接的本质就是把对端的信息从数据结构中删掉/释放掉
四次挥手中,服务器和客户端其中一方先调用 socket.close(),然后触发 FIN,即向对端发送 FIN 结束报文段
(除了调用 close(),结束进程也会触发 FIN。这两种方式本质都是关闭 socket 文件)
假设是客户端请求断开连接,那么四次挥手流程如下:

在这里插入图片描述
注意四次挥手中间的两步不像三次握手,不一定可以合并

在这里插入图片描述
在这里插入图片描述
下面总结一下这两者之间的相似之处和不同之处
相似点:
都是通信双方中某一方给对方发起一个 syn/fin,交互过程中中间两个数据报是由同一个机器发出的
不同点:

  1. 三次握手中间两次可以合并为一次;四次挥手不一定
  2. 三次握手一定是客户端主动发起连接请求;而四次挥手可以由客户端或服务器发起

🍌TCP 状态转换

前面说 TCP 服务器和客户端都有一定的数据结构保存连接的信息,在数据结构中有个属性叫作状态,操作系统内核根据不同的状态决定应该干什么

🥝LISTENING 状态

表示服务器创建好 serverSocket,并且绑定好端口号了
设定端口号为 5000,启动服务器后在控制台查询服务器状态,得到如下信息:

在这里插入图片描述

🥝ESTABLISHED 状态

表示客户端和服务器已经建立连接(三次握手结束了)
启动客户端后,再次查询状态:

在这里插入图片描述
接下来看一下三次握手中的状态变化

在这里插入图片描述


🥝CLOSE_WAIT & TIME_WAIT 状态

前者表示接下来代码中需要调用 close 来主动发起 FIN。收到对方的 FIN 后会进入这个状态
本端给对方发起 FIN 后,对端也给本端发 FIN 之后,本端就会进入 TIME_WAIT 状态
主动断开连接的一端会进入 TIME_WAIT 状态;被动断开的一端则是进入 CLOSE_WAIT 状态
接下来看一下四次挥手中的状态变化,假设是客户端主动断开 TCP 连接

在这里插入图片描述

这篇关于「网络原理」三次握手四次挥手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp