TCP三次握手四次挥手及与UDP协议的差异

906 阅读6分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

tcp协议和UDP协议都工作在传输层,他们的目标都是在程序之间传输数据,数据可以是文本文件,视频,也可以是图片,对于tcp协议和udp协议来说都是一堆二进制数,并没有多大的区别,那么他们之间最大的区别是什么呢?

最大的差别在与:tcp协议是基于连接的,UDP协议是基于非连接的

具体是什么意思?我们来举一个简单的例子(如下图)

1628065935(1).jpg 如果把人与人之间的通信比喻为进程与进程的通信,我们基本有两种方式,第一种方式是写信,第二种方式是打电话,如果不考虑速度,这两种方式最大的区别是什么,就是信寄出去之后对方是否能收到,以及信的内容是否完整,先后寄两封信过去是否按顺序接收都变成了未知数,甚至你填写的收信地址和收信人是否存在你都无法确认,而打电话则不同,从拨打电话到对方接通,互相通话再到结束通话后挂断这一系列的流程都能得到及时的反馈,并且能确认对方准确的接收到,打电话是基于连接的,也就是TCP,而写信是基于非连接的,也就是UDP

TCP是如何保证以上过程的,有三个关键步骤

微信图片_20210804164349.png

分别为三次握手,传输确认,四次挥手

三次握手:

三次握手是建立连接的过程,当客户端想服务器端发起连接时,会先发一包连接请求数据过去询问一下,能否与你建立连接,这包数据我们称之为SYN包

1628068106(1).png

如果对端同意连接,则回复SYN+ACK包(如下图)

1628068140(1).png

当客户端收到之后会回复一包ACK包 连接建立(如下图)

1628068191(1).png

因为这个过程互相发送了三包数据,所以称之为三次握手

那么为什么要三次握手而不是两次握手?

服务端回复完SYN+ACK包之后就建立连接,这是为了防止已失效的请求报文突然又传到服务器引起错误,这是什么意思呢?

假设采用两次握手建立连接,客户端向服务器端发送了一个SYN包,来请求建立连接,因为某些未知的原因并没有到达服务器,在中间某个网络节点产生了滞留,为了建立连接,客户端会重发SYN包,第二次发送的SYN包正常送达,服务器端回复SYN+ACK之后建立起了连接,但是第一包数据阻塞的网络节点突然恢复了,第一包SYN包又送达到了服务器,这时服务端会误认为是客户端又发起了一个新的连接,从而在两次握手之后进入等待数据状态,服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致(如下图)

1628068803(1).png

如果在三次握手的情況下服务端收不到最后的ACK包,自然不会认为连接建立成功,所以三次握手在本质上来说就是为了解决网络信道不可靠的问题,为了能够在不可靠信道上建立起可靠的连接,经过3次握手之后,客户端和服务端都进入了数据传输状态。

四次挥手

处于连接状态的客户端和服务端都可以发起关闭连接请求此时需要四次挥手来关闭连接

假设客户端主动发起连接关闭请求,他需要向服务端发起一包FIN包 ,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手(如下图)

1628075620(1).png

服务端收到FIN包,给客户端发送一包ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手(如下图)

1628075873(1).png

服务端此时还可以发送未发送的数据给客户端,客户端也可以接收数据,待服务端发送完数据之后,会向客户端发送一包FIN包,进入最后确认状态,这是第三次挥手,客户端收到之后回复ACK包并进入超时等待状态(如下图)

1628076407(1).png

经过超时时间后客户端关闭连接,而服务端收到ACK包后立即关闭连接,这是第四次挥手

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

这是为了保证对方已经收到ACK包,因为假设客户端发送完最后一包ACK包就释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态(LAST-ACK),如果客户端发送最后一包ACK包后等待一段时间,这时服务端因为没有收到ACK包,就会重新向客户端发送FIN包,客户端会重新响应这个FIN包,重新向服务端发送ACK包并刷新超时时间,这个机制跟三次握手一样,也是为了保证在不可靠的网络链路中进行可靠的连接断开确认。

微信图片_20210804213522.png

UDP协议

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

微信图片_20210804215610.png 所以我们能总结出来TCP和UDP的主要区别,TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如传输文件,发送邮件,浏览网页等。UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高,但是对少量丢包并没有太大要求的场景,比如域名查询,语音通话,视频直播等,UDP还有一个非常重要的应用场景:隧道网络

微信图片_20210804215750.png

什么是隧道网络,比如我们常用的VPN就是一种隧道网络,以及在SDN中用到的VXLAN也是一种隧道网络,具体就不细讲了,大家可以自行去了解下。