怎么回答TCP的三次握手问题
面试官:说一下三次握手。
我:好,。。。。。。
TCP的三次握手在面试中经常被问道,本文从原理解析归纳了一种关于TCP三次握手的回答。最终的回答在总结中
三次握手的目的
三次握手的目的可以概括为两个:
1: 为了确认双方的接收能力和发送能力是否正常。
2: 为后面的可靠性传送做准备。通过指定自己的初始化序列号码以及同步对方的序列号码和确认号码来实现可靠性的数据传输。
三次握手的内容
目的1
从第一个目的我们去理解一下三次握手的流程。
目的1: 为了确认双方的接收能力和发送能力是否正常。
解析:接收能力与发送能力怎么确认?
问题:假如我是客户端,我想确认服务端的接收能力与发送能力是否正常,我该怎么做?
答案:我发送一个编号:123给服务端,要求服务端需要返回124的编号就可以说明服务器的接收能力与发送能力是正常的。
怎么理解?
1.服务器如果发送124的编号,说明服务器接收到了123的编号。服务器的接收能力正常。
2.我收到了服务发来的124的编号,说明服务器发送能力正常。
握手的概念:
我作为客户端发送给服务端123的编号,到服务端接收到123编号这个过程就是一次握手的过程。
服务端返回124的编号到我接收到124编号的过程也是一次握手的过程。
因此我作为客户端确认服务器的接收和发送功能是否正常总共需要两次握手的过程。
而服务器确认我们(客户端)的接收和发送功能是否正常也需要两次握手的过程。
三次握手的过程
那TCP确认双方的接收能力和发送能力是否正常为什么不是四次握手呢?(2次+2次)
回答:可以但没必要。因为4次握手中的某两次可以整合为一次。
假如我们(客户端)发送一个编号123给服务端,服务端接收到了。第一次握手
这时服务端该返回124给客户端了,但是服务端不仅返回了124,还发送了自己的编号456给客户端。也就是服务端发送了两个编号给客户端,编号124是告诉客户端我的功能都正常,编号456就是试探客户端的接收和发送功能是否正常。第二次握手
4次握手中整合的两次就是发生在这儿,TCP将发送124和发送456放在了一次握手的过程
客户端收到了服务端发送的124和456编号,会发送编号457给服务端,服务端接收到457后TCP连接就建立好了。第三次握手
目的2
从目的1理解了三次握手的过程,现在从目的2进一步了解一下TCP三次握手
目的2: 为后面的可靠性传送做准备。通过指定自己的初始化序列号以及同步对方的序列号和确认号来实现可靠性的数据传输。
相关内容
目的2中涉及一些报文信息的相关内容
首先了解一下名称简称
初始化序列号(Synchronize Sequence Numbers,SYN)
确认号(Acknowledge character,ACK)
以及了解一下TCP表头的信息
TCP表头在本节只需要注意上面红框的四个参数,其中序列号码用seq,确认号码用ack表示。
ACK和SYN为标志位
- ACK—为1表示确认号字段有效
- SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
在目的1中客户端发送的123,以及服务端发送的456就是seq(同时此时报文中的SYN标志位为1);服务端发送的124,以及客户端发送的457就是ack(同时此时的报文中ACK标志位为1)。
TCP三次握手中还涉及两个不同的报文,如下
SYN报文
当SYN标志位为1,发送seq序列号时,叫做SYN报文
ACK报文
当ACK标志位为1,发送ack确认号时,叫做ACK报文
注意:在第二次握手时,SYN和ACK标志位都为1,同时发送了seq和ack号码,此时也被叫做SYN报文
三次握手的过程
因此TCP三次握手的过程:(假如客户端向服务端发起TCP连接请求) 简单版
- 第一次握手:客户端给服务端发送SYN报文。其中初始化序列号码seq=x,SYN=1
- 第二次握手:服务器收到客户端的SYN报文后,会发送自己的SYN报文作为应答,并且指定自己的初始化序列号码seq=y。其中SYN=1,ACK=1,ack=x+1,seq=y
- 第三次握手:客户端收到SYN报文,会发送一个ACK报文,其中ACK=1,ack=y+1,seq=x+1
上述回答TCP三次握手太精简了,在客户端和服务端发送报文后还涉及状态的变化。
状态变化
假如是客户端向服务端发起TCP连接请求。因此客户端最开始是close状态,服务端为listen状态
在socket编程中,客户端通过connect()函数向服务器发起连接请求,触发三次握手。
状态转变:
客户端发送SYN报文后,客户端状态从close变为SYN_send状态;服务端收到SYN报文,并发送自己的SYN报文后,服务端的状态由listen变为SYN_receive状态;当客户端发送ACK报文后,客户端状态由SYN_send变为Established状态;当服务器收到ACK报文后,状态由SYN_receive状态变为Established状态。
总结
总结一下上面的内容,我们现在可以回答三次握手的问题
面试官:说一下TCP三次次握手。
我:好。TCP三次握手的目的主要是为了确认双方的接收能力和发送能力是否正常以及通过同步双方的序列号码和确认号码为后面的可靠性数据传输做准备。假如客户端向服务器申请TCP连接时,客户端执行connect()函数便会触发三次握手。最开始客户端处于close状态,服务端处于listen状态;第一次握手:客户端给服务端发送一个SYN报文,其中包含自己的初始化序列号码。此时客户端的状态由close状态变为SYN_send状态;第二次握手:就是服务器收到客户端的SYN报文之后,会发送自己的SYN报文作为应答,并且指定自己的初始化序列号码以及确认号,其中确认号为客户端的初始化序列号码加1。此时服务端的状态由listen变为SYN_receive状态;第三次握手:就是客户端收到服务器发来的SYN报文之后,会发送一个ACK报文,其中确认号为服务器发送的初始化序列号加1。此时客户端的状态由SYN_send变为Established状态;当服务器收到客户端发来的ACK报文后,状态由SYN_receive状态变为Established状态。连接建立成功。
TCP三次握手还有一些相关的面试问题,更多的内容请参考该文TCP三次握手的相关问题及解答
今天的文章怎么回答tcp的三次握手问题呢_简单描述tcp的三次握手[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85355.html