TCP-三次握手和四次挥手简单理解

TCP-三次握手和四次挥手简单理解

背景:TCP,即传输控制协议,是一种面向连接的可靠的,基于字节流的传输层协议。作用是在不可靠的互联网络上提供一个可靠的端到端的字节流服务,为了准确无误的将数据送达目的地,TCP协议采纳三次握手策略。

一、TCP报文

TCP报文格式图:

TCP-三次握手和四次挥手简单理解

上图中的几个字段需要重点介绍下:

字段 介绍
序列号seq   占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序列号,第一个序列号由本地随机产生;给字节编上序号后,就给每一个报文指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。  
确认号ack   占4个字节,期待收到对方下一个报文段段的一个数据字节的序号;序列号表示报文段携带数据段第一个字节的编号;而确认号指的是期望接受到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。  
确认ACK   占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。  
同步SYN   连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标准位只有在TCP建成连接时才会被置1,握手完成后SYN标志位被置0。  
终止FIN   用来释放一个连接。FIN=1表示:此报文段段发送方的数据已经发送完毕,并要求释放运输连接。  

PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

标志位:

字段 含义
URG   紧急指针是否有效。为1时,表示某一位需要被优先处理。  
ACK   确认号是否有效,一般置为1。  
PSH   接收方应该尽快将这个报文交给应用层。  
RST   重置连接。  
SYN   发起一个新连接。  
FIN   释放一个连接。  

注意:不要将确认序号ack与标志位中的ACK搞混了。

二、三次握手(Three-Way Handshake)

原理:

第一次握手:建立连接是,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列号。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

TCP-三次握手和四次挥手简单理解

为什么要三次握手?

三次握手的最主要目的是「双方确认自己与对方的发送与接收是正常的」。

第一次握手:Client什么都不能确认;Server确认了对方发送正常。

第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接受正常,对方发送正常。

第三次握手:Client确认了:自己发送、接受正常,对方发送,接受正常;Server确认了:自己发送了、接受正常,对方发送、接受正常。

所以三次握手就能确认双方收发功能是否正常。

通俗的说法:

Client:喂!听的到吗?

Server:可以,我听的到。

Client:好的,我们都能互相听的对方的话,可以开始通信了。

三次握手为什么不用两次,或者四次?

因为只有三次才最合适,三次通信是最小值,两次通信无法确认双方收发功能的正常,而四次通信则显得有些冗余。

三、四次挥手(Four-Way Wavehand)

意义:

所谓四次挥手,即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务的总共发送4个包以确认连接到断开。在socket编程中,这一过程由客户端或服务的任意一方执行close来触发,流程如下图所示:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwgzd.html