TCP状态转移要点
TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。
1、LISTENING状态
FTP服务启动后首先处于侦听(LISTENING)状态。
2、ESTABLISHED状态
ESTABLISHED的意思是建立连接。表示两台机器正在通信。
3、CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭
4、TIME_WAIT
我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。
目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项。但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。
1. socket的状态
1.1 状态说明
CLOSED 没有使用这个套接字[netstat 无法显示closed状态] LISTEN 套接字正在监听连接[调用listen后] SYN_SENT 套接字正在试图主动建立连接[发送SYN后还没有收到ACK] SYN_RECEIVED 正在处于连接的初始同步状态[收到对方的SYN,但还没收到自己发过去的SYN的ACK] ESTABLISHED 连接已建立 CLOSE_WAIT 远程套接字已经关闭:正在等待关闭这个套接字[被动关闭的一方收到FIN] FIN_WAIT_1 套接字已关闭,正在关闭连接[发送FIN,没有收到ACK也没有收到FIN] CLOSING 套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认[在FIN_WAIT_1状态下收到被动方的FIN] LAST_ACK 远程套接字已关闭,正在等待本地套接字的关闭确认[被动方在CLOSE_WAIT状态下发送FIN] FIN_WAIT_2 套接字已关闭,正在等待远程套接字关闭[在FIN_WAIT_1状态下收到发过去FIN对应的ACK] TIME_WAIT 这个套接字已经关闭,正在等待远程套接字的关闭传送[FIN、ACK、FIN、ACK都完毕,这是主动方的最后一个状态,在过了2MSL时间后变为CLOSED状态]
1.2 状态变迁图
摘自《UNIX 网络编程 卷1:套接字联网API》 P35
2. TCP的三次握手和四次挥手
2.1 总结图
左边为客户端的状态转变,后边为服务器的状态转变
2.2 说明
2.2.1 connect返回-1
errno=110(ETIMEDOUT),当服务器端网线拔了的时候,客户端发送SYN过去就会收不到ACK,因此就会出现这个错误,1分钟内就会返 回这个错误。
errno=111(ECONNREFUSED),当服务器未listen时,就会报这个错
2.2.2 ESTABLISHED不一定真的establish
会出现这种情况:client为ESTABLISHED状态而server为SYN_REVD状态。
这是因为LINUX不像其他操作系统在收到SYN为该连接立马分配一块内存空间用于存储相关的数据和结构,而是延迟到接收到client的ACK,即三次握手 真正完成后才分配空间,这是为了防范SYN flooding攻击。 如果是这种情况,那么就会出现client端未ESTABLISHED状态,server为SYN_RECV状态。
并且server的SYN_RECV状态在一定时间后会消失,client的established状态也会消失。这是因为server在SYN_RECV状态时,会像client发送多次的SYN+ACK(因为他以为自己的这个包对方没收到),发送的次数定义在/proc/sys/net/ipv4/tcp_synack_retries中,默认为5.在发送5次之后还没有收到ACK,就将其回收了,所以用netstat查看就看不到这个SYN_RECV状态了。并且会像client发送RST信号。这就会导致client的这种半连接最后也会消失。这个可以通过tcpdump抓包得到(最好知道src这样看到的包比较集中)。
相关推荐
5. FIN_WAIT1:主动关闭(active close)端应用程序调用 close,于是其 TCP发出 FIN 请求主动关闭连接,之后进入 FIN_WAIT1 状态。 6. CLOSE_WAIT:被动关闭(passive close)端 TCP 接到 FIN。 7. FIN_WAIT2:主动...
这个命令将显示当前电脑的所有活动端口,包括 LISTENING、ESTABLISHED、TIME_WAIT 和 CLOSE_WAIT 等状态。 二、电脑端口号的分类 计算机端口可以分为三大类:公认端口、注册端口和动态和/或私有端口。 1. 公认...
1. **连接状态**:包括监听(Listening)、已建立(Established)、关闭等待(Close_Wait)、时间等待(Time_Wait)等。这些状态反映了TCP连接的不同生命周期阶段。 2. **本地地址和端口**:显示本机的IP地址和与...
发送关闭请求的一方会先发送FIN(结束)包,进入FIN_WAIT_1状态。当对方回应ACK后,进入FIN_WAIT_2状态,等待对方关闭。 9. **半关闭(Half-Closed)** 收到FIN包的一方在发送ACK后进入CLOSE_WAIT状态,表示它已经...
- **LISTENING**:表示端口正处在监听状态,即该端口正在等待来自网络的连接请求。 - **ESTABLISHED**:意味着已经建立了连接,即两个设备之间正在通过这个端口进行通信。 - **TIME_WAIT**:表示连接已经结束,...
- **客户端**进入**FIN_WAIT_1**状态。 2. **ACK挥手**: - **服务器**接收到`FIN`段后,会发送一个`ACK`段作为响应,确认收到了客户端的`FIN`请求。此时,客户端到服务器的数据传输已经关闭。 - **服务器**进入...
- **TIME_WAIT**:连接关闭后的一种状态,等待足够的时间以确保最后一个数据包不会丢失。 了解这些状态及其变化对于判断端口活动是否正常至关重要。通过对端口状态的持续监控,可以有效防止未授权访问和其他安全...
1. **连接状态**:TCP连接可以处于不同的状态,如监听(Listening)、已建立(Established)、关闭等待(Close_Wait)、时间等待(Time_Wait)等。TCP View显示每个连接的状态,让用户了解连接是正在通信还是已关闭...
执行上述命令后,将列出所有监听80端口的连接信息,包括协议(TCP/UDP)、本地地址、状态(LISTENING/ESTABLISHED/CLOSE_WAIT等)以及进程ID(PID)。例如,命令输出可能类似于下面的结果: ``` TCP 127.0.0.1:80 0.0.0.0:...
它可以显示每个连接的详细信息,如进程ID、本地和远程IP地址、端口以及连接状态(例如,ESTABLISHED、LISTENING等)。通过这个工具,我们可以快速识别哪些进程在与远程主机通信,以及通信的具体情况。 2. **tcpvcon...
(product name, file description, and so on), the time that the process was created, and the user that created it. In addition, CurrPorts allows you to close unwanted TCP connections, kill the process ...
在TIME-WAIT状态,客户端等待足够时间以确保服务器接收到ACK,然后进入CLOSED状态,完成关闭。 **三、流量控制** 流量控制是TCP的一种机制,防止发送端过快发送数据导致接收端处理不过来。滑动窗口协议是TCP实现...
包括LISTENING(侦听状态)、SYN-SENT(主动发送连接请求的状态)、SYN-RECEIVED(收到并发送连接请求后的等待状态)、ESTABLISHED(已建立连接)、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-...
- TCP状态过滤: 支持如`established`, `syn-sent`, `syn-recv`, `fin-wait-1`, `fin-wait-2`, `time-wait`, `closed`, `close-wait`, `last-ack`, `listening`, `closing`等状态,以及`all`, `connected`, `...