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)

大家都在看

  • 统计Redis中各种数据的大小

    如果 MySQL 数据库比较大的话,很容易就能查出是哪些表占用的空间; 不过如果 Redis 内存比较大的话, […] Meet so Meet. C plusplus…

    Linux 2023年5月28日
    095
  • Zabbix-企业级监控系统

    Zabbix-企业级监控系统 Zabbix 手册-官网 1.Zabbix简介 Zabbix 是一款监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康和完…

    Linux 2023年6月13日
    084
  • 每周一个linux命令(netstat)

    基础环境 netstat 命令介绍 打印网络连接、路由表、接口统计信息、伪装连接和多播成员,使用最多的是打印网络连接信息。 netstat 命令安装 yum install net…

    Linux 2023年6月8日
    0100
  • Linux(RedHat、Ubuntu)安装docker

    Linux(RedHat、Ubuntu)安装docker 前言 docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的…

    Linux 2023年6月6日
    0104
  • Linux下的文件打包与解压

    tar的命令只用来打包文件,如需要压缩文件就需要调用参数来实现 -c 建立新的&#x…

    Linux 2023年5月27日
    0114
  • Ubuntu2004使用dnsmasq+Clash+Iptables+Ipset

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月13日
    093
  • Shell命令

    1.shell命令的执行机制:fork+exec执行命令(任何的shell都会执行) 2.shell中的用户输入处理 1 命令行参数:选项、参数 2 运行时输入 3 read命令:…

    Linux 2023年6月6日
    0108
  • [20220302]oracle如何定位使用library cache mutex 2.txt

    [20220302]oracle如何定位使用library cache mutex 2.txt –//这个问题实际上困扰我很久,我开始以为library cache b…

    Linux 2023年6月13日
    088
  • Rabbitmq安装与部署

    安装包otp_src_22.3.tar.gz,下载到部署服务器tar -zxvf解压 mv otp_src_22.3 ./erlang变更文件夹名字 可能需要安装的依赖包 yum …

    Linux 2023年5月27日
    0108
  • AI场景存储优化:云知声超算平台基于 JuiceFS 的存储实践

    云知声是一家专注于语音及语言处理的技术公司。 Atlas 超级计算平台是云知声的计算底层基础架构,为云知声在 AI 各个领域(如语音、自然语言处理、视觉等)的模型迭代提供训练加速等…

    Linux 2023年6月14日
    099
  • 前端Web实训项目-教务系统成绩查询

    通过暑期前半个月实训,我们选的方向是Web前端(虽然我想选Java全栈的),所以我们最终确立的主题是做一个网页。 这个项目是我们组四个人做的,因为技术水品都不咋样,所以有很多地方需…

    Linux 2023年6月7日
    0124
  • Redis主从复制

    一、主从复制 1、redis为什么还要主从复制? 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支…

    Linux 2023年5月28日
    081
  • WPF 已知问题 Popup 吃掉 PreviewMouseDown 事件

    在 WPF 中,使用 Popup 也许会看到 PreviewMouseDown 事件被吃掉 因为 PreviewMouseDown 是 RoutingStrategy.Direct…

    Linux 2023年6月6日
    0134
  • Linux上传下载神器之 lrzsz

    在开发的过程中,经常遇到 需要在 Linux 和 Windows 之间上传下载文件的情况 这时,一般都是使用 FTP 或者 WinSCP 工具进行上传下载, 虽然也能解决问题,但是…

    Linux 2023年6月13日
    094
  • Null和空值对于avg计算时产生的影响以及处理

    为什么要关注这一块呢:1.面试中可能会有涉及 2.工作中真的也可能会用,既然有可能我也用过,就拿出来跟大家分享一下,上一篇的博文,数据已准备好就不做数据准备的介绍了。 step1:…

    Linux 2023年6月14日
    089
  • 【原创】Linux虚拟化KVM-Qemu分析(九)之virtio设备

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

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