Tcp异常
昨研发报异常,据CMCC说是我方服务器主动断开的,于是怀疑是超时设置过短,于是我抓包,由于我接触socket时日尚短,搞不清为什么三次握手成功之后我方服务器会立刻发送fin
今天本来做实验观察进程IP复用情况,却无意中揭开了此问题的面纱,特此记录
我们首先来说说,ip复用的情况,具体ip能被复用多少次,记得从哪本书上模糊看到关于此的文章,不记得了。废话不多说,上源码先
#!/usr/local/bin/python3.5
#coding:utf-8
import socket
port = 8080
host = '192.168.1.210'
while True:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
此源码相信很多人都能看懂,就干一件事,疯狂的建立三次握手。运行大概十几秒之后,程序抛出异常
异常说我无法请求分配的地址,我看字面意思还以为是IP复用资源用尽了,结果原来是因为
socket发起connect请求的时候会随机分配一个端口给你。这个分配的端口是有范围的,记录在:
共计可用端口为28232
再写一个小脚本监控下连接数,发现
刨去22和mysql这两个持久链接,刚好等于28232
好了,这个问题解决了,那我们看看顺手而来的收获吧
情况何其像似由此我们也知道了,在程序没有可发送的数据后,会自动发送一个FIN,代表我已无数据发送了,即使程序没发送任何数据,在刚链接建立就FIN也是可以的(当然通常咱们不这样搞,TCP毕竟是比较奢侈的协议)所以这不是由于服务器设置的的time时间造成的。
至于在这个过程中,各种状态的转换,又是另外一个故事了…
END!