TCP三次握手四次挥手

面试
TCP

1. 一张图表示

下面的图片很清晰的表现出TCP从握手到挥手整个过程:

1717b52d0080bf53-1587536620176

2. 场景模拟

其实用一个场景就很容易模拟出TCP的握手挥手过程,就在两座山上,中间隔了一个悬崖,两座山上的人想要通话,那么会产生什么样的事情。

小明:喂!对面有人嘛?(第一次握手)

小红:有人!(第二次握手)

小明:那我要开始说话了!(第三次握手)

…(中间的对话)

小明:我说完了,你可以走了!(第一次挥手)

小红:好的。(第二次挥手)

小红:那我要走了哦!(第三次挥手)

小明:收到!(第四次挥手)

小明说完收到后,等待一会,转身离开。

(因为小明最后一句“收到”可能小红没有听到,所以需要等待小红是否会再次询问“是否能走了”,如果没有这个等待时间小明就走了,那小红那边永远都收不到最后一句“收到”,小红就永远也走不了了。)

小红听到收到后,转身离开。

3. 解释

3.1 三次握手

  1. 第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给ServerClient进入SYN-SENT状态,等待Server确认;
  2. 第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYNACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;
  3. 第三次握手:Client收到确认后,检查ack是否为x+1ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给ServerServer检查ack是否为y+1ACK是否为1,如果正确则连接建立成功,ClientServer进入ESTABLISHED状态,完成三次握手,随后ClientServer就可以开始传输数据。

3.2 四次挥手

  1. 双方彼此都建立了连接,因此双方都要释放自己的连接,A向B发出一个释放连接请求,他要释放链接表明不再向B发送数据了,此时B收到了A发送的释放链接请求之后,给A发送一个确认,A不能再向B发送数据了,它处于FIN-WAIT-2的状态,但是此时B还可以向A进行数据的传送。此时B向A 发送一个断开连接的请求,A收到之后给B发送一个确认。此时B关闭连接。A也关闭连接。
  2. 为什么要有TIME-WAIT这个状态呢,这是因为有可能最后一次确认丢失,如果B此时继续向A发送一个我要断开连接的请求等待A发送确认,但此时A已经关闭连接了,那么B永远也关不掉了,所以我们要有TIME-WAIT这个状态。
  3. 当然TCP也并不是100%可靠的。

3.3 为什么要三次握手四次挥手

当然不能是三次挥手和两次握手,五次挥手和四次握手也是可以的,也就是挥手握手只能多不能少,但是多了的话就会产生一些无意义的挥手握手,增大响应延迟。

4. TCP状态转移

状态描述
CLOSED阻塞或关闭状态,表示主机当前没有正在传输或者建立的链接
LISTEN监听状态,表示服务器做好准备,等待建立传输链接
SYN RECV收到第一次的传输请求,还未进行确认
SYN SENT发送完第一个SYN报文,等待收到确认
ESTABLISHED链接正常建立之后进入数据传输阶段
FIN WAIT1主动发送第一个FIN报文之后进入该状态
FIN WAIT2已经收到第一个FIN的确认信号,等待对方发送关闭请求
TIMED WAIT完成双向链接关闭,等待分组消失
CLOSING双方同时关闭请求,等待对方确认时
CLOSE WAIT收到对方的关闭请求并进行确认进入该状态
LAST ACK等待最后一次确认关闭的报文

转载协议

本文采用 CC BY-NC-SA 4.0 协议进行许可,转载请注明出处。

允许转载、修改和分享,但必须注明作者和出处,且不得用于商业用途,衍生作品需采用相同协议。