1. 程式人生 > >TCP協議(數據傳輸層)的連接過程【三次握手四次揮別】

TCP協議(數據傳輸層)的連接過程【三次握手四次揮別】

網絡基礎

前段時間學習OSI網絡模型感覺自己懂了其實,還很淺顯這兩條想深入的學習一下就把自己的心的寫在這裏,供大家參考指正。
前言
TCP是一個面向連接的協議。無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。就這點與無連接協議如UDP不同,UDP向一端發送數據報時,無需任何握手。
一、TCP報文段的內容
TCP數據報文外邊是包裹的網絡層IP協議的報文如下圖
技術分享圖片

IP首部就是目的和源的IP地址什麽的這裏就先不研究了重點是這個TCP首部數據格式如下。如果不計任選字段通常是20個字節。
技術分享圖片

序號:Seq序號,占32位用來標識TCP源端向目的端發送的字節流,發起方發送數據是對此進行標記。
確認序號:ack序號,只有ACK標誌位為1時,確認序號段才有效,ack=Seq+1

標誌位有6個:
?URG:緊急指針有效
?ACK:確認序號有效
?PSH:接收方應該盡快將這個報文交給應用層處理
?RST:重置鏈接
?SYN:發起一個新連接
?FIN:釋放一個連接
註意事項:
1)不要將確認序號ack(小寫)與確認標誌位ACK搞混
2)確認方ack=發起方Seq+1兩端配對
二、三次握手
所謂三次握手(Three-way Handshke)就是建立TCP連接,意思就是互相要傳送3個包以確定連接的建立。(在socket變成中,這一過程由客戶端執行connetc來觸發在C語言中使用過於bind配合)
技術分享圖片

三次握手:
1)Client將標誌SYN置為1,隨機產生一個值Seq=x
2)Server收到數據包由標誌位SYN=1知道client請求建立連接.server將標誌位SYN和ACK都置為1之後ack=x+1,隨機產生一個seq=y。並將數據發送給client確認請求

3)Client收到確認後檢查ack是否為x+1。ACK是否為1.如果正確側將ACK置為1然後ack=y+1。將數據發送給server。Server檢查ack是否為y+1。ACK是否為1如果正確則連接建立成功。
三、四次揮手
技術分享圖片

由於TCP連接是全雙工的,因此每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方的連接,收到FIN只是意味著這一方向上沒有數據流動了,即不會在收到數據但是這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉而另一方則執行被動關閉。
1)client發送一個FIN,用來關閉client到server的數據傳送,

2)Server收到一FIN後,發送一個ACK給client,確認序號為收到序號+1(與SYN一樣,一個FIN占用一個序號),
3)Server發送一個FIN用來關閉server到client的數據傳送
4)Client收到FIN後發送一個ACK給server確認序號為收到序號+1
完成了四次揮手告別

TCP協議(數據傳輸層)的連接過程【三次握手四次揮別】