# 关于三次握手
![](https://box.kancloud.cn/2b2c1266ee365806731e914624526f8c_668x623.png)
## 作用
1. client和server各自同时确认接受能力和发送能力是否正常。
2. 指定初始序列号ISN,为之后的报文传输做准备。
3. https协议下,数字证书加密
## client和server的状态
* CLIENT
* closed:默认状态
* SYN-SENT:client往server发送syn报文之后
* established:client接收到server的syn+ack,并发送ack报文之后
* SERVER
* listen:默认状态
* SYN_RECEIVED:收到client发出的syn,并且发送ack+syn报文之后
* established:收到client发出的ack报文之后
## 序列号ISN的作用
syn报文和ack报文中包含了序列号ISN,通过对比ISN来判断syn和ack是否匹配。
syn和ack报文中的序列号ISN相减,差等于1。
ISN序列号的另外一个功能是,在接收方收到多个包之后根据序列号组装数据
# 关于四次挥手
![](https://box.kancloud.cn/52d04b2261838ec5aa1e21bf3e757ad7_674x834.png)
## client和server的状态基
* client
* 发送FIN package:establish -> FIN_WAIT_1
* 接收ACK package:FIN_WAIT_1 -> FIN_WAIT_2
* 接收FIN package,发送ACK package:FIN_WAIT_2 -> TIME_WAIT
* 等待2MSL之后:TIME_WAIT -> CLOSED
* server
* 接收FIN packet,发送ACK packet:establish -> CLOSE_WAIT
* 等待数据包发送完毕,发送FIN package:CLOSE_WAIT -> LAST_ACK
* 接收ACK package:LAST_ACK -> CLOSED
## Client从TIME_WAIT切换到CLOSED
Client确认ACK报文已到达Server之后将状态由TIME_WAIT切换到CLOSED。
确认到达的方式:
1. Server在没有收到AKC报文的情况下,会重新往Client发送FIN报文,再等待Client返回AKC报文。如果在一个请求的来回周期内Client没有重复收到FIN报文,表示Server已经收到了client发送的ACK报文。
*****
# 3次握手,4次挥手,TIME_WAIT的意义
## 3次握手
* 确认client,server双方各自的收发能力正常
* 假如server不需要发送syn包,在接收完client的syn包之后就进入establish状态,由于网络传输的不稳定性,可能出现已被client确认无效的syn包,延迟到达了server,server进入空等client数据的状态。
## 四次挥手
* 因为TCP连接是全双工的网络协议,需要确认client和server都完成了数据发送
## TIME_WAIT状态的意义
client在等待两个两个最长等待时间之后,由TIME_WAIT切换为CLOSED。client发送的ack package可能意外丢失,需要重新发送ack package