关于TCP连接状态的解释

TCP各个状态主要存在于三次握手和四次挥手的过程

1、TCP建立连接时的三次握手:

服务端应用监听端口处于LISTEN状态,等待建立连接。

第一次握手:客户端发送SYN=一个随机数,然后进入SYN_SENT状态。

第二次握手:服务端收到SYN后,向客户端回应ACK=随机数+1,同时发送SYN=k,然后进入SYN_RCVD状态。

第三次握手:客户端收到ACK后进行验证,并回应SYN,返回ACK=k+1,然后进入ESTABLISHED状态,服务端收到该ACK后进行验证,然后也进入ESTABLISHED状态。

服务端和客户端都进入ESTABLISHED状态后,表示连接建立完成,可以传输数据。

2、TCP断开连接时的四次挥手:

TCP连接中的任一端都可以主动断开连接,应用中一般是客户端主动断开。

客户端向服务器端发送FIN,表示要断开连接,然后进入FIN_WAIT1状态。

服务端收到FIN后,回应ACK,然后进入CLOSE_WAIT状态。此时,服务端只能发送数据,不能接收数据。等服务端将缓冲区的数据发送完成后,向客户端发送FIN,然后进入LAST_ACK状态。

客户端收到FIN的ACK后,进入FIN_WAIT_2状态,此时客户端无法再发送数据,只能接收数据。客户端收到服务端发来的FIN(表示服务端已将缓冲区的数据发送完成),向服务端回应ACK(确认客户端已经收到该FIN),然后客户端进入TIME_WAIT状态。

服务端收到ACK后,也进入TIME_WAIT状态,客户端进入TIME_WAIT状态后,在等待等待2*MSL时间,进入CLOSED状态,连接关闭。

关于MSL时间:

MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为tcp报文(segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文,而ip头中有一个TTL域,TTL是time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。 2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。 TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

原文地址:https://www.cnblogs.com/ahaii/p/8442634.html

时间: 2024-08-30 04:16:12

关于TCP连接状态的解释的相关文章

TCP连接状态具体解释

tcp状态: LISTEN:侦听来自远方的TCPport的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ESTABLISHED:代表一个打开的连接 FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认 FIN-WAIT-2:从远程TCP等待连接中断请求 CLOSE-WAIT:等待从本地用户发来的连接中断请求 CLOSING:等待远程TCP对连接中断的确认 LAST-ACK:等待

TCP连接状态及TIME_WAIT

参考: TCP连接中的TIME_WAIT状态 - sunnydogzhou的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/sunnydogzhou/article/details/6572071 TCP连接状态详解及TIME_WAIT过多的解决方法_小强_新浪博客 http://blog.sina.com.cn/s/blog_8e5d24890102w9yi.html TCP协议三次握手连接四次握手断开和DOS攻击 - NowOrNever - 博客频道 -

查看 并发请求数及其TCP连接状态

服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc -l 3).统计已连接上的,状态为"establishednetstat -na|grep ESTABLISHED|wc -l 4).查出哪个IP地址连接最多,将其封了.netstat -na|grep ESTABLISHED|awk {print $5}|awk -F: {print $1}|s

zabbix监控硬盘指标,tcp连接状态

zabbix自动发现硬盘脚本disk_discovery.py [[email protected] etc]$ cat disk_discovery.py #/usr/bin/python import subprocess import json args="cat /proc/diskstats |grep -E '\ssd[a-z]\s|\sxvd[a-z]\s|\svd[a-z]\s'|awk '{print $3}'|sort|uniq 2>/dev/null" t=

tcp连接状态以及netstat命令

tcp是可靠的数据传输协议,相对于udp来说,基于udp的通信速度更快,但是没有数据的完整性的保证,更重要的是udp不会保证数据是否到达了目的方. TCP协议建立的tcp连接是有状态的,称之为tcp的有限状态机 SYN_SENT:主动建立连接的一方发起连接建立请求,也就是SYN=1,当发出同步位,状态转换位SYN_SENT SYN_RCVD:服务器端收到了客户端发送的同步报文,按照tcp协议的规定,回复ACK报文同时SYN位至1,此时服务器的状态转换为SYN_RCVD ESTABLISHED:当

查看并发请求数及其TCP连接状态

服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ps -ef|grep httpd|wc -l 3).统计已连接上的,状态为"established netstat -na|grep ESTABLISHED|wc -l 4).查出哪个IP地址连接最多,将其封了. netstat -na|grep ESTABLISHED|awk {print $5}|awk -F: {print $

TCP三次握手及TCP连接状态 TCP报文首部格式

建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图: 开个玩笑 ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1 SYN(SYNchronization同步):在连接建立用来同步序号.当SYN=1而ACK=0时,表明这是一个连接请求报文.对方若同意建立连接,则应在响应报文中使用SYN=1 ACK=1因此,SYN置1表示这是一个连接请求或连接接受报文 FIN(FINIS)即完,终结的意思,用来释放一个连接.当FIN=1时,表明此报文段发

TCP连接状态详解及TIME_WAIT过多的解决方法

TCP建立连接的三次握手过程,以及关闭连接的四次握手过程. TCP建立连接的三次握手过程,以及关闭连接的四次握手过程. 1.建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1. (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志.因此它表示对刚才客户端SYN报文的回应:同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯. (3) 客户必须再次回应服务段一个ACK报文,这是报文段3. 2.连接

查看http的并发请求数及其TCP连接状态

统计80端口的连接数据 netstat -nat | grep -i "80" | wc -l 统计httpd协议连接数 ps -ef | grep httpd | wc -l 统计已连接的,状态为establish的 netstat -na | greo ESTABLISH | wc -l 查出那个IP连接最多,并将其封掉 netstat -na | grep ESTABLISH | awk {print $5} | awk -F:{print $1}| sort | uniq -c