美文网首页
TCP三次握手,四次挥手,及socket状态变化

TCP三次握手,四次挥手,及socket状态变化

作者: 江河湖海琴瑟琵琶 | 来源:发表于2020-08-06 15:04 被阅读0次

客户端想要与服务器建立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

相关文章

网友评论

      本文标题:TCP三次握手,四次挥手,及socket状态变化

      本文链接:https://www.haomeiwen.com/subject/oimzrktx.html