TCP的三次握手和四次挥手
一、问题引入
还记得上次面试,被问到这个问题。尴尬的是早就忘得七七八八了,当时只是为了准备考试背的,所以很显然没回答出来。恰好面试的人又问到了这个问题,所以就像仔细写写。
面试官:“你知道TCP协议吗?”
我:“学过”
面试官:“那你说说TCP的四次握手”
我:“???”
我也是比较纳闷的,怎么就成了四次握手。
我:“不是三次握手吗?”
面试官:“不不不,是四次握手,来,这是我前两天上网上看的,来,你看看”
好家伙,这货原来也是半吊子,还是网上搜的文章。
二、概念描述
TCP是属于网络分层中的传输层,有的也叫做运输层。有的书上也会写OSI七层协议。这里为了做简单描述,就先分为四层。
三、TCP三次握手简述
1、为什么要进行三次握手
三次握手的目的是为了能够建立可靠的通信通道。通俗的讲,就是A和B现在要进行通话,但是通话之前得确认身份,确认过后才能进行数据传输。说到通讯,简单来说就是数据的发送和接收,而三次握手最主要的目的就是双方确认自己和对方的发送和接收是正常的。
A:“0101,收到请回答”
B:“01收到,01收到。02输入暗号”
A:“天王盖地虎”
B:“宝塔镇河妖”
A:“Hello World”
2、建立一个TCP连接"三次握手",缺一不可
- 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
- 三次握手:客户端发送带有带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。
建立三次握手之后,客户端和服务端就可以传输数据了
问:第二次握手传回了ACK,为什么还要传回SYN
接收端传回ACK是为了告诉发送端,我确实是接收到了你所发送的信号了,说明单向的通讯是正常的。好比,前面的例子。B确认了A是要交接的人,butA不知道B是不是正确的。
而回传SYN则是为了建立并确认两端都能够正常通讯。
四、断开连接的四次挥手
1、why进行四次挥手
举个栗子!
A和B进行通话,通话即将结束的时候
1、第一次挥手:A:“我没啥可说的了”
2、第二次挥手:B:“好的,我知道了” but B还有话要交代,A为了顾及情面,不能单方面挂断电话,所以继续通话
3、第三次挥手:于是B又说了半天,然后B:“我说完了”
4、第四次挥手:A:“好的,我知道了”
这样才算通话完毕
TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
问:为什么不能把发送的ACK和FIN合并起来,变成三次挥手
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
如果第二次挥手时,服务端的ACK没有到达客户端会怎么样
客户端没有收到 ACK 确认,会重新发送 FIN 请求。
文章相关参考:《计算机网络(第 7 版)》