三次握手与四次挥手

Posted takemytime

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三次握手与四次挥手相关的知识,希望对你有一定的参考价值。

传输层有两个协议:TCP协议和UDP协议,两者主要的区别是TCP是提供可靠服务,而UDP是提供不可靠服务。UDP没有TCP为了保证传输而进行的三次握手和四次挥手,所以UDP在效率上高于TCP,目前还应用在一些语音、视频等对丢失信息不敏感的信息传输中。

本文主要介绍一下TCP中的三次握手和四次挥手,详细介绍其流程、原理以及缺点。

 

1、三次握手

三次握手需要用到下面的标志位和数据:

 技术分享图片

SYN表示请求打开连接;

 技术分享图片

流程就是上图所示

第一次握手:客户端发送SYN=1标志符给服务器,请求与服务器建立连接,同时发送seq=x给服务器;其中x是客户端产生的,位于TCP首部中。

第二次握手:服务器收到客户端的消息后,如果确认请求便向客户端回复ACK=1标志符,表示确认请求,发送ack=x+1,用于验证序列;与此同时,服务器向客户端也发送一个建立连接请求SYN=1和序列号seq=y

第三次握手:客户端收到了服务器发来的消息,ACK=1说明服务器确认了客服端向其发送的建立连接请求被确认,接着验证ack=x+1,确认回复的是自己发送的连接请求;收到了服务器向客户端发送的建立连接请求SYN=1seq=y,同意建立连接,回复ACK=1ack=y+1

当服务器收到客户端发送的ack=y+1ACK=1,即整个三次握手完成,可以进行TCP通信。

为什么需要三次握手?

根本原因是为了防止客户端的消息由于拥塞等原因,又重复发送一次SYN请求。由于请求实质上没有丢失,服务器之后会收到两次SYN请求。由于客户端只发送了一次请求,所以对服务器端发回的两次ACK只响应一次。在三次握手的情况下,对于第二次从服务器发出的请求,由于服务器没有再收到客户端发送的确认,服务器等待超时后就停止等待响应。如果没有三次握手,服务器端将无法获得客户端的状态,将一直等待下去,浪费大量资源。

 

 

2、四次挥手

技术分享图片 

四次握手可以由客户端发起,也可以由服务器端发起,所以只区分主动方和被动方。当一方发送完全部数据,即发起Fin断开请求。

第一次挥手:主动方发送请求FIN=1,表示主动方已经发送完所有的数据,这时发送最后的数据ack=Z,发送序列号seq=X

第二次挥手:被动方收到了主动方的请求和序号,确认后断开从主动方到被动方的连接,并回复消息:ack=seq+1=X+1;并且发送序号seq=Z;被动方依旧可以继续发送数据给主动方;

第三次挥手:当被动方将所有的数据发送完成后,向主动方格发送断开连接请求FIN=1ack是对上一次传输数据的确认,发送序号seq=Y

第四次挥手:确认请求,断开从被动端到主动端的连接。

需要四次握手的原因:

因为在被动方收到主动方的断开请求FIN时可能还有数据需要发送,所以被动方回复主动方的确认后继续发送数据,完成数据发送后再向主动方发送请求,发送断开请求。而三次握手时由于中间不需要发送数据,所以确认和发送请求一并发送,即三次。

以上是关于三次握手与四次挥手的主要内容,如果未能解决你的问题,请参考以下文章

三次握手与四次挥手

浅谈“三次握手与四次挥手”

TCP 与 UDP 三次握手与四次挥手 -----学习日志

TCP/IP三次握手与四次挥手的正确姿势

TCP三次握手与四次挥手详解

TCP/IP链接的三次握手与四次挥手