TCP四次挥手

这篇具有很好参考价值的文章主要介绍了TCP四次挥手。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

什么是TCP四次挥手 ? 

TCP 四次挥手过程是怎样的?

为什么挥手需要四次?

第一次挥手丢失了,会发生什么?

第二次挥手丢失了,会发生什么?

接收到第二次挥手后的两种场景

第三次挥手丢失了,会发生什么?

第四次挥手丢失了,会发生什么?

为什么 TIME_WAIT 等待的时间是 2MSL?

为什么需要 TIME_WAIT 状态?

TIME_WAIT 过多有什么危害?

服务器出现大量 TIME_WAIT 状态的原因有哪些?

如何优化 TIME_WAIT?

服务器出现大量 CLOSE_WAIT 状态的原因有哪些?​


什么是TCP四次挥手 ? 

我们知道TCP协议是有连接的,可靠性传输,全双工,面向字节流的传输层协议, 使用TCP协议在客户端和发送端传输数据前,必须先建立连接,传输数据完成之后,就要断开连接.而对于四次挥手来说就是用来TCP断开连接的.

TCP 四次挥手过程是怎样的?

四次挥手,tcp/ip,网络,服务器

  • 首先客户端要关闭连接,先把报文中标志位FIN置为1,然后向服务端发送FIN报文表示要关闭连接.之后客户端进入FIN_WAIT1状态
  • 服务端收到客户端发来的FIN报文之后,内核会自动回复一个ACK给客户端,之后服务端进入CLOSED_WAIT状态.
  • 等待服务端进程调用close函数,也就是等待服务端处理完数据之后,服务端在给客户端发送FIN报文表示请求断开连接,之后服务端进入LAST_ACK状态
  • 客户端收到服务端发来的FIN报文之后,会回复最后一个ACK报文,客户端进入TIME_WAIT状态,2MSL后,进入closed状态  (注意只有主动关闭连接的一方才会有TIME_WAIT状态)
  • 服务端接收到客户端的最后一个ACK报文后,就会进入closed状态,关闭连接

为什么挥手需要四次?

首先根据四次挥手的过程可以知道每一方都要发送一个FIN报文和一个ACK报文

  • 客户端发送FIN报文表示请求断开连接,仅仅表示客户端不在发送数据了,但是还能够接收数据
  • 服务端收到客户端的FIN报文后,内核会自动的回复ACK报文,等待服务端进程调用close函数,也就是等待服务端进程处理完数据之后,服务端会向客户端发送FIN报文,表示要断开连接.

可以看出,服务端发送的ACK报文并不能和FIN报文结合在一起发送,因为要等待服务端进程处理完数据之后才可以关闭连接, 所以是四次挥手.

第一次挥手丢失了,会发生什么?

我们知道首先客户端会向服务端发送FIN报文表示客户端想要断开连接,之后客户端进入FIN_WAIT1状态,服务端接收到客户端的FIN报文之后内核立即会返回一个ACK报文.

如果第一次挥手丢失,也就是客户端发送给服务端的FIN报文丢失,那么当客户端没有收到服务端发送的ACK报文,就会触发超时重传机制,如果之后接收到了ACK,报文会继续进入四次挥手过程,如果没有 会继续重传,达到重传次数 客户端还没有收到ACK报文,那么会等待一段时间一般是上一次报文发送时间的2倍, 如果还没有收到,客户端会主动关闭连接

第二次挥手丢失了,会发生什么?

服务端收到客户端发送的FIN报文之后,会回复给客户端ACK报文,如果ACK报文丢失,客户端没有收到服务端的ACK报文,那么客户端就会超时重传FIN报文,如果之后接收到了ACK,报文会继续进入四次挥手过程,如果没有 会继续重传,达到重传次数 客户端还没有收到ACK报文,那么会等待一段时间一般是上一次报文发送时间的2倍, 如果还没有收到,客户端会主动关闭连接

接收到第二次挥手后的两种场景

当客户端接收到服务端返回的ACK报文之后,就会等待服务端发送FIN报文,这段时间客户端处于FIN_WAIT_2的状态.

如果是close函数关闭的连接,表示不能够发送和接收数据,所以处于FIN_WAIT_2状态有时长限制,一般为60s,如果超过这个时长客户端还没有收到服务端的FIN报文,那么客户端就会主动关闭连接.

如果是shutdown函数关闭的连接,表示只是不能发送数据,但是可以接收数据,如果一直没有收到服务端发送的FIN报文也就是第三次挥手,会一直死等下去.

第三次挥手丢失了,会发生什么?

当服务端进程处理完数据之后就会进行关闭连接,内核就会向客户端发送FIN报文表示请求关闭连接,之后服务端就会进入LAST_ACK状态,会等待客户端返回的ACK报文.

当服务端进程调用close函数的时候->数据处理完之后才可以关闭连接,内核没有权利替代服务端关闭连接,必须由服务端主动调用close函数来关闭连接

如果服务端一直没有收到客户端返回的ACK报文,那么就会触发超时重传,服务端会重传FIN报文,如果之后接收到了ACK,服务端进入closed状态,如果没有 会继续重传,达到重传次数 客户端还没有收到ACK报文,那么会等待一段时间一般是上一次报文发送时间的2倍, 如果还没有收到,服务端会主动关闭连接.

另外呢,如果是使用的close函数关闭的连接,如果超过时长tcp_fin_timeout限制一般为60s,不会一直处于FIN_WAIT_2状态,客户端会主动关闭连接.

第四次挥手丢失了,会发生什么?

当服务端处理完数据之后就会调用close函数来关闭连接,会给客户端发送FIN报文,服务端进入LAST_ACK状态,客户端收到之后会返回一个ACK报文,客户端进入Time_WAIT状态等待2MSL后进入close状态,服务端接收到最后一个ACK报文之后进入closed状态.

如果第四次挥手丢失,也就是客户端返回的ACK丢失,服务端就会触发超时重传机制,重传FIN报文,如果之后服务端接收到了ACK,服务端就会进入closed状态,如果没有, 会继续重传,达到重传次数服务端还没有收到客户端发来的ACK报文,那么会等待一段时间一般是上一次报文发送时间的2倍, 如果还没有收到,服务端会主动关闭连接

另外,客户端收到第三次挥手之后,客户端返回给服务端ACK报文,客户端就会进入TIME_WAIT状态,会等待2MSL,如果中途再次收到第三次挥手,会重置定时器, 当等待2MSL之后,客户端就会主动关闭连接进入closed状态.

为什么 TIME_WAIT 等待的时间是 2MSL?

首先说什么是MSL,TTL,以及两者的关系

MSL就是最大的报文生成时间,MSL是网络报文生存的最长时间,超过这个时间,报文将会被丢弃,因为TCP是基于IP协议的,TTL是经过路由器的最大跳数,每经过一个路由器,TTL就减一,当减到0的时候报文就会被丢弃,同时发送ICMP报文给源主机.

TTL 与 MSL的区别 : TTL是经过路由的最大跳数,MSL是报文生存的最长时间,要确保MSL>=TTL才能保证报文是正常消亡.

为什么要等待2MSL呢 ?

原因是 在网络中可能来自发送方发来的数据报,然后接收方要给对方一个响应. 这样报文一来一回的时间就是2MSL.

比如当最后一个ACK报文丢失(也就是第四次挥手丢失),服务器那边就会触发超时重传机制,重传FIN报文,当FIN报文到达客户端,客户端再回一个ACK响应,这样一来一回等待的时间是2MSL.

2MSL时长允许报文至少丢失一次,当ACK报文丢失的时候,重发的FIN会在第二个MSL到达客户端,这样TIME_WAIT状态就可以应对.2MSL是当第三次挥手到达客户端的时候就会开始计时,当中途FIN报文再次到达客户端,定时器就会被重置为2MSL.

为什么不是 4MSL或者8MSL呢 ?

由于丢包概率很小,加入丢包概率为1/100,那么第二次丢包就是1/10000, 所以我们可以忽略,性价比会更高.

为什么需要 TIME_WAIT 状态?

主要有两个原因

  • 防止旧的报文进入了相同的四元组连接中
  • 能够保证被动关闭方正常关闭.

防止旧的报文进入了相同的四元组连接中

四次挥手,tcp/ip,网络,服务器

假设没有Time_WAIT状态或者TIME_WAIT时间太短 , 会发生如上情况 . 首先因为报文发送了但是被网络延迟,所以触发超时重传机制,重传该报文,然后对方返回ACK报文,之后就进行四次挥手,又开启了一个四元组相同的连接(源ip,端口,目的ip,端口相同的连接),这时因网络延迟的报文刚好到达,也正好在接收方的接收窗口内,导致接收方错误的接收历史报文.

为什么会造成历史报文会被新的四元组连接接收呢 ?

原因是 与序列号有关.因为序列号会发生回绕现象并不是无限递增的

我们再来回顾一下 序列号 与 初始化序列号.

  • 序列号 : 序列号是一个TCP报头的字段,在使用TCP协议的时候,因为TCP是面向字节流的协议,所以双发会按照字节为单位发送数据,字节的编号就是序列号为了保证TCP协议的顺序性和可靠性,序列号可以保证发送的报文到达接收端不会乱序,丢失后重传,接收重复的数据会丢弃,收到数据后确认, 序列号每增加到4G就会发生回绕(也就是会再次从0开始)-->并不是无限递增的.
  • 初始化序列号 : 在TCP建立连接的时候(发送三次握手),就会为双方各自生成一个初始化序列号,要确保每一个连接都要有不同的初始化序列号,三次握手时也要同步双方的初始化序列号.初始化序列号基于时钟周期,可以认为是一个32位的计数器,每4微秒+1,循环一次需要4.55小时

如果有了TIME_WAIT状态,在TIME_WAIT状态这2MSL中就能够确保任意一方的报文都自然地消失在网络中,保证新的连接中不会出现历史报文,一定是新连接所产生的报文.

能够保证被动关闭方正常关闭.

四次挥手,tcp/ip,网络,服务器

假设如果没有TIME_WAIT状态或者TIME_WAIT状态时间过短,接收方收到对方的FIN报文,返回个ACK报文,立马就进入了closed状态,当返回的ACK报文丢失,发送方会重传FIN报文,但是接收方已经进入了closed状态,就会回一个RST报文,这样发送方结束到一个错误的终止,就会异常的关闭连接, 这样对于TCP可靠性传输协议并不是正常的终止方式.

 如果有了TIME_WAIT状态,并且不会过短,也就是2MSL,他就在这等待2MSL的期间,1MSL期间ACK丢失,第二个MSL会重传FIN报文刚好2MSL,接收到重传的FIN报文就会重置定时器为2MSL. 这2MSL是至少允许最后一个ACK丢失一次.

TIME_WAIT 过多有什么危害?

TIME_WAIT状态过多主要是由两种危害 :

  • 占用端口资源,端口是有限的
  • 占用系统资源,比如内存资源,文件描述符,cpu资源,线程资源.....

TIME_WAIT过多主要分为两种情况,一种是客户端TIME_WAIT过多,一种是服务端TIME_WAIT状态过多.

如果是客户端的TIME_WAIT状态过多 : 

我们知道只有主动断开连接的一方才会有TIME_WAIT状态,客户端的TIME_WAIT过多可能导致占用大量的端口,把端口占满了从而使得客户端无法再跟同一个IP+端口相同的服务端进行通信了,但是由于端口是可以重复使用的所以也可以跟不同的服务端进行连接,因为内核在定位一个连接的时候是通过TCP四元组(源ip,目的ip,源端口,目的端口)来定位的

如果是服务端的TIME_WAIT状态过多:

由于服务端是固定监听某一个端口的,所以不会导致占用过多的端口资源,但由于服务端一直主动断开连接,开启过多的TCP连接,导致占用大量的内存资源,文件描述符,CPU资源,线程资源...

服务器出现大量 TIME_WAIT 状态的原因有哪些?

如何优化 TIME_WAIT?

服务器出现大量 CLOSE_WAIT 状态的原因有哪些? ​

参考小林coding计算机网络部分: 小林coding文章来源地址https://www.toymoban.com/news/detail-757723.html

到了这里,关于TCP四次挥手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP IP网络编程(四) 基于TCP的服务器端、客户端

    TCP/IP协议栈 ​ TCP/IP协议栈 TCP/IP协议栈共分为4层,可以理解为数据收发分成了4个层次化过程。 ​ TCP协议栈 ​ UDP协议栈 链路层 链路层是物理连接领域标准化的结果,也是最基本的领域,专门定义LAN、WAN、MAN等网络标准。两台主机通过网络进行数据交换,这需要像下图所示

    2024年01月16日
    浏览(55)
  • 【计算机网络】 TCP——四次挥手

    主动方打算关闭连接,此时会发送一个TCP首部FIN标志位被置为1的报文,也即FIN报文,之后主动方进入FIN_WAIT_1状态。 被动方收到该报文后,就向主动方发送ACK应答报文,接着被动方进入CLOSE_WAIT状态。 主动方收到被动方的ACK应答报文后,进入FIN_WAIT_2状态。 等待被动方处理完数

    2024年02月09日
    浏览(41)
  • 《TCP/IP网络编程》阅读笔记--基于TCP的服务器端/客户端

    目录 1--TCP/IP协议栈 2--TCP服务器端默认函数调用顺序 3--TCP客户端的默认函数调用顺序 4--Linux实现迭代回声服务器端/客户端 5--Windows实现迭代回声服务器端/客户端 6--TCP原理 7--Windows实现计算器服务器端/客户端         TCP/IP协议栈共分 4 层,可以理解为数据收发分成了 4 个层

    2024年02月10日
    浏览(64)
  • TCP IP网络编程(五) 基于TCP的服务器端、客户端 (补充)

    回声客户端出现的问题 在上一节基于TCP的服务器端、回声客户端中,存在问题: 如果数据太大,操作系统就有可能把数据分成多个数据包发送到客户端,客户端有可能在尚未收到全部数据包时就调用read函数 问题出在客户端,而不是服务器端,先来对比一下客户端与服务器端

    2024年02月09日
    浏览(67)
  • TCP/IP 三次握手&四次挥手详解,以及异常状态分析

    1.TCP/IP 三次握手 TCP/IP 三次握手过程 主要依靠IP协议报文中的 SYN ACK 两个标识位,SYN 表示是请求连接的报文,ACK 表示确认报文的请求 过程: 客户端处于 CLOSE 状态,服务器处于 LISTEN 状态,客户端向服务器发送请求连接报文,SYN=1 seq=x,发送成功后,客户端状态修改为 SYN_SEND

    2024年02月22日
    浏览(38)
  • 网络连接管理除了TCP三次握手,还有TCP四次挥手

    网络通信 建立连接 ,TCP会进行三次握手,三次握手主要是两个主机之间建立连接,和其他没有什么关系,那么两个主机之间是如何进行三次握手的呢?他们又会使用什么操作来建立连接呢? 这里我们先了解一下TCP的报文结构: 三次握手主要是理解成客户端与服务器经过三次

    2024年02月07日
    浏览(63)
  • 计算机网络之TCP四次挥手

    定义:建立一个连接需要三次握手,而终止一个连接要经过四次挥手;这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力 刚开始双方都处于ESTABLISHED 状态,假如是客户端先发起关闭请求。四次

    2024年02月13日
    浏览(32)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(89)
  • 【网络】TCP通讯(三次握手、四次挥手;滑动窗口;TCP状态转换;端口复用;TCP心跳检测机制)

     前言:建议看着图片,根据文字描述走一遍TCP通讯过程,加深理解。 目录 TCP通信时序: 1)建立连接(三次握手)的过程: 2)数据传输的过程: 3)关闭连接(四次挥手)的过程: 滑动窗口 (TCP流量控制): TCP状态转换: 半关闭: 2MSL: 程序设计中的问题: 端口复用:

    2024年02月07日
    浏览(61)
  • 【网络原理】TCP连接管理机制(三次握手四次挥手)

    🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 在使用TCP协议进行网络交互时,TCP会进行三次握手即建立连接,TCP四次挥手即断开连接。三次握手与四次挥手后就完成了网络交互,这样的操作也叫TCP的连接

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包