什么是三次握手与四次挥手( 一篇文章讲清楚TCP协议与UDP协议)

2022-04-02 11:41:36 浏览数 (2)

关于TCP协议和UDP协议大家应该都有所耳闻,我们常用的网络通讯。比如浏览网页、软件聊天、以及你看到的这篇文章,都是通过这两种协议来进行数据传输的。到底他们是如何工作的?这两种协议的区别又是什么呢?请随武汉海翎光电的小编一起耐心看完这篇文章,你一定会有所收获。

TCP和UCP协议都工作在传输层,他们的目标都是在程序之间传输数据。数据可以是文本文件、视频、图片。对于TCP和UCP协议来说,都是一堆二进制数,并没有多大的区别。那TCP与UCP之间的区别是什么?很多伙伴会说,最大的区别就是一个基于连接,一个基于非连接。具体又是什么意思呢?我们来举一个简单的例子。

如果把人与人的通信比喻为进程与进程的通信,我们基本有两个方式,第一种方式是写信,第二种方式是打电话,如果不考虑速度因素,这两种方式最大的区别是什么?

就是信寄出去之后对方是否能收到,以及收到信的内容是否完整。先后寄两封信过去是否按照顺序接收,都变成了未知数。甚至你填写的收信地址和收件人是否存在,你都无法确认。

而打电话则不同,从拨打电话到对方接通互相通话,再到结束通话后挂断,能得到及时的反馈,并且能确认对方准确的接收到。打电话是基于连接的也就是TCP,而写信就是基于非连接的就是UDP。(如下图)

TCP是如何保证以上过程的,有三个关键的步骤。分别为三次握手、传输确认、四次挥手。武汉海翎光电的小编接着讲。

三次握手是建立连接的过程,当客户端向服务端发起连接时,会无发一包连接请求数据,过去询问一下,能否与你建立连接。 这包数据我们称为SYN。如果对端同意连接,则回复一包SYN ACK包。客户端收到之后回复一包ACK包,连接建立。因为这个过程中互相发送了三包数据,所以称之为三次握手。

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

服务端回复完SYN ACK之后就建立连接,这是为了防止因为已失效的请求报文,突然又传到服务器引起错误。这是什么意思呢?假设采用两次握手建立连接,客户端向服务端发送了一个SYN包来请求建立连接,因为某些未知的原因并没有到达服务器,在中间某些网络节点产生了滞留。为了建立连接客户端会重发SYN包,这次的数据包正常送达。服务端回复SYN ACK之后建立起了连接,但是第一包数据阻塞的网络节点突然恢复,第一包SNY包又送达到服务端。这时服务端会误认为是客户端又发起了新的连接。从而在两次握手之后,进入等待数据状态。服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致。如果是三次握手的情况下,服务端收不到最后的ACK自然不会认为连接建立成功,所以三次握手本质上来说就是为了解决网络信道不可靠的问题。

为了能够在不可靠的信道上建立起可靠的连接,经过三次握手后,客户端和服务端都进入了数据传输状态。上面讲到TCP协议需要在不可靠的信道上,保证可靠的连接。

现在就有几个问题需要面对,一包数据有可能会被拆成多包发送,如何处理丢包问题?这些数据包到达的先后顺序不同,如何处理乱序问题?武汉海翎光电的小编告诉你吧。

针对这些要求,TCP协议为每一个连接建立了一个发送缓冲区,从建立连接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。发送数据时,从发送缓冲区取一部分数据组成发送报文,在其TCP协议头中会附带序列号和长度。接受端在收到数据后,需要回复确认报文,确认报文中的ACK等于接收序列号加长度。也就是下一包数据需要发送的开始序列号,这样一问一答的发送方式能够使发送端确认发送的数据已经被对方收到。发送端也可以一次发送连续的多包数据,接收到只需要回复一次ACK就可以了。这样发送端可以把待发送的数据分割成一系列的碎片发送到对端,对端根据序列号和长度在接收后得出完整的数据。假设其中丢失了某些数据包。在接收端可以要求发送端重传。比如丢失了100-199这100个字节,接收端向发送端发送ACK=100的报文,发送端收到后重传这一包数据。接收端进行补齐。以上过程不区分客户端和服务端。TCP连接是全双工的。对于两端来说均采用上述机制。

我们再看一下什么是四次挥手?

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

假设客户端主动发起连接关闭请求,他需要向服务端发起一个包FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手。服务端收到FIN包,发送一包ACK包,表示自己进入了关闭等待状态。客户端进入终止等待2状态,这是第二次挥手。服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送一包FIN包进入最后确认状态,这是第三次挥手。客户端收到之后回复ACK包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包后,立即关闭连接,这是第四次挥手。为什么客户端需要等待超时时间?这是为了保证对方已收到ACK包,因为假设客户端发送完最后一包ACK包后就释放了连接。一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态。如果客户端发送最后一包ACK包后,等待一段时间,这时服务端因为没有收到ACK包会重发FIN包,客户端会响应这个FIN包重发ACK包并刷新超时时间

以上机制和三次握手一样,也是为了保证在不可靠的网络链路中,进行可靠的连接断开、确认。

了解了TCP协议,再跟着武汉海翎光电的小编看一下UDP协议。

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

来和海翎光电的小编一起总结一下TCP和UDP的主要区别

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

UDP的优点是速度快,但是可能产生丢包。所以适用于对实时性要求较高,但是对少量丢包并没有太大要求的场景。比如,域名查询,语音通话,视频直播等。

UDP还有一个非常重要的应用场景。就是隧道网络。什么是隧道网络?比如我们常用的V**就是一种隧道网络,以及在SDN中用到的VXLAN也是一种隧道网络。

好了,关于TCP和UDP的介绍就到这里,看过武汉海翎光电的小编的讲解是不是豁然开朗了呢?

0 人点赞