「TCP 重要机制」三次握手四次挥手

2024-06-16 07:52

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

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

在这里插入图片描述

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



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

相关文章

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Spring中事务的传播机制

一、前言 首先事务传播机制解决了什么问题 Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY; 不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

多头注意力机制(Multi-Head Attention)

文章目录 多头注意力机制的作用多头注意力机制的工作原理为什么使用多头注意力机制?代码示例 多头注意力机制(Multi-Head Attention)是Transformer架构中的一个核心组件。它在机器翻译、自然语言处理(NLP)等领域取得了显著的成功。多头注意力机制的引入是为了增强模型的能力,使其能够从不同的角度关注输入序列的不同部分,从而捕捉更多层次的信息。 多头注意力机

Linux-笔记 线程同步机制

目录 前言 实现 信号量(Semaphore) 计数型信号量 二值信号量  信号量的原语操作 无名信号量的操作函数 例子 互斥锁(mutex) 互斥锁的操作函数 例子 自旋锁 (Spinlock) 自旋锁与互斥锁的区别 自旋锁的操作函数 例子 前言         线程同步是为了对共享资源的访问进行保护,确保数据的一致性,由于进程中会有多个线程的存在,

Spring 集成 RabbitMQ 与其概念,消息持久化,ACK机制

目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding?Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机RabbitMQ 的 Hello - Demo(springboot实现)RabbitMQ 的 Hello Demo(spring xml实现)RabbitMQ 在生产环境

图像处理相关的重要期刊汇总

期刊名称 Impact factor/收录 Image and Vision Computing   (IVC) 1.474 Pattern Recognition Letters 1.303 Artificial Intelligence 3.036 Computer Aided Geometric Design 1.33 Compute

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务,从而实现高效的并发。 关于“并发”和“并行”的区别,这是两个经常被提及但含义不同的概念: 并发(Concurrency):指的是同时处理多个任务的能力,这些任务可能在同一时

ROS话题通信机制实操C++

ROS话题通信机制实操C++ 创建ROS工程发布方(二狗子)订阅方(翠花)编辑配置文件编译并执行注意订阅的第一条数据丢失 ROS话题通信的理论查阅ROS话题通信流程理论 在ROS话题通信机制实现中,ROS master 不需要实现,且连接的建立也已经被封装了,需要关注的关键点有三个: 发布方(二狗子)订阅方(翠花)数据(此处为普通文本) 创建ROS工程 创建一个ROS工程

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文件到Runtim

TCP 可靠传输的工作原理

转载地址:https://my.oschina.net/xinxingegeya/blog/485233 感谢原作者 TCP 可靠传输的工作原理 ARQ(Automatic Repeat-reQuest)(自动重传请求) 停止等待ARQ协议 连续ARQ协议   停止等待ARQ协议 全双工通信的双发既是发送方也是接收方。下面为了讨论问题的方便,我们仅考虑A发送数据而B接受数据