在排查网络通讯故障时,经常会说到“三次握手、四次挥手”,有人会问网络通讯为什么会握手和挥手,其实这只是一种通过拟人的手法让大家更好的来理解网络通讯中最关键的两个步骤,即网络建链和断链。
===========================================================
在搞懂TCP“三次握手、四次挥手”的具体过程前,有必要先对TCP/IP报头中的关键信息进行了解。
IP报头
IP报头信息 |
信息作用和含义 |
源地址 |
发送方的IP地址 |
目标地址 |
接受方的IP地址 |
TCP报头
TCP报头信息 |
信息作用和含义 |
源端口 |
发送方的端口 |
目标端口 |
接受方的端口 |
序列号 |
用seq来标识从源端向目的端发送的字节流,发起方发送数据时对此进行标记 |
确认号 |
用ack来标识并确认前一次接收到数据的序列号,Ack=Seq+1 |
控制位 |
URG:紧急指针 ACK:确认序号 PSH:尽快推送 RST:重置连接 SYN:建立连接 FIN:释放连接 |
===========================================================
当我们对这些信息有所了解后,接下来就来讲讲建链为什么要三次握手,而断链又为什么要四次挥手,它们在交互过程中又分别都做了什么?
三次握手
所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的,其主要目的是为了减少服务器开销和接收到失效请求发生的错误。
握手过程图解:
第一次握手:发送方发送建立TCP连接的请求报文,其中报文中包含seq序列号,由发送方随机生成,报文中的SYN标识置为1,表示需要建立连接。
例如:SYN=1,seq=x
第二次握手:接受方回复发送方发送的建立TCP连接的请求报文,其中报文包含seq序列号,由接收方随机生成,报文中的SYN、ACK标识置为1,ack序列号为前一次接收到的seq序列号上加1。
例如:SYN=1,ACK=1,seq=y,ack=x+1
第三次握手:发送方收到接收方的回复后再次回复,.其中报文包含seq序列,在自己原有的序列号加1,报文中的ACK标识置为1,ack序列号为前一次接收到的seq序列号上加1。
例如:ACK=1,seq=x+1,ack=y+1
四次挥手
所谓的四次挥手即TCP连接的释放。连接的释放必须是一方主动释放,另一方被动释放,TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"挥手"传输的。
挥手过程图解:
第一次挥手:发送方发送断开TCP连接的请求报文,其中报文中包含seq序列号,由发送方随机生成,报文中的FIN标识置为1,表示需要断开连接。
例如:FIN=1,seq=x
第二次挥手:接受方回复发送方发送的断开TCP连接的请求报文,其中报文包含seq序列号,由接收方随机生成,报文中的ACK标识置为1,ack序列号为前一次接收到的seq序列号上加1。
例如:ACK=1,seq=v,ack=u+1
第三次挥手:接受方回复发送方后,不会马上断开,服务端会确保断开前,所有传输到发送方的数据已经传输完毕,一旦确认传输数据完毕,就会再次进行回复,其中报文包含seq序列号,由接收方随机生成,报名中的FIN、ACK标识置为1,ack序列号为前一次接收到的seq序列号上加1。
例如:FIN=1,ACK=1,seq=w,ack=u+1
第四次挥手:接受方回复发送方发送的断开TCP连接的请求报文,其中报文包含seq序列号,在自己原有的序列号加1,报名中的ACK标识置为1,ack序列号为前一次接收到的seq序列号上加1。
例如:ACK=1,seq=u+1,ack=w+1
===========================================================
总结:以上初步介绍了TCP三次握手和四次挥手的过程分解说明,它能够帮忙我们在排查网络通讯故障中更快速的定位问题,由此可以发现,作为技术人员更需要加强基础原理知识的学习,这样在遇到困难或问题时才能更有效的做出判断以及解决。