赞
踩
网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。
本文讨论的是socket设置为阻塞模式,如果socket处于阻塞模式运行时,就需要考虑处理socket操作超时的问题。
所谓阻塞模式,是指其完成指定的操作之前阻塞当前的进程或线程,直到操作有结果返回.
在我们直接调用socket操作函数时,如果不进行特意声明的话,它们都是工作在阻塞模式的,
如 connect, send, recv等.
简单分类的话,可以将超时处理分成两类:
连接(connect)超时;
发送(send), 接收(recv)超时;
从字面上看,连接超时就是在一定时间内还是连接不上目标主机。你所建立的socket连接其实最终都要进行系统调用进入内核态,剩下的就是等待内核通知连接建立。所以自行在代码中设置了超时时间(一般是叫connectTimeout或者socketTimeout),那么这个超时时间一到如果内核还没成功建立连接,那就认为是连接超时了。如果他们没设置超时时间,那么这个connectTimeout就取决于内核什么时候抛出超时异常了。
因此,我们需要分析一下内核是怎么来判断连接超时的。
内核层的超时分析
我们都知道一个连接的建立需要经过3次握手,所以连接超时简单的说是是客户端往服务端发的SYN报文没有得到响应(服务端没有返回ACK报文)。
由于网络本身是不稳定的,丢包是很常见的事情(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。