TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得 注意的状态有两个:CLOSE_WAIT和TIME_WAIT。
1、LISTENING 处于侦听(LISTENING)状态。
2、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协议不推荐使用的,在某些情况下这个操作可能会带来错误。
5、SYN_SENT 表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为 ESTABLISHED,此时SYN_SENT状态非常短暂。但如果发现SYN_SENT非常多且在向不同的机器发出,那你的机器可能中了冲击波或震荡波 之类的病毒了。这类病毒为了感染别的计算机,它就要扫描别的计算机,在扫描的过程中对每个要扫描的计算机都要发出了同步请求,这也是出现许多 SYN_SENT的原因。
例如:cmd 执行 netstat -ano>>D:aa.txt 或 netstat -a -o查看端口占用情况
1 协议 本地地址 外部地址 状态 PID
2 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
3 TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 632
4 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
5 TCP 0.0.0.0:1025 0.0.0.0:0 LISTENING 692
6 TCP 0.0.0.0:1026 0.0.0.0:0 LISTENING 872
7 TCP 0.0.0.0:1027 0.0.0.0:0 LISTENING 1084
8 TCP 0.0.0.0:1029 0.0.0.0:0 LISTENING 776
9 TCP 0.0.0.0:1036 0.0.0.0:0 LISTENING 760
10 TCP 0.0.0.0:1037 0.0.0.0:0 LISTENING 3976
11 TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING 2576
12 TCP 0.0.0.0:7045 0.0.0.0:0 LISTENING 4
13 TCP 0.0.0.0:7046 0.0.0.0:0 LISTENING 4
14 TCP 0.0.0.0:7047 0.0.0.0:0 LISTENING 4
15 TCP 0.0.0.0:7048 0.0.0.0:0 LISTENING 4
16 TCP 0.0.0.0:7049 0.0.0.0:0 LISTENING 4
17 TCP 0.0.0.0:7050 0.0.0.0:0 LISTENING 4
18 TCP 0.0.0.0:7051 0.0.0.0:0 LISTENING 4
19 TCP 0.0.0.0:7070 0.0.0.0:0 LISTENING 2040
20 TCP 0.0.0.0:8000 0.0.0.0:0 LISTENING 4
21 TCP 0.0.0.0:9001 0.0.0.0:0 LISTENING 4
22 TCP 0.0.0.0:9003 0.0.0.0:0 LISTENING 4
23 TCP 0.0.0.0:9011 0.0.0.0:0 LISTENING 4
24 TCP 127.0.0.1:1314 127.0.0.1:1315 ESTABLISHED 1368
25 TCP 127.0.0.1:1315 127.0.0.1:1314 ESTABLISHED 1368
26 TCP 127.0.0.1:1434 0.0.0.0:0 LISTENING 2576
27 TCP 127.0.0.1:1696 0.0.0.0:0 LISTENING 6324
28 TCP 127.0.0.1:1697 0.0.0.0:0 LISTENING 1676
29 TCP 127.0.0.1:4300 0.0.0.0:0 LISTENING 7216
30 TCP 127.0.0.1:4301 0.0.0.0:0 LISTENING 7216
31 TCP 127.0.0.1:5939 0.0.0.0:0 LISTENING 12280
32 TCP 127.0.0.1:5939 127.0.0.1:7454 ESTABLISHED 12280
33 TCP 127.0.0.1:7454 127.0.0.1:5939 ESTABLISHED 11816
34 TCP 127.0.0.1:27382 0.0.0.0:0 LISTENING 8224
35 TCP 192.168.0.77:139 0.0.0.0:0 LISTENING 4
36 TCP 192.168.0.77:1723 65.52.0.51:5671 ESTABLISHED 6324
37 TCP 192.168.0.77:1821 123.151.178.28:80 CLOSE_WAIT 7216
38 TCP 192.168.0.77:2992 192.168.0.163:1433 ESTABLISHED 9352
39 TCP 192.168.0.77:3094 192.168.0.163:445 ESTABLISHED 4
40 TCP 192.168.0.77:3211 192.168.0.163:1433 ESTABLISHED 9352
41 TCP 192.168.0.77:3272 183.61.38.181:80 CLOSE_WAIT 7216
42 TCP 192.168.0.77:6628 192.168.0.163:5900 ESTABLISHED 10100
43 TCP 192.168.0.77:6630 192.168.0.162:5900 ESTABLISHED 9644
44 TCP 192.168.0.77:6727 123.151.176.162:80 CLOSE_WAIT 7216
45 TCP 192.168.0.77:6731 101.201.173.115:80 ESTABLISHED 8696
46 TCP 192.168.0.77:7014 101.201.173.115:80 ESTABLISHED 12076
47 TCP 192.168.0.77:7209 101.201.173.115:80 ESTABLISHED 1408
48 TCP 192.168.0.77:7462 159.8.67.132:5938 ESTABLISHED 12280
49 TCP 192.168.0.77:8235 106.38.181.157:80 CLOSE_WAIT 7216
50 TCP 192.168.0.77:8242 124.232.163.87:5938 ESTABLISHED 12280
51 TCP 192.168.0.77:8244 78.46.49.23:80 FIN_WAIT_2 2040
52 TCP 192.168.1.1:139 0.0.0.0:0 LISTENING 4
53 TCP 192.168.189.1:139 0.0.0.0:0 LISTENING 4
54 TCP 192.168.191.1:53 0.0.0.0:0 LISTENING 1368
55 TCP 192.168.191.1:139 0.0.0.0:0 LISTENING 4
56 TCP 192.168.191.1:8735 0.0.0.0:0 LISTENING 1368
57 TCP [::]:80 [::]:0 LISTENING 4
58 TCP [::]:135 [::]:0 LISTENING 632
59 TCP [::]:445 [::]:0 LISTENING 4
60 TCP [::]:1025 [::]:0 LISTENING 692
61 TCP [::]:1026 [::]:0 LISTENING 872
62 TCP [::]:1027 [::]:0 LISTENING 1084
63 TCP [::]:1029 [::]:0 LISTENING 776
64 TCP [::]:1036 [::]:0 LISTENING 760
65 TCP [::]:1037 [::]:0 LISTENING 3976
66 TCP [::]:1433 [::]:0 LISTENING 2576
67 TCP [::]:7045 [::]:0 LISTENING 4
68 TCP [::]:7046 [::]:0 LISTENING 4
69 TCP [::]:7047 [::]:0 LISTENING 4
70 TCP [::]:7048 [::]:0 LISTENING 4
71 TCP [::]:7049 [::]:0 LISTENING 4
72 TCP [::]:7050 [::]:0 LISTENING 4
73 TCP [::]:7051 [::]:0 LISTENING 4
74 TCP [::]:8000 [::]:0 LISTENING 4
75 TCP [::]:9001 [::]:0 LISTENING 4
76 TCP [::]:9003 [::]:0 LISTENING 4
77 TCP [::]:9011 [::]:0 LISTENING 4
78 TCP [::1]:1434 [::]:0 LISTENING 2576
79 TCP [::1]:1734 [::1]:1736 ESTABLISHED 5384
80 TCP [::1]:1736 [::1]:1734 ESTABLISHED 6324
81 UDP 0.0.0.0:500 *:* 1084
82 UDP 0.0.0.0:4001 *:* 7216
83 UDP 0.0.0.0:4184 *:* 7216
84 UDP 0.0.0.0:4500 *:* 1084
85 UDP 0.0.0.0:5355 *:* 1256
86 UDP 0.0.0.0:51349 *:* 12280
87 UDP 0.0.0.0:51771 *:* 7216
88 UDP 0.0.0.0:54293 *:* 7216
89 UDP 0.0.0.0:54294 *:* 7216
90 UDP 0.0.0.0:54295 *:* 7216
91 UDP 0.0.0.0:55788 *:* 12280
92 UDP 0.0.0.0:57779 *:* 7216
93 UDP 0.0.0.0:58791 *:* 7216
94 UDP 0.0.0.0:59125 *:* 3480
95 UDP 0.0.0.0:59437 *:* 1368
96 UDP 127.0.0.1:1900 *:* 3532
97 UDP 127.0.0.1:61329 *:* 3532
98 UDP 192.168.0.77:137 *:* 4
99 UDP 192.168.0.77:138 *:* 4
100 UDP 192.168.0.77:1900 *:* 3532
101 UDP 192.168.0.77:5353 *:* 12280
102 UDP 192.168.0.77:61328 *:* 3532
103 UDP 192.168.1.1:137 *:* 4
104 UDP 192.168.1.1:138 *:* 4
105 UDP 192.168.1.1:1900 *:* 3532
106 UDP 192.168.1.1:5353 *:* 12280
107 UDP 192.168.173.1:67 *:* 1084
108 UDP 192.168.173.1:68 *:* 1084
109 UDP 192.168.189.1:137 *:* 4
110 UDP 192.168.189.1:138 *:* 4
111 UDP 192.168.189.1:1900 *:* 3532
112 UDP 192.168.189.1:5353 *:* 12280
113 UDP 192.168.191.1:53 *:* 1368
114 UDP 192.168.191.1:67 *:* 1368
115 UDP 192.168.191.1:137 *:* 4
116 UDP 192.168.191.1:138 *:* 4
117 UDP 192.168.191.1:1900 *:* 3532
118 UDP 192.168.191.1:5353 *:* 12280
119 UDP 192.168.191.1:61327 *:* 3532
120 UDP [::]:500 *:* 1084
121 UDP [::]:4500 *:* 1084
122 UDP [::]:5355 *:* 1256
123 UDP [::]:55789 *:* 12280
124 UDP [::1]:1900 *:* 3532
125 UDP [::1]:5353 *:* 12280
126 UDP [::1]:61326 *:* 3532
127 UDP [fe80::1485:f3e1:c20a:89d4%22]:1900 *:* 3532
128 UDP [fe80::58c1:dd0b:8c94:cdcb%30]:1900 *:* 3532
129 UDP [fe80::58c1:dd0b:8c94:cdcb%30]:61324 *:* 3532
130 UDP [fe80::60ee:5c16:dff8:26c6%21]:1900 *:* 3532
131 UDP [fe80::b8dd:2f46:ec42:728d%12]:1900 *:* 3532
132 UDP [fe80::b8dd:2f46:ec42:728d%12]:61325 *:* 3532
活动连接
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.
windows 机器设置
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,右键添加名为TcpTimedWaitDelay的
DWORD键,设置为60,以缩短TIME_WAIT的等待时间
ubuntu机器设置
vi /etc/sysctl.conf
编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p
让参数生效。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
查看系统TCP连接资源命令
netstat
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
一般情况下,系统的socket资源默认5000个。(非官方)
TCP协议中有TIME_WAIT这个状态
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。