客户端想要与服务器建立TCP连接需要三次握手
,断开时需要四次挥手
.
整理一下通信过程.以及双方状态变化.
三次握手,建立连接
整个过程就是数据包的发送接收,双方每次发送或者接收数据包时状态发生改变.
首先服务器处于LISTEN
状态
第一步:客户端
发送SYN J数据包
,客户端
状态变为SYN_SEND
.
SYN J 中,SYN可以理解成数据包类型,这里表示同步,J是一个整数,可以理解成编号
第二步:服务器
收到SYN J数据包
需要回应,于是服务器
发送数据包ACK J+1 , SYN K
给客户端.服务器
状态变为SYN_RECV
(一个数据包里同时含有ACK和SYN)
ACK J+1, ACK(acknowledge)意思为确认.要回应编号为`J`的包,那么ACK编号应该是`J+1`
第三步:客户端
收到数据包,里边含有SYN K
,需要回应ACK K+1数据包
给服务器,此时客户端
状态变为ESTABLISHED
,服务器
在收到ACK K+1数据包
时也会进入ESTABLISHED
状态.
到此连接成功建立.
断开连接,四次挥手
主动断开与被动断开,情况是不一样的,但整体类似.
假设客户端主动断开连接,过程如下:
此时双方都处于ESTABLISHED
状态
第一步:
客户端
发送FIN X
,自身状态变成FIN_WAIT_1
客户端想要主动关闭连接,所以给服务器发送断开请求的数据包. FIN (finished)意思为完成结束
第二步:
服务器
收到FIN X
,需要做出回应ACK X+1
,自身状态变成CLOSE_WAIT
.
客户端
收到响应包ACK X+1
, 客户端
状态变成FIN_WAIT_2
服务器收到客户端发来的结束请求,做出回应,表示收到.
但此时服务器还不想断开连接,所以进入CLOSE_WAIT状态.
此时服务器还能向客户端推送数据.
第三步:
服务器
发送FIN Y
, 自身状态变为LAST_ACK
当服务器数据都发送完毕,会主动给客户端一个`FIN`包
`LAST_ACK` 状态下,只需等待客户端响应回来的` FIN Y+1 `就能关闭连接了
第四步:
客户端
收到FIN Y
,需要做出响应ACK Y+1
, 自身状态变成TIME_WAIT
`TIME_WAIT` 是客户端为了保证最后的 `ACK Y+1 `能够被服务器接收
服务器
收到ACKY+1
就能正常关闭了
主动关闭与被动区别
#主动关闭连接的一方状态变化为
`FIN_WAIT_1` >> `FIN_WAIT_2` >> `TIME_WAIT`
#被动
`CLOSE_WAIT` >> `LAST_ACK`
下边是网上找的图,可以自己看一下
复制过来的,侵删.png
网友评论