温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-18 07:13:04 来源:网络 阅读:394 作者:Ohimma 栏目:网络安全

小Q:这一周一直在北京转着投简历面试了,好久没来了;赶上周六,回来整装休息,复习复习;

--------------------------------------------------------------------------------------

这篇文章太好了,有时间的一定要看看,对TCP/IP可以有个深入的详细了解
http://www.cnblogs.com/fengzanfeng/articles/1339347.html

关于TCP/IP协议的建立和断开有三次握手和四次挥手的说法,下面来简单明了说说.......

第四十六天: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状态。

三次握手:

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

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

四次挥手:

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

中断连接端可以是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报文。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI