三次握手四次挥手
Posted wangjingguan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三次握手四次挥手相关的知识,希望对你有一定的参考价值。
知识热身
介绍tcp协议的三次握手四次挥手之前,首先我们来看一下tcp协议数据报文的组成,这样方便我们更好的理解下面将要介绍的三次握手四次挥手的过程,tcp协议报文如下图:
三次握手
1、以下介绍三次握手用到的TCP头部几个重要的字段标识
- seq:序列号,占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随即产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
- ack : 占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
- ACK :占一位,表示验证字段,仅当ACK=1时,确认号字段才有效。ACk=0时,确认号无效。
- SYN:表示建立TCP连接。当SYN=1,ACK=0时:这是一个连接请求报文段。若同意连接,则在响应报文段中置SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN标志位只有在TCP建立连接时才会置为1,握手完成后SYN标志位被置0.
- FIN:FIN=1表示断开TCP连接
三次握手过程
想必看到这篇博客的你也应该到了适婚的年龄了,如果你没有男朋友或女朋友,我想也该买包辣条找一个了。下面我们就以"谈恋爱"这个话题来介绍一下三次握手的过程吧。
上图过程说明:
- 1、有客户端发送建立TCP连接的请求报文,其中报文中含seq序列号,是有发送端随即生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值)
- 2、有服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由服务端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知道自己的TCP建立请求已经得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack+1可以理解为是确认和谁建立连接。
- 3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1,并再次回复ACK验证请求,在服务端放过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)
四次挥手
过了段时间,你们两个相处的久了,或许你喜欢上其TA女生了,你狠心的抛弃了你当初追求过的女孩,于是,你随便编出了一个理由,才有了你俩以后老死不相往来的演出:
四次挥手过程说明:
- 1、客户端发送断开TCP连接请求的报文,其中报文中含有seq序列号,是有发送端随即生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x有客户端随机生成)
- 2、服务端会回复客户端发送的TCP断开请求报文,其中包含seq序列号,是有回复端随机生成的,而且会产生ACK字段,ACK字段数字是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y有服务端随机生成)
- 3、 服务端在回复客户端的TCP断开请求后,不会马上就行TCP连接的断开,服务端会先确保断开前,所有传输到客户端的数据是否已经传输完毕,一旦确认传输完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z有服务器端随机生成)
- 4 、客户端收到服务器端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq的基础上+1,从而完成服务端请求的验证回复、(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
至此,TCP断开完成即四次挥手过程结束
三次握手四次挥手过程中的11中状态
三次握手
- 1、刚开始,连接建立之前,客户端和服务器端的状态都为CLOSED;
- 2、服务器端创建socket后开始监听,变为Listen状态;
- 3、客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT;
- 4、服务器端收到客户端的报文后向客户端发送向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD;
- 5、然后客户端收到ACK、SYN,就像服务器发送ACK,客户端状态变为ESTABLISHED;
- 6、服务器端收到客户端的ACK后变为ESTABLISHED。此时3次握手完成,连接建立!
四次挥手
由于TCP连接时全双工的,断开连接会比建立连接麻烦一点点
- 1、客户端向服务器发送FIN报文,请求断开连接,其状态未FIN_WAIT1;
- 2、服务器收到FIN后向客户端发送ACK,服务器的状态为CLOSE_WAIT
- 3、客户端收到ACK后就进入FIN_WAIT2状态,此时连接已经断开了一半了,如果数据还有要发送给客户端,就会继续发送;
- 4、直到发完数据,就会发送FIN报文,此时服务器进入LAST_ACK状态;
- 5、客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态;
- 6、再过了2MSL长的时间后进入CLOSED状态。服务器收到客户端的ACK就进入CLOSED状态。自此,还有一个状态没有出来:CLOSING状态。CLOSING状态表示:客户端发送了FIN,但是没有收到服务器的ACK,却收到了服务器的FIN,这种情况发生在服务器发送ACK丢包的时候,因为网络传输有时会有意外。
LISTEN:等待从任何远端TCP 和端口的连接请求。
SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
FIN_WAIT_2:等待远端TCP 的连接终止请求。
CLOSE_WAIT:等待本地用户的连接终止请求。
CLOSING:等待远端TCP 的连接终止请求确认。
LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
TIME_WAIT 两个存在的理由:
1.可靠的实现tcp全双工连接的终止;
2.允许老的重复分节在网络中消逝。
CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)
以上是关于三次握手四次挥手的主要内容,如果未能解决你的问题,请参考以下文章