首页 > 系统相关 >Linux网络编程(TCP状态转换关系)

Linux网络编程(TCP状态转换关系)

时间:2023-09-09 20:31:52浏览次数:45  
标签:状态 报文 编程 TCP Linux 服务器 WAIT 连接 客户端

(文章目录)


前言

本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。

一、TCP状态转换图

在这里插入图片描述

二、TCP连接状态转换解析

客户端状态转换:

1.CLOSED -> SYN-SENT:当客户端尝试与服务器建立连接时,客户端从CLOSED状态转换到SYN-SEND状态。此时客户端发送SYN(同步)包,表示请求建立连接,并等待服务器的确认。

2.当服务器确认后,发送SYN(同步)包和ACK(确认包)给客户端,客户端依然保持SYN-SEND状态,当客户端接收确认后会发送ACK(确认包)给服务器。

3.服务器接收到ACK(确认包)后就可以进行数据的通信了。此时客户端和服务器都进入了ESTABLISHED状态。

服务器状态转换:

1.CLOSED -> LISTEN:当服务器开始监听传入的连接请求时,服务器从CLOSED状态转换到LISTEN状态。此时服务器准备接收客户端的连接请求。

2.LISTEN -> SYN-RECEIVED:当服务器接收到客户端的连接请求后,服务器从LISTEN状态转换到SYN-RECEIVED状态。服务器发送确认(ACK)包给客户端,并等待客户端确认。

3.SYN-RECEIVED -> ESTABLISHED:当服务器收到客户端的确认(ACK)后,服务器从SYN-RECEIVED状态转换到ESTABLISHED状态。此时连接已经建立,双方可以开始进行数据传输。 在这里插入图片描述

三、TCP断开状态转换解析

在这里插入图片描述

客户端状态转换: 1.ESTABLISHED -> FIN-WAIT-1:当客户端决定终止连接时,客户端从ESTABLISHED状态转换到FIN-WAIT-1状态。客户端发送FIN(终止)包,表示请求终止连接,并等待服务器的确认。

2.FIN-WAIT-1 -> FIN-WAIT-2:当客户端收到服务器的确认(ACK)后,客户端从FIN-WAIT-1状态转换到FIN-WAIT-2状态。此时客户端等待服务器发送确认终止连接的请求。

3.FIN-WAIT-2 -> TIME-WAIT:当客户端收到服务器的确认终止连接的请求后,客户端从FIN-WAIT-2状态转换到TIME-WAIT状态。此时客户端进入等待状态,等待一段时间后才进入CLOSED状态。

4.TIME-WAIT -> CLOSED:经过一段时间的等待后,客户端从TIME-WAIT状态转换到CLOSED状态,表示连接彻底关闭。

服务器状态转换:

1.ESTABLISHED -> CLOSE-WAIT:当服务器决定终止连接时,服务器从ESTABLISHED状态转换到CLOSE-WAIT状态。服务器发送FIN(终止)包给客户端,并等待客户端确认。

2.CLOSE-WAIT -> LAST-ACK:当服务器收到客户端的确认(ACK)后,服务器从CLOSE-WAIT状态转换到LAST-ACK状态。此时服务器等待客户端发送确认终止连接的请求。

3.LAST-ACK -> CLOSED:当服务器收到客户端的确认终止连接的请求后,服务器从LAST-ACK状态转换到CLOSED状态。表示连接彻底关闭。

四、为什么需要有2MLS时长

2MSL(Maximum Segment Lifetime)是指TCP连接在关闭时,需要等待2倍的报文段最大存活时间,即两倍的报文最长生存时间来回收相关资源。这是TCP协议中设定的一个等待时间,用于确保连接双方都收到彼此的终止请求。

2MSL的存在是为了处理网络上可能存在的延迟、重传和乱序等问题,以确保连接的可靠关闭。在TCP连接关闭过程中,双方会交换终止连接的请求和确认,以保证数据传输的完整性和正确性。2MSL的设定时间可以确保在该时间段内,网络中所有与这个连接相关的报文段都能够被丢弃。

具体原因如下:

1.确保彻底关闭连接:2MSL的存在可以确保客户端和服务器都能收到对方的终止请求和确认,避免由于网络上的延迟或乱序等问题导致连接没有完全关闭。在2MSL的时间内,任何已失效的报文段都会被丢弃,从而确保连接彻底关闭。

2.确保旧连接不与新连接冲突:在TCP连接关闭后的一段时间内,可能会出现与之前关闭的连接相关的延迟报文段。如果新的连接使用了之前关闭连接时所用的端口号,这些延迟报文段可能会被错误地接收和处理。通过等待2MSL的时间,确保了旧连接中的所有报文段都已过期,不会与新的连接发生混淆。

3.防止延迟报文段对新连接的影响:在TCP连接关闭后,可能会出现延迟到达的报文段,这些报文段可能是在连接关闭前的最后一瞬间被发送出去的。如果新的连接使用的端口号与这些延迟报文段的源端口号冲突,可能导致报文段被误认为是新连接的一部分而产生错误。2MSL的等待时间可以确保所有延迟报文段都被丢弃,不会对新的连接产生干扰。

总结

本篇文章就讲解到这里,这部分的知识需要大家好好理解和消化。

标签:状态,报文,编程,TCP,Linux,服务器,WAIT,连接,客户端
From: https://blog.51cto.com/u_16153875/7420842

相关文章

  • linux加磁盘
    1.硬盘分区fdisk/dev/vdbnp12个空格w2.创建物理卷pvcreate/dev/vdb13.格式化物理机mkfs.ext4/dev/vdb1使用df-Th看一下文件系统类型4.将新的物理卷添加到卷组vgs看一下卷组名vgextendopeneuler/dev/vdb15.加到逻辑卷lvdisplay查看逻辑卷名lvextend-l+100%FREE......
  • 误删除系统libselinux.so.1
    参考下面链接https://blog.csdn.net/cx881020/article/details/90311908需修改下面命令在问题主机上执行rsync-aPv--port873${server_ip}::tmp/lib64server_ip为正常服务器的IP,并且需要先把libselinux.so.1拷贝到tmp模块指定的目录......
  • 什么是数据库编程中的 Scalar Type
    什么是ScalarType(标量类型)?ScalarType(标量类型)是数据库中的一种基本数据类型,用于表示单个值或原子值。与复杂数据类型(如数组、对象或自定义类型)不同,标量类型表示单一数据项,没有内部结构。ScalarTypes是数据库中的基础构建块,它们用于存储各种类型的数据,包括数字、文本、日期、......
  • 安装Linux操作系统,学习Linux基础
    1.虚拟机与Linux系统安装1.1VirtualBox安装VirtualBox安装经验:1.光驱可在设置虚拟机时设定(设置虚拟机时即可置入Ubuntu)2.若虚拟磁盘路径包含中文,VirtualBox程序右侧会出现问题弹窗,点击可查看问题详情(无法覆盖所选中文名文件夹),文件夹名称改为英文即可1.2Linux系统安装(Ubuntu......
  • linux虚拟机磁盘扩容
    虚拟机磁盘扩容关闭虚拟机->虚拟机菜单->编辑->磁盘->扩展linux分区查看磁盘容量fdisk-l增加分区fdisk/dev/sda(相同的分区前缀名)n进入p进入扩容模式后面默认wq保存退出检查分区情况fdisk-l重启分区格式化查看文件系统格式blkid格式......
  • Linux环境编程-信号管理
    一、基本概念1、中断当进程接收到消息后中止当前正在进行进程,转而去执行其它任务,等其它任务执行结束后再返回刚刚中止的位置,可以继续往下运行,这种执行模式称为中断中断分为硬件中断、软件中断,硬件中断是由硬件设备引发的、软件中断是执行了中断指令引发2、信号信号是一种软件......
  • Linux环境编程-内存管理
    一、内存管理用户层STL  智能指针/容器自动分配、释放   调用C++C++  new/delete           调用CC   malloc/free       调用POSIX\LinuxPOSIX brk/sbrk         调用内核Linux ......
  • Linux环境编程-文件管理
    一、一切皆文件Linux/UNIX操作系统把所有的服务、设备、协议都抽象成文件的形式,提供了一套统一而简单的文件IO的系统调用,简称系统的文件IO也就是说在UNIX\Linux中任何对象都可以被当做是某种特殊的文件,都可以像访问文件一样,访问这些对象通过ls-l命令可以查看文件属性信息,其中......
  • Go 中几种常见的编程模式
    模式可以理解成最佳实践,或者是约定俗成的规范或套路,熟悉一些常见模式可以方便理解项目代码。本文是参考左耳朵耗子的专栏文章做的笔记,另外也缅怀一下耗子叔。slice切片的数据共享与扩容迁移切片的数据共享切片就像是在数组上开的窗口,透过切片窗口可以看到和修改底层数组。这......
  • linux DNS服务器配置
    1、yuminstall-ybind   安装域名服务vim/etc/named.conf这个服务使用 /etc/named.conf 作为配置文件。BIND在那个文件中使用像下面这样的一些语句:options:用于全局BIND配置。logging:配置哪些需要记录,哪些需要忽略。我推荐你看看 Linuxsyslogserver。zone:定......