浅谈三次握手、四次挥手

314 阅读5分钟

1. 什么是TCP、UDP协议?

不多bb 掌芝士nb www.bilibili.com/video/BV1kV… 本文图片与知识来自up掌芝士

1.1 是什么

  • 我们常用的网络通讯,比如浏览网页、软件聊天,都说通过这两种协议来传输的。它们都工作在传输层,主要负责传输应用层的数据包。

这里看到一个很有意思的说法。传输层两兄弟,大哥tcp,二弟udp,大哥靠谱,二弟不靠谱哈哈

1.2 区别

- 对于TCP和UDP协议来说,它们都是一堆二进制数,最大的区别是连接方式,TCP协议基于连接,而UDP连接基于非连接

- 怎么去理解连接和非连接呢?

  • 连接可以认为是打电话的操作,你从接通电话、对话、对话结束的过程都能得到反馈和保证,所以TCP协议方式比UDP方式更加稳定可靠
  • 非连接类似于寄信,你只负责寄出信件,但是对方是否收到信件,收到信件的内容是否完整,收到信件的顺序你都无法保证。但它具有高效的优点

- TCP传输数据稳定可靠,适用于对网络质量要求较高的场景(传文件、发送邮件、浏览网页

- UDP传输速度快,但可能丢包,适用于实时性要求较高,对少量丢包没有太大要求的场景(语音通话、视频直播)

还有一个很重要的应用场景,那就是隧道网络(VPN、VXLAN等)

1.3 TCP协议

- 分别有三个关键的步骤

- 三次握手: 三次握手是客户端与服务的建立连接的过程,当客户端向服务端发起连接时,会发一包链接数据过去询问(SYN包)能否与你建立连接?如 果服务端同意连接,则服务端会向客户端发送一包SYN+ACK包,客户端收到之后回复一包ACK包,然后连接建立。因为这个连接过程中互相发送了三包数据,所以称为3次握手。

A:是B吗?我要跟你通信,听得到我说话吗?

B:可以通信,你听得到我说话吗?

A:我也听得到。

image.png (图片来自 bilibili掌芝士zzs)

- 传输确认:

- 四次挥手: 处于连接状态的客户端和服务端都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭。假如客户端向服务端发起关闭连接的请求,此时客户端会向服务端发送一个FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手。服务端收到FIN包,向客户端发送一个ACK包,表示自己进入了关闭等待状态,客户端则进入终止等待2状态,这是第二次挥手。在这个时候,服务端还可以继续发送未发送的数据,而客户端也还可以继续接受数据,等服务端发送完数据之后,会再发送一个FIN包给客户端,自己进入最后确认状态,这是第三次挥手。客户端收到后发送一个ACK包,同时自己进入超时等待状态,超时等待结束后,结束连接,而服务端收到ACK包后立即关闭连接,这是第四次挥手。

A:呼叫B,我要跟你断开。

B:知道了,等一下我还有话没说完

B:我说完了,可以断开了

A:好的

image1.png

1.4 UDP协议

  • udp协议是基于非连接的,发送数据就是把数据包封装一下,然后从网卡发出去,数据包之间并没有状态上的联系。这种简单的处理方式,导致它的性能损耗非常的少,内存资源的占用远远小于tcp,但是对于网络传输过程中的丢包,udp协议并不能保证。所以udp在传输性能稳定上要低于tcp

1.5 面试中可能会遇到的问题

- 其实二次握手就可以建立连接,为什么要三次握手?

这是为了防止已经失效的请求报文,突然又传到服务器引起错误。假如第一次发送的SYN包因为网络堵塞没有及时传到服务端,这时客户端会再次发送一个SYN包,此时成功建立连接。若第一次堵塞的网络节点恢复了,第一次的SYN包又传送到了服务端,那么此时服务端会以为客户端又发起了新的连接,进入了等待数据状态。服务端认为是两个连接,而客户端认为是一个,造成了状态不一致。而三次握手的话,服务端如果没有收到ACK包,默认认为连接建立失败,也就不会出现服务端状态发生改变的情况了。

- 为什么客户端需要等待超时时间?

这是为了保证对方收到ACK包,如果客户端发送完足后一个ACK就断了连接,而因为网络堵塞,服务端并没有收到ACK包,服务端将一直停留在等待状态,而超时等待的存在,会让客户端在发送完ACK包之后等待一段时间,如果服务端没有接收到ACK包,那么就会再发送一个FIN包给客户端,客户端会进行响应并重新发送ACK包,并且刷新超时等待时间。直到服务端收到ACK包并关闭连接后,超时等待结束,客户端断开连接。

超时等待时间也是为了保证在不可靠的网络连接中,进行可靠的传输确认。