一.TCP连接概述 不管建立连接还是断开连接,假如在超时时间外客户端或者 server没有收到回复,端口状态直接转换成 closed状态。客户端指定随机端口, server端指定固定端口。比较关注的的端口状态有 ESTABLISHED( client、 server都有)、 LISTEN(只有 server)、 TIME WAIT(主动关闭方)、 CLOSE WAIT(被动方)TCP长连接短连接:客户端和服务器通过3此握手建立连接,4次挥手断开连接。短连接指的是建立连接后,进行一次数据的读写就关闭。长连接指的是建立连接后,可以进行多次读写,连接可以长时间保持,减少了频繁的建立连接操作,但是会带来连接被占用的情况。所以可以服务端可以将超过一定时间没有进行读写操作的连接关闭 二、TCP建立连接三次握手 TCP建立连接三次手,必须发送确认信息(SYN),确定肯定对方回复(ACK),然后才可以连接建立( ESTABLISHED),传输数据(Wite、Read、Wite、Read、 Write、Read)。 状态解释:① CLOSED:虚拟出来的状态,实际不存在,你在 netstat ant I grep端口的时候是找不到的② LISTEN: server指定端口为监听状态,随时准备有 Client前来连线③ SYN SENT:只在 Client端出现,表示 Client发送过YN了,正在焦急地等待 Server的ACK,客户端指定的是随机端口和 server i端相连。④ SYN RCVD:只在 Server端出现,表示 Server I收到 Client的SYN了,并且已经发给 Client自己的ACK和SYN了,正在焦急地等待 Client的ACK 5. ESTABLISHED:在 Client端出现表示 Client把自己的ACK(第3次握手)发出去了, Client已经就绪;在 Server端出现表示 Server已经收到 Client的ACK(第3次握手)了, Server已经就绪注:只有在 Client和 Server同时ESTABLISHED时,即同时就绪时才可以进行数据传输。
Client端口状态转换1.应用层调用 connect,发送SYN到对端,等待对端的ACK和syn2.等待对端的ACK和SYN到来,接收到ACK和SYN后,发出自己的ACK,状态进入 ESTABLISHED;3.等待对端的ACK和SYN期间,端口状态一直为 SYN SENT,超时后进入 CLOSED
Server端口状态转换:1.应用层启动侦听,端口进入 LISTEN状态2.接收到 Client发来的SYN,发送自己的ACK和SYN,进入 SYN RCVD状态,等待 Client的ACK3.等待 Client的ACK到来,接收到ACK后,进入 ESTABLISHED:等待超时,进入 CLOSED 三、TCP断开连接一四次挥手 TCP通讯双方,不管是 Client还是 Server,都可以主动断开连接,所以下面我们只以主动方和被动方为标注。(实际情況一般由客户端主动关闭,服务端关闭的也有,看到服务端端口状态为 TIME WAIT时不要奇怪)。
状态解释: ① FIN WAIT1:仅出现在主动方,表示主动方想要断开连接,己经关闭了写通道,并向对端发送了FIN,等待对方的ACK到来 ② CLOSE WATT:仅出现在被动方,表示被动方收到FN后,己经回复ACK,正在等自己的应用层调用 close方法关闭写通道,在CLOSE_WAT状态下,自己只能发送数据,但不能接收数据 ③ FIN WAIT2:仅出现在主动方,表示主动方已收到对端的ACK,等待对端的FN 此时无法再发送数据,但是可以接收数据 ④ LAST ACK:仅出现在被动方,表示被动方缓冲区数据己经发送完毕,并且经 发送FIN到对端,等待对端的ACK;如果应用层写的比较垃圾,没有调用 close关闭 socket, 则会一直停留在 CLOSE WAIT 5 TIME WAIT:仅出现在主动方,表示主动方已经发出ACK了,本次通讯完事了, 双方都不能再读写了,但是主动方不确定对方能不能收到最后一个ACK,为了保证这个端 口释放后,不被后来的连接马上使用被当成是新连接,通俗地讲,为了不乱套,这个状态会直等待,等多久呢,等2XMSL( Maximum Segment Lifetime,catproc/ sys/net/ipv4 /tcp fin timeout这是配置是MSL,默认是60s)个时间,这个MSL是操作系统配置的,有默认参数,可以改。 ⑥ CLOSED:虚拟出来的状态,同建立连接的时候状态。实际不存在,你在 netstat-ant grep端口的时候是找不到的
主动方端口状态转换: 1.应用层调用 close方法发起关闭连接 2.发送FN到对端,关闭写通道,端口进入 FIN WAIT1状态 3.等待对端的确认ACK到来,接收到ACK后进入 FIN WAIT2状:如果在超时时 间内没有收到ACK则直接进入 CLOSED状态 4.如果在 FIN WAIT1状态时收到了对端的FIN,则进入 CLOSING状态(双发都发 出了关闭连接请求,异口同声说“分手”) 5.如果在 FIN WAII2状态时收到了对端的FIN,则进入 TIME WAIT状态:如果在超时时间内没有收这个FN则直接进入 CLOSED状态: 6.在 TIME WAIT状态等待2个MSL(报文最长存活周期)后进入 CLOSED状态
被动方端状态转换 1.收到对端的FIN后,关闭读通道,自己进入 CLOSE WAIT状态 2.在 CLOSE WAIT状态等待应用层调用 close方法关闭sock连接 3.如果在超时时间内没调用 close,则直接进入 CLOSED状态 4.如果在超时时间内调用了 close,则向对端发送FIN,自己进入 LAST ACK状态,等 待对端的ACK 5.等待对端的ACK,如果在超时时间内收到了ACK则直接进入 CLOSED状态,否则 超时后进入 CLOSED状态
四、TCP调优
服务端有时也会主动关闭连接,应该是为了避免有些不地道的 Client不关闭 socket连接, 一直占用服务器资源,所以有些服务器也会无情地主动关闭连接。 在高并发场景下,服务器主动关闭连接的情况,在服务端会出现大量的 TIME WAIT状 态的端口,会占用操作系统文件句柄资源,导致新的连接可能无法建立,影响高并发性能。在 Linux服务器上,/etc/ sysctl. conf文件中修改 time wait缺省值(默认240秒): net. ipv4. tcp fin timeout=30
注:记得用roo修改,修改后执行 sysctl-p使参数立即生效。
|