TCP协议与UDP协议——三次握手与四次挥手

 一、概述

TCP协议和UDP协议都工作在传输层,他们的目标都是为了传输数据,数据可以是图片、视频或文本文件,而对于TCP协议和UDP协议来说,它们都是一堆二进制文件,没有太大的区别。

 

TCP协议和UDP协议的区别就在于TCP协议是基于连接的,而UDP协议是基于非连接的。

在这里举一个通俗易懂的小例子:人与人之间的通信可以比喻为进程与进程之间的通信。

一般来说,通信的方式有写信(呃呃,这个通信方式比较久远了)和打电话,信写好后寄出去,并不能确定对方能够收到,也不能确定内容是否完整,甚至是收件人是否存在,如果寄出去两封信的话,也不能确定收件人收到信的顺序是否正确;如果是打电话的话,从电话接通到双方相互通话再到电话挂断,都是可以得到及时的反馈,并且能确定对方能准确的接收到。由此可以类比得到,打电话是基于连接的也就是TCP协议,写信是基于非连接的也就是UDP协议。

TCP协议是如何保证基于连接的过程的呢?分为三个阶段,也就是“三次握手”、“确认连接”、“四次挥手”

二、TCP协议的三次握手

        三次握手是建立连接的过程。

        当客户端向服务端建立连接的时候,会先发送一包连接请求数据过去询问一下,能否与服务端建立连接,这包请求数据称为SYN包;

        如果对端同意连接,则回复一包SYN+ACK包;

        客户端收到之后,回复一包ACK包,然后连接就建立了。

        由于在连接建立的过程中互相发送了三包数据,故称之为“三次握手”。

                

 

        三次握手解决了网络信道不可靠的问题 。

        如果只有两次握手的话,客户端发送一个SYN包后,该SYN包在某个网络节点产生了滞留,为了建立连接,客户端会重新发送一个SYN包,这次正常送达服务端,服务端收到之后会回复SYN+ACK包,然后服务端与客户端建立起了连接。

        紧接着第一包数据阻塞的网络节点恢复正常,第一包SYN包送达服务端,让服务端误以为客户端又发起了新的连接,服务端回复SYN+ACK包,进入等待数据阶段,服务端认为是两个连接,而客户端认为是一个连接,就会造成状态不一致,所以三次握手本质上来说就是为了解决网络信道不可靠的问题。

三、TCP协议的四次挥手

        处于连接状态的客户端和服务端,都可以发起关闭连接请求,此时就需要四次挥手来进行连接关闭。这个机制和三次握手一样,也是为了在不可靠的网络链路当中,进行可靠的连接断开确认。        

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

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

        服务端此时还可以发送未发送的数据,而客户端此时还可以接收数据;

        等服务端发送完数据之后,向客户端发送一包FIN包,进入最后确认状态,这是第三次挥手

        客户端收到FIN包之后,向服务端回复一包ACK包,进入超时等待状态,经过了超时时间后关闭连接,而服务端收到ACK包后立刻关闭连接,这是第四次挥手

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

因为需要保证对方已经收到了ACK包。假设客户端在发送了最后一包ACK包之后就释放了连接,一旦ACK包在网络中丢失,服务端将会一直停留在最后确认状态;假设客户端在发送了最后一包ACK包之后,等待一段时间,这时服务端会因为没有收到ACK包而重新发送FIN包,客户端就会响应这个FIN包,重新发送ACK包并且刷新超时时间

四、TCP和UDP的主要区别

        UDP协议是基于非连接的,发送数据就是简单的把数据包封装一下,然后从网卡发出去,数据包之间并没有状态上的联系。        

        但是正因为这种简单的处理方式,导致它的性能损耗非常少,对于CPU,内存占用也远远小于TCP,但是对于网络传输过程中产生的丢包,UDP协议并不能保证,所以在传输稳定性上,UDP要弱于TCP 。

TCP:传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方。例如传输文件、发送邮件、浏览网页等等

UDP:速度快,但是可能产生丢包,所以适用于对实时性要求较高,但是对少量丢包没有太大要求的场景,例如域名查询、语音通话、视频直播等等。UDP还有一个非常重要的应用场景就是隧道网络,例如VPN等

猜你喜欢

转载自blog.csdn.net/m0_59897687/article/details/120680796