理解TCP的通信原理及IO阻塞
通過上面這個簡單的案例,基本清楚了在Java應用程序中如何使用socket套接字來建立一個基于tcp協議的通信流程。接下來,我們在來了解一下tcp的底層通信過程是什么樣的?
了解TCP協議的通信過程?
首先,對于TCP通信來說,每個TCP Socket的內核中都有一個發送緩沖區和一個接收緩沖區,TCP的全雙工的工作模式及TCP的滑動窗口就是依賴于這兩個獨立的Buffer和該Buffer的填充狀態。?
接收緩沖區把數據緩存到內核,若應用進程一直沒有調用Socket的read方法進行讀取,那么該數據會一直被緩存在接收緩沖區內。不管進程是否讀取Socket,對端發來的數據都會經過內核接收并緩存到Socket的內核接收緩沖區。?
read所要做的工作,就是把內核接收緩沖區中的數據復制到應用層用戶的Buffer里。?
進程調用Socket的send發送數據的時候,一般情況下是將數據從應用層用戶的Buffer里復制到Socket的內核發送緩沖區,然后send就會在上層返回。換句話說,send返回時,數據不一定會被發送到對端。?
前面我們提到,Socket的接收緩沖區被TCP用來緩存網絡上收到的數據,一直保存到應用進程讀走為止。如果應用進程一直沒有讀取,那么Buffer滿了以后,出現的情況是:通知對端TCP協議中的窗口關閉,保證TCP接收緩沖區不會移除,保證了TCP是可靠傳輸的。如果對方無視窗口大小發出了超過窗口大小的數據,那么接收方會把這些數據丟棄。?
滑動窗口協議?
這個過程中涉及到了TCP的滑動窗口協議,滑動窗口(Sliding window)是一種流量控制技術。早期的網絡通信中,通信雙方不會考慮網絡的擁擠情況直接發送數據。由于大家不知道網絡擁塞狀況,同時發送數據,導致中間節點阻塞掉包,誰也發不了數據,所以就有了滑動窗口機制來解決此問題;發送和接受方都會維護一個數據幀的序列,這個序列被稱作窗口?
發送窗口?
就是發送端允許連續發送的幀的序號表。
發送端可以不等待應答而連續發送的最大幀數稱為發送窗口的尺寸。?
接收窗口?
接收方允許接收的幀的序號表,凡落在接收窗口內的幀,接收方都必須處理,落在接收窗口外的幀被丟棄。?
接收方每次允許接收的幀數稱為接收窗口的尺寸。?
在線滑動窗口演示功能?
https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/selective-repeat-protocol/index.html?
?
總結
以上是生活随笔為你收集整理的理解TCP的通信原理及IO阻塞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过一个图来简单描述一下 socket
- 下一篇: 理解阻塞到底是什么回事