TCP三次握手与四次挥手

什么是三次握手?

一般情况下,连接是由客户端向服务端发起的。

第一次,客户端发送一个TCP数据报并将SYN同步位置为1,表示要建立连接,此时客户端会从CLOSED状态变为SYN_SEND状态;

第二次是服务端向客户端发送ACK,并且也将SYN置为1,一是表示自己收到了客户端建立连接的请求,并且从LISTEN状态变为SYN_RCVD,二是表示自己要建立连接;

当客户端收到服务端的ACK + SYN后,便会处于ESTABLISHED状态,并且发送第三次握手,表示自己收到了客户端的SYN。当服务端收到客户端的ACK后,便会从SYN_RCVD状态变为ESTABLISHED状态。

此时,双方的连接才算真正的建立。

为什么需要三次握手,而不是两次握手或者四次握手?

1.双方之所以进行多次握手,本质上还是因为信道是不可靠的。

由于TCP本身的要求是可靠连接,因此,客户端和服务端都必须确认,对方的收发能力都是正常的。因此,当第二次握手结束,客户端就可以确保服务端的收发能力正常,建立起连接,但是,服务端只能确保客户端的发送能力正常,因此必须等收到第三次握手的ACK后才会建立连接。

理论上四次五次都可以,但是三次就可以保证,所以是三次握手。

2.最好是奇数次握手

在socket编程时,服务端一般是先listen再accept。也就是说,发起连接的都是客户端。

谁发送最后的ACK,谁就会先建立连接。如果是偶数次,那么最后一次发送ACK的就是服务端。一般情况下,服务器比客户端的数量是1:n,众所周知,维护连接是需要付出时间和空间成本的,比如需要在内核建立相关结构体,如果服务器建立连接而客户端未建立,那么服务端可能会有多个空连接,这其实是不利于服务器的。

奇数次的握手是一种成本转移,即便出现空连接的现象,成本也会分摊在多个客户端身上,而不至于给服务端太大压力。

什么是四次挥手?

四次挥手与三次握手对应,是断开连接的过程。

由于双方之前进行了大量数据的交互,因此通过发送与确认机制就可以保证双方连接的断开。

首先断开的一方会发送FIN,便会处于FIN_WAIT_1状态,只要收到ACK后,便会处于FIN_WAIT_2状态。表示自己关闭了发送缓冲区,不再发送数据,但依然具有接受数据的能力。

而另一方收到FIN后,便会处于CLOSE_WAIT状态,即半关闭状态。它还可以继续发送数据,当数据发送完毕后,又会发送FIN,当收到ACK后便关闭自己的发送缓冲区。

这就是四次挥手。

为什么是四次?

我们在写客户端或者服务端时,都有一个close(fd),即关闭文件描述符的操作。每一个close代表的就是两次挥手。

如果说只有两次,也就是说一方在执行代码逻辑时没有执行close(fd),第一,会造成文件描述符泄露,第二,会发现这一端存在CLOSE_WAIT状态的连接,即半关闭状态。这种状态并没有释放连接相关的数据和结构体,其实也会造成内存泄漏。

为什么四次挥手后,主动断开连接的一方会先进入TIME_WAIT状态?

四次挥手的前三次,由于超时重传机制的存在,可以保证一定被对方收到,但是最后一次的ACK,是可能丢失的。如果四次挥手后,主动断开的一方直接CLOSED,那么将无法保证最后一个ACK被对方收到。

如果ACK丢失,对方就会重新发送FIN,如果处于CLOSED状态,将不会收到FIN,使得对方长时间处于LAST_ACK状态,并且多次发送FIN消耗资源。因此,通过TIME_WAIT,可以较大概率地保证最后一个ACK被对方收到。

另一个原因是可以保证信道上的数据尽可能的消散,防止断开连接后又立马重新建立连接后,产生的数据错误等问题。

为什么TIME_WAIT是2MSL?

2MSL是两个最大报文段寿命,ACK丢失最多是一个MSL,再次收到重传的FIN最多是一个MSL,因此2MSL可以尽可能的保证在CLOSE之前收到对方重传的FIN。

Original: https://www.cnblogs.com/Grong/p/15969883.html
Author: 乌有先生ii
Title: TCP三次握手与四次挥手

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585739/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 容器的监控:使用cAdvisor,weavescope监控容器

    一.系统环境 二.前言 三.容器监控的原理 四.使用docker stats监控容器 五.部署cadvisor监控容器 六.部署weavescope监控容器 一.系统环境 服务器版…

    Linux 2023年6月7日
    0129
  • redis出现错误:NOAUTH Authentication required.

    出现认证问题,应该是设置了认证密码,输入密码既可以啦 注意密码是字符串形式! 127.0.0.1:6379> auth "yourpassword" 密码…

    Linux 2023年5月28日
    083
  • 计算机网络通信

    早期:联机 以太网:局域网与交换机 广播 主机之间”一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息…

    Linux 2023年6月14日
    094
  • Redis 事务

    一、概述 和传统关系型数据库一样,Redis 同样是支持事务的。Redis 的事务可以通过 MULTI/EXEC/DISCARD/WATCH 等命令来实现。 二、事务的 ACID …

    Linux 2023年5月28日
    099
  • OpenStack cinder对接NFS后端存储

    配置NFS服务 安装NFS服务 查询是否安装 [root@nfs ~]# rpm -qa |grep nfs nfs-utils-1.3.0-0.8.el7.x86_64 如没有安…

    Linux 2023年6月8日
    0136
  • 【Hash篇】哈希计算神器-HashMyFiles

    可直接拖放、复制粘贴、添加文件或文件夹的方式来批量计算Hash,操作简便、体积小、免费。这篇来介绍他的汉化和其它一些功能设置—【suy】 目录 1、绿色便携 2、批量算…

    Linux 2023年6月13日
    0106
  • Spring Boot 项目部署到 Linux服务器

    1.首先将SpringBoot项目打包成JAR包,然后通过FTP工具上传到Linux,执行如下命令: java -jar xxx.jar & 该命令执行后,启动jar,一旦…

    Linux 2023年6月14日
    072
  • 性能瓶颈分析与调优

    对于性能测试,很多时候压力并不能完全到达服务端,在客户端、网络连接端都有可能被阻塞,或者压测的某些特征符合CC和DDoS的行为,触发了防护策略导致压测结果达不到预期。 以下是各节点…

    Linux 2023年6月8日
    0100
  • redis主从复制

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 特性: 运行在内存中的数据集工作方式 支持多种数据结构 提供不同级别的磁盘持…

    Linux 2023年5月28日
    082
  • css或html中添加空格

    posted @2022-08-03 16:31 七窍玲珑心 阅读(8 ) 评论() 编辑 Original: https://www.cnblogs.com/lzh93/p/16…

    Linux 2023年6月13日
    0114
  • NO.1 通讯录管理系统+源代码(C++)

    功能描述:显示简单的菜单,供用户选择操作 实现步骤:直接cout输出 功能描述:根据用户不同的操作代码选择,进入不同的功能,我们使用switch分支结构进行搭建 实现步骤:用whi…

    Linux 2023年6月7日
    0178
  • subprocess模块简介

    subprocess模块可以执行系统命令,该模块允许用户创建一个新的进程,该进程会连接到input|output|error管道并获取到返回的状态码。 本文版本是以python3….

    Linux 2023年6月7日
    078
  • ServiceHub.DataWarehouseHost.exe内存泄漏问题的处理

    ServiceHub.DataWarehouseHost.exe内存泄漏问题的处理。 Visual Studio 2017的15.2版本在debug应用程序时,ServiceHub…

    Linux 2023年6月7日
    0110
  • Linux内核模块管理(命令)

    1.什么是 Linux 内核模块? 内核模块是可以根据需要加载到内核中或从内核中卸载的代码块,因此无需重启就可以扩展内核的功能。事实上,除非用户使用类似lsmod这样的命令来查询模…

    Linux 2023年6月8日
    094
  • [数据库]ACID、CAP、BASE特性

    SQL与noSQL 对比项 关系型SQL 非关系型SQL 关系表 数据集(键值/JSON文档/哈希表/其它) 结构化、提前定义表结构 动态调整模式,非结构化 纵向扩展,提高处理能力…

    Linux 2023年6月13日
    089
  • zabbix监控配置流程

    1.0 zabbix监控配置流程详细 管理角度: 开发 由开发人员提供监控指标来监控 运营 让其找开发要监控指标 运维 直接加 配置角度: 创建主机 创建主机组并加入主机 添加监控…

    Linux 2023年6月7日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球