TCP三次握手和四次断开及问题

TCP三次握手和四次断开及问题_第1张图片

 

 三次握手

1、第一次握手:客户端(状态是closed 关闭)主动发送给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(x),此时客户端处于SYN_Send (表示请求连接)状态

2、第二次握手:服务器(状态是listen监听)被动收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(x),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD表示请求连接)的状态

3、第三次握手:客户端(状态是SYN_Send表示请求连接)收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised(以建立链接) 状态

4、服务器(状态是SYN_Send表示请求连接)收到 ACK 报文之后,也处于 establised(以建立链接) 状态,此时,双方以建立起了链接

四次断开

1、第一次断开:客户端主动(状态establised(以建立链接))发送一个 FIN 报文进行关闭tcp连接,报文中会指定一个序列号。此时客户端处于FIN_WAIT1(等待client端回复ack)状态

2、第二次断开:服务端(状态establised(以建立链接))收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT(被动关闭)状态

3、第三次断开:如果服务端(状态CLOSE_WAIT(被动关闭)状态)也想断开连接了,和客户端的第一次断开一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 被动关闭连接过程中)的状态

4、第四次断开:客户端(FIN_WAIT2(等待client端回复ack))收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT(结束连接) 状态。经过30s确保服务端收到自己的 ACK 报文之后才会进入 CLOSED (关闭)状态

5、服务端收到 ACK 报文之后,就处于关闭连接了,处于closed 关闭状态

面试官可能提问的问题

1、(ISN)是固定的吗?

       三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按序列号组装数据。
        如果ISN是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的

2、三次握手过程中可以携带数据吗

第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的

    假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第一次握手可以放数据的话,其中一个简单的原因就是会让服务器更加容易受到攻击了。
           而对于第三次的话,此时客户端已经处于 established 状态,也就是说,对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据

3、三次握手和四次挥手的本质是什么?

三次握手的本质是确认通信双方收发数据的能力 
四次挥手的目的是关闭一个连接

 4、为什么TIME_WAIT状态需要经过2MSL((2MSL表示2分钟)最大报文段生存时间)才能返回到CLOSE状态?

虽然,四个报文都发送完毕,我们可以直接进入CLOSED关闭状态了,但是我们必须假象网络是不可靠的,有可能最后一个ACK丢失,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文

 5、为什么连接的时候是三次握手,关闭的时候却是四次握手

 因当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。当关闭连接时服务端收到FIN报文时,很可能不会立即关闭,所以只能先回复一个ACK报文,告诉客户端,"你发的FIN报文我收到了"。只有等到服务端所有的报文都发送完了,我才能发送FIN报文因此不能一起发送。故需要四步握手

可以使用 tcpdump命令 进行监听数据包

你可能感兴趣的:(tcp/ip,网络协议,网络)