您的位置:首页 > 理论基础 > 计算机网络

第四十六天:TCP/IP三次握手四次挥手

2015-11-07 10:54 525 查看
小Q:这一周一直在北京转着投简历面试了,好久没来了;赶上周六,回来整装休息,复习复习;
--------------------------------------------------------------------------------------
这篇文章太好了,有时间的一定要看看,对TCP/IP可以有个深入的详细了解 http://www.cnblogs.com/fengzanfeng/articles/1339347.html[/code]关于TCP/IP协议的建立和断开有三次握手和四次挥手的说法,下面来简单明了说说....... 



关于状态位的简单详解:
SYN(synchronous)是TCP/IP建立连接时使用的握手信号。
ACK (Acknowledgement)确认字符,表示发来的数据已确认接收无误。
CLOSED: 这个没什么好说的了,表示初始关闭状态。
LISTEN: 表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD: 这个状态表示接受到了SYN报文。
SYN_SENT: 这个状态与SYN_RCVD遥想呼应,表示客户端已发送SYN报文。
ESTABLISHED:这个容易理解了,表示连接已经建立了。
FIN_WAIT_1/2: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文;(FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文)所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到
CLOSING: 状态比较特殊,实际情况中很少见;表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文;细想一下:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭;
LAST_ACK: 是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
三次握手:




首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
四次挥手:



中断连接端可以是Client端,也可以是Server端,就是说也可以反向考虑。
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT1状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT2状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

-------------------为什么TIME_WAIT状态需要等2MSL后才能返回到CLOSED状态?----------------

因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态;但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp/ip