|
|
|
@ -153,6 +153,12 @@ TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是: 网络中可能存
|
|
|
|
|
|
|
|
|
|
### TCP三次握手
|
|
|
|
|
|
|
|
|
|
开始客户端和服务器都处于CLOSED状态,然后服务端开始监听某个端口,进入LISTEN状态:
|
|
|
|
|
|
|
|
|
|
- 第一次握手(SYN=1, seq=x),发送完毕后,客户端进入 SYN_SENT 状态
|
|
|
|
|
- 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端进入 SYN_RCVD 状态
|
|
|
|
|
- 第三次握手(ACK=1,ACKnum=y+1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手,即可以开始数据传输
|
|
|
|
|
|
|
|
|
|
![三次握手](images/OS/三次握手.jpg)
|
|
|
|
|
|
|
|
|
|
- 假设一开始客户端和服务端都处于`CLOSED`的状态。然后先是服务端主动监听某个端口,处于`LISTEN`状态
|
|
|
|
@ -258,6 +264,11 @@ TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号
|
|
|
|
|
|
|
|
|
|
### TCP四次挥手
|
|
|
|
|
|
|
|
|
|
- 第一次挥手:**FIN=1,seq=u**,发送完毕后客户端进入**FIN_WAIT_1** 状态
|
|
|
|
|
- 第二次挥手:**ACK=1,seq =v,ack=u+1**,发送完毕后服务器端进入**CLOSE_WAIT** 状态,客户端接收到后进入 **FIN_WAIT_2** 状态
|
|
|
|
|
- 第三次挥手:**FIN=1,ACK=1,seq=w,ack=u+1**,发送完毕后服务器端进入**LAST_ACK**状态,客户端接收到后进入 **TIME_WAIT**状态
|
|
|
|
|
- 第四次挥手:**ACK=1,seq=u+1,ack=w+1**,客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,**2MSL**,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。服务器端接收到这个确认包之后,关闭连接,进入 **CLOSED** 状态
|
|
|
|
|
|
|
|
|
|
![四次挥手](images/OS/四次挥手.jpg)
|
|
|
|
|
|
|
|
|
|
四次挥手过程:
|
|
|
|
|