【面试题】面试官:简述TCP/IP三次握手?

前言

三次握手,四次挥手是面试中经常问到的问题,被提及的概率达到了80%,这个也是很多小伙伴的弱点,很多人在面试的时候无法正确的描述,只知道意思,所以你会听到不同版本的tcp/ip协议,有用男女朋友打电话来解释的,也有用两个人喊话来解释的,五花八门。

但其实你能说明白也算是过关,我们今天来看看遇到这个问题时如何回答。

三次握手流程

1. 标准版

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据

2. 简单版

首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了。

为什么是四次挥手?

这是因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。

扫描二维码关注公众号,回复: 11608163 查看本文章

但是关闭连接时,当Client端发送FIN报文仅仅表示它不再发送数据了但是还能接收数据,Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

四次挥手过程

刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求,则:

1、第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于CLOSED_WAIT1状态。

2、第二次握手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT2状态。

3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

4、第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态

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

原理图

此图需要会画

在这里插入图片描述

关于TCP/IP的面试补充

TCP(传输控制协议)和IP(网际协议) 是最先定义的两个核心协议,所以才统称为TCP/IP协议族

ISN: 发送方的字节数据编号的原点,让对方产生一个合法的接收窗口

1. 三次握手中第一次可以携带数据吗?

答: 不可以,三次握手还没有完成不能携带数据。

2. 为什么必须要三次握手,两次可以吗?

答: 不可以,
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

因此,需要三次握手才能确认双方的接收与发送能力是否正常。

3. 三次握手的作用
  • 确认服务器端和客户端的发送及接收能力正常
  • 指定自己的初始化序列号,为后面的可靠传输做准备
  • 如果是https协议,三次握手过程中还会进行数字证书的验证
4. 在第一次握手中指定客户端的初始序列号,这个序列号是固定的吗?

答: 三次握手的一个重要功能就是客户端和服务器端交换ISN,接下来接收数据的时候如何按照序号组装数据,如果ISN是固定的,攻击者就很容易确定后续的确认号,因此为了安全ISN都是动态生成的。

5. TCP的作用

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。

总结

回答这个问题只要看标准版的回答就可以了,要想简单可以看简单版, 但简单版不是为了让你图省事,而是在你已经会了标准版之后再去简化的版本。
关于tcp/IP不是几篇文章能写完的,本篇文章,针对的是面试,后续我们再去探讨关于TCP/IP的详细内容

猜你喜欢

转载自blog.csdn.net/xinshuzhan/article/details/108455496