天天看点

TCP三次握手、四次挥手(简易版)

TCP是面向连接的:在真正通讯之前,必须先建立一条通讯线路,必须先完成连接。

TCP完成连接的过程:(保证通讯线路畅通)

建立连接:

   三次握手基本过程

   ①客户端首先向服务器发送一个建立连接的请求,SYN被设置为1,为请求建立连接报文段。

   ②服务器在接收到建立连接的请求后会给客户端回馈消息,传回ACK=1,告诉客户端服务器收到了SYN,防止客户端重传SYN。服务器再向客户端回馈SYN,回馈可以连接。

   ③ 客户端向服务器发送ACK,对SYN的确认。

TCP三次握手、四次挥手(简易版)

   三次握手状态变化

   ①客户端发起连接,将状态设置为SYN_SENT。不同状态代表不同阶段

   ②服务器接收到SYN,将ACK,SYN发送出去后处于SYN_RCVD状态,即接收到客户端发送的SYN

   ③当客户端将ACK发送出去并且接收到了ACK,SYN处于已连接(ESTABLISHED)状态

   ④ 当服务收到ACK后,也处于已连接(ESTABLISHED)状态

TCP三次握手、四次挥手(简易版)

问题:为什么是三次握手,不能是两次握手?

1.如果没有最后的一个ACK,则服务器会不断地超时重传ACK/SYN(第二个报文段)

2.若为2次会浪费服务器的资源(SYN溢出攻击或网络环境影响 客户端的SYN会被重传多次)

断开连接:

   四次挥手基本过程

   不分服务器与客户端,因为服务器与客户端都有可能断开,所以我们将其分为主动断开方与被动断开方。

   ①主动断开方向被动断开方发送一个请求断开连接报文FIN。(关闭主动方到被动方的传输通道)

   ②被动方收到FIN后,向主动断开方只回馈一个ACK消息。

   ③ 当过了一段时间以后,被动断开方向主动断开方再发送一个请求断开连接FIN报文。(关闭被动方到主动发的传输通道)

   ④主动断开方接收到FIN向被动断开方再回馈一个ACK,连接断开。

   问题:为什么要进行两次FIN?

   因为为全双工信道,任意时刻双方互相通讯,至少有2条通讯信道,一个FIN只能关一条,所以得有两个FIN。

TCP三次握手、四次挥手(简易版)

   四次挥手状态变化

   ①主动方将FIN发送出去后处于FIN_WAIT_1状态

   ②当被动方接收到FIN并将ACK发出去后处于CLOSE_WAIT(等待关闭)状态

   ③当主动断开方接收到ACK后处于FIN_WAIT_2状态

   ④当被动方将最后一个FIN发出去后处于LAST_ACK(等待最后一个ACK)状态

   ⑤当主动方在收到了FIN并且将ACK发送出去后,处于TIME_WAIT状态

   ⑥当被动方接收到ACK后处于CLOSED状态

   ⑦主动断开方必须再等待一段时间到达CLOSE状态

   TIME_WAIT的意义(存在时间大约是2MSL:MSL为报文段在网络中最大生存时间):

         1.保证迟来的数据能被识别并丢弃

         2.保证可靠的终止TCP连接,防止对后续运行的程序造成影响(TIME_WAIT存在时间内,主动断开方无法用相

         同的IP地址端口号再启动一个网络通讯)

   TIME_WAIT与CLOSE_WAIT的区别:

         CLOSE_WAIT:处于被动断开方,仅仅属于断开过程中的一种状态

         TIME_WAIT:处于主动断开方,是一种特殊的状态

TCP三次握手、四次挥手(简易版)

问题:有没有可能是三次挥手?有可能!

被动断开方的ACK与FIN在一起发向主动断开方,即它们同时断开连接,中间等待时间为0,即为三次挥手。

继续阅读