首先看下tcp的状态转移图,从几个角度看下这张图:python
首先,代码自己逻辑有问题,反应到上图会有什么现象,apache
1,服务器端出现大量的syn_rcvd,这个明显很明显,客户端故意不发ack,应该是客户端逻辑问题,有人在SYN泛洪。服务器
2,服务器端若是代码收到fin或者rst,不显式调用close会出现什么状况,服务端会一直停留在close_wait.多线程
3,客户端或者服务端出现大量的time_wait这个正常吗,这两个状况都是有可能出现的。首先看第一个,客户端大量出现。我用requests请求,频繁post/get,或者频繁调用curl(会马上四次握手结束链接)。这种状况通常不会出问题,可是若是使用多线程/进程,大量post的时候,会占光操做系统fd,若是不作内核参数优化,会报错!这种状况,若是发给一个地址,能用长链接,尽可能用长链接,能迅速改善。第二种是服务端出现大量的close_wait,这里就要看访问请求的类型了,是否该开放长链接,长链接timeout是否设置得当,是否该使用套接字复用。curl
总结,因为代码层次误操做,不显式close,长链接使用不当,会响应出现timewait,close_wait,其中,长链接及其超时设置不当,生产中出现的比较多,特别是使用apache,因为基于多线程方式,容易down。tcp
第二个问题,何时会发fin/rst的问题。函数
第三个,python中的read/recv函数如何判断fin/rst,这里和c的不同,作了简化post
补充下,http1.0默认是短连接,http1.1是长连接,而urllib2/3默认是短连接,request得注意版本。优化