tcp状态变化图

        OK,首先先秀个图。为什么需要这个图呢? 因为这个图和netstat和tcpdump可以比较好的定位网络问题

TCP状态转换图

        但是很多人都说这图太难记了。我觉得去记住这图还不如记住每一个状态以及什么时候出现比较好。

建立一个连接要经历的几个阶段:


closed:这个最好记了。就是断连状态。

listen: 这个就是服务器处于监听状态。

syn_rcvd:这个就是客户端接收到服务端发起的三次握手的第一个syn,服务器从listent跳转到这个状态。当然这个状态非常短,一般用netstat是看不到的,除非客户端迟迟不发ack。

syn_sent:这个一般就是客户端connect的时候,发送syn然后就进入这个状态,等待服务器发送的ack和syn

established:这个就是客户端和服务端已经连接上的状态

之后我们就可以通讯了。

那么如果要断开,我们要经历哪些阶段呢?


fin_wait_1:这个一般是客户端要断开连接的时候,会发送一个fin给服务端。

close_wait:服务端接收到客户端的fin,接收完客户端数据,发送一个ack之后,进入这个状态。表示等待应用层closed

fin_wait_2:处于这个状态一般就是客户端跟服务端说他要关闭端口,然后服务器在接收到所有的客户端数据之后,发回一个ack说我接收到所有消息了,可以关闭你的写端了.这个时候,服务器还是可以写数据给客户端。

last_ack:服务端应用层执行close端口,会进入last_ack,代表等待最后一个客户端的ack应答。

time_wait:客户端在接收到服务端的ack之后,就会跑到这个阶段。

closed:客户端在time_wait状态等待2MSL进入closed.客户端在接收到客户端最后的一个ack表示客户端已经接受完毕,确定服务端可以关闭。那么为什么需要等待2MSL,原因很简单:1.防止最后一个ack丢失了,此时客户端还可以重发。2:如果不等待的话,那么就会导致下次链接直接链接,服务器有可能会收到上次的连接中迷路的请求。


那么为什么需要4次呢?很简单。你发了fin给我,只能保证你没数据给我了,要关闭了,但是不代表我的数据传送完了,我得等到我数据发送完了,再关闭。





猜你喜欢

转载自blog.csdn.net/allen_walker_qaq/article/details/80426649