socket链接的关闭close和shutdown的区别,TIME_WAIT和CLOSE_WAIT什么时刻出现,如何处理


TCP主动关闭连接
 
appl: close(), --> FIN FIN_WAIT_1 //主动关闭socket方,调用close关闭socket,发FIN
               <-- ACK FIN_WAIT_2 //对方操作系统的TCP层,给ACK响应。然后给FIN
               <-- FIN
               --> ACK "TIME_WAIT" -- 2MSL timeout -->CLOSED //TIME_WAIT,防止ACK没有给到对方。
 
TCP被动关闭连接
 
               <-- FIN "CLOSE_WAIT" //被动方,收到对方的FIN,处于CLOSE_WAIT状态
               --> ACK //被动方的TCP层,给ACK响应
app2: close(), --> FIN LAST_ACK //被动方调用close,从CLOSE_WAIT转到LAST_ACK 不调close,将一直在CLOSE_WAIT状态。
               <-- ACK --> CLOSED tcp是全双工:: 因此close()关闭读写 shutdown()可以选择关闭读或写 time_wait的时间会非常长,因此server尽量减少主动关闭连接。
 
 
int close(int sockfd); int shutdown(int sockfd, int howto); // howto: SHUT_RD, SHUT_WR, SHUT_RDWR
  • shutdown()函数的两个作用:
  • close()将描述字的引用计数减1,当引用计数为0时,才关闭socket。
  • 如fork()模式中,父进程在accept()返回后,fork()子进程,由子进程处理connfd,而父进程将close(connfd);但此时父进程的close()并不引发FIN。

 

  • shutdown()则不管socket的引用计数,直接发生FIN。
  • shutdown()可控制read/write两个方向的管道。
SHUT_RD shutdown(sockfd, SHUT_RD);后,来自对端的数据都被确认,然后悄然丢弃。 SHUT_WR half close状态。
 
close()引发的4次交互:(这里的close是client发起的)
 
client server
FIN_WAIT_1 ---- FIN M ------> (Server端操作系统的TCP层响应ACK包)
<---- ACK M+1---- CLOSE_WAIT FIN_WAIT_2 (这里必须调用close,才能从CLOSE_WAIT到LAST_ACK)
<------ FIN N ----- LAST_ACK TIME_WAIT (TIME_WAIT有一个重要的作用就是防止最后一个ACK丢失)
------- ACK N+1 ----------> CLOSE

TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。

         主要是防止最后一个ACK丢失。  由于time_wait的时间会非常长,因此server端应尽量减少主动关闭连接

 

CLOSE_WAIT是被动关闭链接是形成的 ,

        按状态机,我方收到FIN,则由TCP实现发送ACK,因此进入CLOSE_WAIT状态。

       如果我方不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。

此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。

 

大量TIME_WAIT和CLOSE_WAIT的存在,会产生怎样的影响?

        内核维护更多的状态。收到ip包,做hash运算,hlist冲突的概率更大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值