相信很多朋友对于下面要说到的tcpip的状态问题都了然于胸了,如果是这样,下面的内容可跳过,下面内容只针对我这样的接触tcpip不久的盆友......
是的,啥都木有,通过以上的测试验证,time_wait还是close_wait或者是established or others这些状态都是针对源和目标端口建立的三次握手连接来说的,也就是连接的状态。所以在这里你可以看到36788(源)和13480(目标)之间的连接状态是time_wait,但是到B机器上该端口并没有被lsof出来
![]()
先来个问题:
1、对于tcpip里面经常提到的close_wait、time_wait、established等都是针对的端口来说的呢?还是针对的连接状态?
2、有这么一个场景:client发fin包给server,当状态为time_wait的时候,对该time_wait状态的目标和源端口进行建立连接的操作,哪个会成功,哪个会失败?为什么?成功的前提条件有吗?是什么?
带着这样的疑问,我利用今天下午的时间,做了些简单的测试来加深对tcpip的认识,测试过程:在一台机器上建立一个端口的bind,作为常驻进程,listen bind的端口(我假设它是A机器),对应的应用程序涉及fork操作。在另外一台机器上(假设是B机器—),telnet对方的该端口,建立两者的连接,netstat -tcp|grep port,确认两者建立了有效的连接,之间的通信正常。这个时候,在B机器上结束telnet操作,在A机器上执行netstat -n|grep port(bind的端口)结果如下:
![](https://img-my.csdn.net/uploads/201212/26/1356514068_2472.jpg)
36788端口是B机器的端口,13480是A机器我bind和telnet的端口,这个时候到A机器上执行lsof -i:13480,结果如下:
在B机器上执行lsof -i:36788
在没有断开telnet之前,你是可以看到此命令会显示36788显示established,而现在,你看到的结果将是
ps:lsof
lsof -i :port 知道该port端口现在运行什么程序,对应的PID、连接的状态等信息
lsof -c abc 显示abc进程现在打开的文件
lsof abc.txt 显示开启文件abc.txt的进程
lsof -p 12 看进程号为12的进程打开了哪些文件
那如果这个时候作为server的13480会如何呢?
是的,因为我前面提到了,这个是一个常驻进程,bind了一个端口(在这里13480就是这个端口),那么这一点再一次证明,time_wait啥的状态都是针对于连接本身说的,这个时候如果有新的telnet的对于13480的连接仍然是可以正常建立连接的
只是如果这个时候你还是走的B机器进行telnet,会受到tcp本身的对于time_wait的2MSL的规则的限制,换言之就是在2MSL(2倍生命周期时间)时间范围内,你是无法对该端口进行bind进行三次握手的与server进行通信连接的操作(有点拗口,简单点就是这个端口在2MSL时间范围内不可以用以建立连接)
但是如果我再从一台机器(假设是C)去对B机器的这个端口进行telnet呢?会成功呢?还是会失败呢?
在B机器允许telnet到该端口、该端口刚进入time_wait的连接状态,这个时候从c机器去对B机器进行telnet操作(因为环境原因,我没办法验证,但是我个人分析和理解如下,如有错误,欢迎指正,更加欢迎贴出测试结果,先谢谢)
由于B机器并没有一个对该端口的bind的常驻进程,此时该端口又处于time_wait的连接状态中,所以从C发起的对B该端口的telnet操作无法完成3次握手的操作,无法建立与该端口的established有效连接。
以上为今天下午个人对于tcp连接状态的理解和time_wait的时候,分别对server和client从第三方进行建立连接的理解,当中因能力问题,理解错误之处,请指教,指正,在此先谢过