iOS进阶面试

iOS:为什么TCP连接要三次握手,四次挥手

2019-08-17  本文已影响0人  一意孤行的程序猿

前言

TCP的三次握手🤝建立连接和四次挥手👋断开连接,相信很多人都听说过,也都看过相关的内容,本篇是为了记录自己对与这两种操作的理解。

在进入正式内容之前,先来看几个符号的概念:

三次握手

首先进入一下情景:

我正在饭店里和朋友吃饭,喝的正嗨的时候,女朋友打电话过来,饭店里有很多人,环境原因听不太清电话里的声音:

我:能听到我的声音吗?

女:能听到,大点声,你能听到我讲话吗?

我:能听到,

如此这般,才能保证双方都能听到声音,才能继续对话呀。

TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手🤝进行初始化的。三次握手🤝的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。由此我们来对应客户端与服务器之间的建立连接:

image.png

以上就是三次握手🤝的一个大概流程,那么问题来了:

握手🤝为什么需要三次呢,如果把最后一次的去掉改为两次握手🤝是否可行呢?
假如现在客户端想向服务端进行握手,它发送了第一个连接的请求报文,但是由于网络信号差或者服务器负载过多,这个请求没有立即到达服务端,而是在某个网络节点中长时间的滞留了,以至于滞留到客户端连接释放以后的某个时间点才到达服务端,那么这就是一个失效的报文,但是服务端接收到这个失效的请求报文后,就误认为客户端又发了一次连接请求,服务端就会想向客户端发出确认的报文,表示同意建立连接。

假如不采用三次握手,那么只要服务端发出确认,表示新的建立就连接了。但是现在客户端并没有发出建立连接的请求,其实这个请求是失效的请求,一切都是服务端在自相情愿,因此客户端是不会理睬服务端的确认信息,也不会向服务端发送确认的请求,但是服务器却认为新的连接已经建立起来了,并一直等待客户端发来数据,这样的情况下,服务端的很多资源就没白白浪费掉了。

采用三次握手的办法就是为了防止上述这种情况的发生,比如就在刚才的情况下,客户端不会向服务端发出确认的请求,服务端会因为收不到确认的报文,就知道客户端并没有要建立连接,那么服务端也就不会去建立连接,这就是三次握手的作用。

四次挥手

来,再次进入以下情景:

假如有一天我想要自由了,我就跟我的女朋友提出分手的要求:

我:我要自由,自由万岁,分手吧

女:好,你要分手是吧

然后她会骂我渣啊来发泄,或者试图挽留,在经过冷静之后:
女:那就这样吧,分

我:好的,分

至此就各奔东西,互相安好,相忘于江湖。

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,为了防止资源浪费肯定要断开TCP连接,那对于TCP的断开连接,这里就有了断开连接的四次挥手。

好的,那么问题又来了:

为什么断开连接需要四次挥手👋呢,像建立连接的时候一样,三次行不行呢?

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工 模式,这就意味着,在客户端想要断开连接时,客户端向服务端发送FIN报文,只是表示客户端已经没有数据要发送了,但是这个时候客户端还是可以接收来自服务端的数据。

当服务端接收到FIN报文,并返回ACK报文,表示服务端已经知道了客户端要断开连接,客户端已经没有数据要发送了,但是这个时候服务端可能依然有数据要传输给客户端。

当服务端的数据传输完之后,服务端会发送FIN报文给客户端,表示服务端也没有数据要传输了,服务端同意关闭连接,之后,客户端收到FIN报文,立即发送给客户端一个ACK报文,确定关闭连接。在之后,客户端和服务端彼此就愉快的断开了这次的TCP连接。

或许会有疑问,为什么服务端的ACK报文和FIN报文都是分开发送的,但是在三次握手的时候却是ACK报文和SYN报文是一起发送的,因为在三次握手的过程中,当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是在关闭连接时,当服务端接收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,你发的FIN报文我收到了,只有等到服务端所有的数据都发送完了,才能发送FIN报文,因此ACK报文和FIN报文不能一起发送。所以断开连接的时候才需要四次挥手来完成。

验证

下面通过Wireshark抓包工具来抓包看一下三次握手和四次挥手:

工具:Wireshark

下载地址 www.pc6.com/mac/112232.…

安装完成之后,打开Wireshark ,开始监测网络封包。

打开两个终端窗口,建立一个连接(这里很简单,就不截图了):

在终端窗口1中,输入:nc -l 6060 回车

在终端窗口2中,输入:nc 127.0.0.1 6060 回车

两个终端建立连接之后,可以在Wireshark中看到三次握手的过程:


下面断开连接再来看一下四次挥手的过程:

如果对照前面的三次握手和四次挥手的过程图来看的话,更能明白此处的抓包到的数据。
总结
TCP的三次握手和四次挥手,个人觉得其实就是在建立连接和断开连接的时候,保证这个连接的“安全完整”。同时也保证了数据的完整发送。至此关于TCP的三次握手和四次挥手就写到这里,如有错误还请指正!
以上情景剧内容纯属虚构,毕竟,真正的车手是不需女人的。(滑稽保命)



给大家推荐一个iOS技术交流群,群内提供数据结构与算法、底层进阶、swift、逆向、底层面试题整合文档等免费资料!!!可以加本人微信拉你进群!


作者:Henry_Jeannie
链接:https://juejin.im/post/5d5414cb6fb9a06b20055e27
来源:掘金

上一篇 下一篇

猜你喜欢

热点阅读