TCP/IP基礎概念詳解(面向連接部分)

傳輸層的TCP協議中,我們被問到便會想起一句經典的話“TCP/IP協議是面向連接的,傳輸數據可靠的,面向字節流的”,話說起來容易,但是其中細究其原理,還是很複雜的
面向連接:
在TCP網絡通信模型中,客戶端和服務器之間的進程交互是面向連接的——面向連接就意味着必須確認雙方的連接是可靠的,如何確認雙方的連接是可靠的,以及斷開連接倆端是如何進行的,這裏我們引入了“三次握手,四次揮手”的總結思想
對於TCP來說,
1.服務器首先創建一個監聽socket即Listen_socket,來獲取來自客戶端的通信請求
2.客戶端向服務器發生一個通信請求,請求完成後創立通信socket,此時要與客戶端的socket建立連接
3,客戶端向服務器端發送請求標誌位“SYN= 1”的請求數據,自己進入SYN_SENT狀態,表示等待服務器端回覆的ACK;
這裏插入一下TCP傳輸過程中數據協議的形式:TCP/IP基礎概念詳解(面向連接部分)
(1)16位源端端口和16位對端端口:描述通信的倆端
(2)32位序號+32位確認序號:實現TCP傳輸的包序管理以及確認應答
(3)4位頭部長度:以4字節爲單位,表示TCP報頭最大長度爲60字節——最小是固定的20字節 ——》先取出20固定長度頭部,根據頭部中長度,取出剩餘長度選項數據,剩下的就是data
(4)6位保留位
(5)6位標誌位:
URG:緊急指針標誌
ACK:用於確認請求,確認標誌
PSH:用於提示儘快取出緩存區裏的數據
RST:當產生主機奔潰什麼的重大連接錯誤時,或者被拒絕連接時,重新發送的連接請求
SYN:請求包,用於連接socket的時候發送
FIN:finish包,用於表示自己進程不再接收數據
(6)窗口大小:用於實現滑動窗口機制,傳輸數據是控制流量,控制發送端的發送數據適應接收端的數據處理能力
(7)16位校驗和:校驗數據的一致性
(8)16位 緊急指針:“外帶數據”--這裏不討論,有興趣可以自己看一看
(9)0-40位字節選項數據:比如建立連接時會協商MSS
3.服務端收到SYN,本來只需要回覆一下ACK確認給客戶端,然後服務端在向客戶端發送SYN,等待客戶端ACK回覆,這裏過程是冗餘的,因爲對於服務端此時來說,連接過程是不需要考慮實際數據傳輸的(這裏與四次揮手——斷開連接有很大區別),所以可以將服務器端的ACK和SYN一起置1發送給客戶端,此時服務器端進入SYN-RECV狀態,表示等待客戶端的ACK回覆;
4.客戶度收到服務器端的回覆進入就緒狀態(ESTABLENED狀態),收到服務器端SYN,回覆ACK
5.服務器端收到ACK進入就緒狀態(ESTABLENED)
用圖片來表爲:
TCP/IP基礎概念詳解(面向連接部分)
至此,便是一個完整的“三次握手”,三次握手保證了以客戶端爲主的連接請求與確認,也保證了以服務器爲主的連接請求與確認,體現了“面向連接”的思想,面向連接即保證雙方都有完整的連接過程
————————————————————————————————————————————————————-
6.此時連接已經創建好了,可以進行數據傳輸了
—————————————————————————————————————————————————————
7.如果在傳輸過程中,有某一端(這裏借用客戶端,實際情況倆端都有可能,叫做主動請求端)表示自己不在接收對端(這裏拿服務器端表示,表示被動接受端)的數據了,這時候就會向對端發送一個“FIN包“”,然後自己進入FIN_WAIT1狀態
8.對端(被動接受端)收到(主動請求端)的FIN,回覆ACK表示確認,注意:這裏並不代表主動請求端不再發送數據了,這裏影響到被動接收端不可以將FIN和ACK一起發送,此時主動請求端進入FIN_WAIT2狀態,被動接收端進入CLOSE_WAIT狀態
9.當被動接收端表示自己也不再發送數據了,向對端發送FIN,然後自己進入LAST_ACK狀態,表示等待最後的ACK應答,此時對端進入TIME_WAIT狀態
10.主動請求端收到對端的FIN,確認ACK發送給對端,對端收到ACK徹底斷開,進入CLOSE狀態
11.TIME_WAIT狀態持續一段時間(一般爲2MSS)後進入CLOSE狀態表示徹底關閉
用圖片來表示爲:
TCP/IP基礎概念詳解(面向連接部分)
至此,便是一個完整的“四次揮手”,四次揮手同樣保證了雙方都完整的確立了結束的過程,體現了“面向連接”的思想
值得注意的是
:三次握手與四次揮手中,爲什麼會是“三次”和“四次”?
四次揮手過程中除了斷開連接外,需要考慮期間的數據傳輸,比較發送FIN包僅僅表示自己不再接收數據了,這與三次握手中單一的連接過程有區別,當然,實際使用情況下,若是一端不再接收時,這端也不再發送了,那麼對端也就沒有持續下去的意義了,也可以將FIN和ACK一起打包返回,變成“三次揮手”
,有時候會出現多個TIME_WAITE?
TIME_WAITE狀態存在於主動關閉方,表示對端多個socke發送FIN包,常常見於爬蟲軟件
, 有時候會出現多個CLOSE_WAITE?
CLOSE_WAITE出現在被動接收端,是收到了好多主動請求端的FIN包,出現的原因多是關閉的連接但是套接字依舊存在,沒有在關閉連接後及時的關閉套接字
, 爲什麼要有TIME_WAITE狀態?
用於預防最後一次ACK如果丟了,就會重傳FIN,但是這個時候倘若前一次FIN後立即釋放了,可能在相同地址下已經建立起新的socket,這種時候就會出現很大的問題,因此設置TIME_WAIT狀態,用於確保最後ACK傳輸成功,也就是正確處理到收到的FIN包,讓這個FIN包消失再網絡裏
下次將繼續分析可靠傳輸和麪向字節流,分析裏面的一些思想和機制,諸如滑動窗口機制,延遲迴復機制等等;
謝謝觀看,誠邀批評指正

















































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章