面试官:讲讲TCP的三次握手和四次挥手
某上市公司遇到过,面试高频题。
文章尽量用最简洁的语言方便理解与记忆。
一、三次握手(建立链接)
A 代表主动链接方,B 代表被动链接方
1.1 简单点
- A->B 你活着吗?
- B->A 我活着,你呢?
- A->B 我也活着
1.2 复杂点
- A->B Syn(i)
- B->A Ack(i+1),Syn(k)
- A->B Ack(k)
1.3 图解Http书中截取
1.4 为什么是三次握手?
TCP 是面向链接的,也就是建立链接之后才能通信,这也是TCP可靠的原因之一。
TCP 三次握手的目的在于客户端和服务端同时确保对方具有发送与接收的能力。
下面来分析一下是怎样确认发送和接收能力的。
- 第一次握手:A->B 你活着吗?
对B来说:该次握手B确认A具有发送能力。
- 第二次握手:B->A 我活着,你呢?
对A来说:该次握手A确认B具有接收和发送能力。(收到了B的我活着
的确认包,说明B收到了A的数据,并且B发出了你呢
的数据)
- 第三次握手:A->B 我也活着
对B来说:该次握手确认了A具有接收能力。
1.5 拓展-什么是SYN洪水攻击?
SYN洪水攻击属于DOS攻击的一种,起因于攻击者传送一系列大量的SYN请求到目标系统,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
二、四次挥手(断开链接)
A 代表主动关闭方,B 代表被动关闭方
1.1 简单点
-
A->B 我所有东西都说完了
-
B->A 我已经全部听到了,但是等等我,我还没说完
-
B->A 好了,我已经说完了
-
A->B 好的,那我们的通信结束
1.2 复杂点
- A->B Fin
- B->A Ack
- B->A Fin
- A->B Ack
1.2 为什么第二次和第三次没有在一起发送?
当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。
1.3 为什么TCP的挥手需要四次
TCP是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。 如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给FIN结束报文给对方对方收到后,回复ACK报文。当这方也已经写完了准备关闭,发送FIN报文,对方回复ACK。两端都关闭,TCP连接正常关闭