TCP四次挥手原因
客戶端發了一個FIN 501(0) ACK 701 ,然后服務端回了一個ACK502 。。此時客戶端就處于半關閉狀態。
至于半關閉的話,還得詳細解釋一下:
剛開始(左邊)客戶端和服務端(右邊)都可以互相進行通信,都能進行 發送數據和接收數據,但當 客戶端處于半關閉時,就變成了下面這樣
(此圖只是舉個例子,沒必要糾結圖)這圖想表達的就是,客戶端(左邊)只能進行接收數據,而不能發送數據, 服務端(右邊)能進行發送數據和接收數據
這個半關閉狀態是什么時候有的呢?在代碼層面來理解:
當我們服務端的read函數返回0,說明客戶端的數據已經到結尾了,然后客戶端半關閉事件嘍
當服務端close返回的時候,說明4次揮手成功,連接關閉嘍。
這種是通過什么機制實現的呢?
因為一個 套接字(左右方框均可看成一個套接字) 中有兩個緩沖區,一個讀緩沖區,一個寫緩沖區
當一個套接字處于半關閉狀態時,也就代表,關閉了寫緩沖區,讀緩沖區依然開啟。所以利用這個套接字依然能進行讀數據,但是不能寫數據,這就是半關閉狀態。。相同概念,所以客戶端和服務端各自都來關一次,就4次揮手
接下來兩次揮手
綜合起來就是:
這里大家是不是還會有一個小疑問?半關閉后的客戶端為什么還能發送ACK呢?
半關閉并非關 套接字,而是關緩沖區!!!也就是關掉內核的寫緩沖區,也就是客戶端不會再向服務端寫數據了,但是客戶端與服務端之間的連接還在的呀,仔細看這圖,所以可以返回ACK應答的
總結如下:
三次握手:
主動放松連接請求端,發送SYN標志位,請求建立連接。攜帶序號,數據字節數(0),滑動窗口大小
被動接受連接請求端,發送ACK標志位,同時攜帶SYN請求標志位。攜帶序號,確認序號,數據字節數(0),滑動窗口大小
主動發起連接請求端,發送 ACK標志位,應答服務器連接請求。攜帶確認序號。
四次揮手:
主動關閉連接請求端,發送FIN標志位。
被動關閉連接請求端,應答ACK標志位。 --------------半關閉完成
被動關閉連接請求端,發送FIN標志位。
主動關閉連接請求端,應答ACK標志位。 ----------------連接全部關閉
滑動窗口:
發送給連接對端,本端的緩沖區大小(實時),保證數據不會丟失。
總結
- 上一篇: 磁盘调度算法java代码
- 下一篇: final、finally、finali