# 關于三次握手

## 作用
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序列號的另外一個功能是,在接收方收到多個包之后根據序列號組裝數據
# 關于四次揮手

## 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