文章目錄
- TCP連接建立的程序
- 三次握手
- TCP斷開連接的程序
- 四次揮手
- 為什么要四次揮手?
- TCP確保可靠性的機制
TCP連接建立的程序
回顧昨天講的TCP頭部有哪些資訊

記住這幾個標記位的含義:
SYN synchronous建立聯機 在連接建立時用來同步序號
ACK acknowledgement 確認 為1時表明確認號欄位有效
PSH push傳送 為1時接收方應盡快將這個報文段交給應用層
FIN finish結束 為1時表明發送端資料發送完畢要求釋放連接
RST reset重置 為1時表明TCP連接出現故障必須重建連接
URG urgent緊急 為1時表明緊急指標欄位有效
Sequence number 順序號碼
Acknowledge number 確認號碼
三次握手
所謂三次握手(Three-Way Handshake)即建立TCP連接,是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立,

- 第一次握手:客戶端將標志位SYN置為1,隨機產生一個值seq=X,并將該資料包發送給服務端,客戶端進入SYN_SENT狀態,等待服務端確認,
- 第二次握手:服務端收到資料包后由標志位SYN=1知道客戶端請求建立連接,服務端將標志位SYN和ACK都置為1,ACK number=X+1,隨機產生一個值seq=Y,并將該資料包發送給客戶端以確認連接請求,服務端進入SYN_RCVD狀態,
- 第三次握手:客戶端收到確認后,檢查ACK number是否為X+1,ACK是否為1,如果正確則將標志位ACK置為1,ACK number=Y+1,并將該資料包發送給服務端,服務端檢查ack是否為Y+1,ACK是否為1,如果正確則連接建立成功,客戶端和服務端進入ESTABLISHED狀態,完成三次握手,隨后客戶端與服務端之間可以開始傳輸資料了,
TCP斷開連接的程序
由于TCP連接時雙向的的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成資料發送任務后,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有資料流動了,也就是不會再收到資料了,但是在這個TCP連接上仍然能夠發送資料,直到這一方向也發送了FIN,首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉
四次揮手

- 第一次揮手:Client發送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀態,
- 第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1,Server進入CLOSE_WAIT狀態,
- 第三次揮手:Server發送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀態,
- 第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手,
為什么要四次揮手?
確保資料能夠完整傳輸,當被動方收到主動方的FIN報文通知時,它僅僅表示主動方沒有資料再發送給被動方了,但未必被動方所有的資料都完整的發送給了主動方,所以被動方不會馬上關閉SOCKET,它可能還需要發送一些資料給主動方后,再發送FIN報文給主動方,告訴主動方同意關閉連接,所以這里的ACK報文和FIN報文多數情況下都是分開發送的,
TCP確保可靠性的機制
-
確認
每次資料的流通,都需要各自發一個ACK來進行確認 -
重傳
假如A給B發了一個包,B一直沒有回復ACK,A就會懷疑B沒有收到到,就會重新發送這個包,這就是重傳 -
排序

-
流控
流控采用的機制是:滑動視窗TCP頭部里面的視窗大小就是,允許一次能傳幾個包
假如規定的視窗大小為10,就是說A給B傳包的時候,一次性可以傳10個,而B只用給A發送一次ACK,這就大大提高了傳輸效率,
假如A給B傳10個,B只收到了6個,那么下一次B給A發的ACK number就會是7,因為7-10的包沒收到,而且A下一次的傳輸也就只會傳7個了
那么再假如B這次把A給的7個包全部收到了,那么下一次A就不一定會發7個包給B,而是會發7個以上的包(感覺就像有腦子一樣,會壓榨),總之,這個流控的程序就是動態的,所用的這個機制就叫做滑動視窗
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299159.html
標籤:其他
上一篇:TCP三次握手,四次揮手詳解
下一篇:Spug發布前端專案實戰全程序
