非阻塞connect卡select问题分析
目录
非阻塞connect卡select问题分析
一、connect原理
1.1阻塞与非阻塞connect的区别
为解决阻塞connect等待耗时过长,最长等待127秒问题,企业级开发长采用非阻塞connect加select方式进行连接,达到连接时间更短,连接时间可设置的目的。
connect主要使用套接字建立到指定网络地址的socket连接。套接字执行connect操作有两种模式,分别是阻塞和非阻塞。阻塞模式下,在连接建立完成之前,connect一直等待;在非阻塞模式下,connect会立即返回,不会等待连接建立,这种模式下,如果errno为EINPROGRESS,此时三次握手仍在继续,需要调用select检测非阻塞connect是否完成。Select阻塞时间可以比connect超时时间短,防止连接线程长时间阻塞在connect函数处。
阻塞与非阻塞connect调用区别如图所示。

在建立连接时,通过sock_sndtimeo函数,如果套接字标志位含O_NONBLOCK标志,也就是开启了非阻塞模式,sock_sndtimeo函数返回0,反之返回sk->sk_sndtimeo,表示connect超时时间。
sock_sndtimeo返回后做if (!timeo || !inet_wait_for_connect(sk, timeo, writebias))判定。当是非阻塞模式,timeo为0,if直接退出。而当是阻塞模式,timeo是超时时间,!time就是0,此时执行inet_wait_for_connect函数。
inet_wait_for_connect函数中有个循环,等待连接,只有连接建立状态不为(TCPF_SYN_SENT | TCPF_SYN_RECV),或者收到信号,后者超时,timeo变为0,while循环才会退出。
超时时间sk_sndtimeo可以通过setsockopt进行设置。
1.2 connect函数超时时间
Connect函数调用tcp_transmit_skb发送SYN包后,通过inet_csk_reset_xmit_timer函数设置超时定时器。如果对端一直不发送SYN_ACK,将会返回-ETIMEDOUT。重传的超时时间跟net.ipv4.tcp_syn_retries有关,默认值是6。

本文探讨了非阻塞connect配合select实现高效网络连接的方法,分析了connect原理、select工作方式及多线程环境下可能产生的问题,并给出了相应的优化建议。
最低0.47元/天 解锁文章
662

被折叠的 条评论
为什么被折叠?



