TCP的發送緩沖區和接收緩沖區


TCP的發送緩沖區和接收緩沖區

TCP協議是作用是用來進行端對端數據傳送的,那么就會有發送端和接收端,在操作系統有兩個空間即user space和kernal space。

每個Tcp socket連接在內核中都有一個發送緩沖區和接收緩沖區,TCP的全雙工的工作模式以及TCP的流量(擁塞)控制便是依賴於這兩個獨立的buffer以及buffer的填充狀態。

單工:只允許甲方向乙方傳送信息,而乙方不能向甲方傳送 ,如汽車單行道。

半雙工:半雙工就是指一個時間段內只有一個動作發生,甲方可以向乙方傳送數據,乙方也可以向甲方傳送數據,但不能同時進行,如一條窄馬路同一時間只能允許一個車通行。

全雙工:同時允許數據在兩個方向上同時傳輸,它在能力上相當於兩個單工通信方式的結合。

一個socket的兩端,都會有send和recv兩個方法,如client發送數據到server,那么就是客戶端進程調用send發送數據,而send的作用是將數據拷貝進入socket的內核發送緩沖區之中,然后send便會在上層返回。

也就是說send()方法返回之時,數據不一定會

發送到對端即服務器上去(和write寫文件有點類似),send()僅僅是把應用層buffer的數據拷貝進socket的內核發送buffer中,發送是TCP的事情,和send其實沒有太大關系。

接收緩沖區把數據緩存入內核,等待recv()讀取,recv()所做的工作,就是把內核緩沖區中的數據拷貝到應用層用戶的buffer里面,並返回。若應用進程一直沒有調用recv()進行讀取的話,此數據會一直緩存在相應socket的接收緩沖區內。對於TCP,如果應用進程一直沒有讀取,接收緩沖區滿了之后,發生的動作是:收端通知發端,接收窗口關閉(win=0)。這個便是滑動窗口的實現。保證TCP套接口接收緩沖區不會溢出,從而保證了TCP是可靠傳輸。因為對方不允許發出超過所通告窗口大小的數據。 這就是TCP的流量控制,如果對方無視窗口大小而發出了超過窗口大小的數據,則接收方TCP將丟棄它

 

 

TCP/UDP的接收緩沖區和發送緩沖區

1、TCP. SO_RCVBUF & TCP. SO_SNDBUF

每個TCP socket在內核中都有一個發送緩沖區和一個接收緩沖區,TCP的全雙工的工作模式以及TCP的流量(擁塞)控制便是依賴於這兩個獨立的buffer以及buffer的填充狀態。

1.1 接收端沖區

接收緩沖區把數據緩存入內核,應用進程一直沒有調用recv()進行讀取的話,此數據會一直緩存在相應socket的接收緩沖區內。不管進程是否調用recv()讀取socket,對端發來的數據都會經由內核接收並且緩存到socket的內核接收緩沖區之中。

recv(),就是把內核緩沖區中的數據拷貝到應用層用戶的buffer里面,並返回;

1.2發送緩沖區

進程調用send()發送的數據的時候,最簡單情況(也是一般情況),將數據拷貝進入socket的內核發送緩沖區之中,然后send便會在上層返回。換句話說,send()返回之時,數據不一定會發送到對端去(和write寫文件有點類似)。

send(),僅僅是把應用層buffer的數據拷貝進socket的內核發送buffer中,發送是TCP的事情,和send其實沒有太大關系。

1.3 實際應用

接收緩沖區被TCP和UDP用來緩存網絡上來的數據,一直保存到應用進程讀走為止。

對於TCP,如果應用進程一直沒有讀取,接收緩沖區滿了之后,發生的動作是:接收端通知發發端,接收窗口關閉(win=0)。這個便是滑動窗口的實現。保證TCP套接口接收緩沖區不會溢出,從而保證了TCP是可靠傳輸。因為對方不允許發出超過所通告窗口大小的數據。 這就是TCP的流量控制,如果對方無視窗口大小而發出了超過窗口大小的數據,則接收方TCP將丟棄它。

1.4 問題

能發出多少TCP包以及每個包承載多少數據,除了受到自身服務器配置和環境帶寬影響,對端的接收狀態也能影響你的發送狀況。

查看測試機的socket發送緩沖區大小,如圖1所示:

http://blog.chinaunix.net/attachment/201309/25/29075379_1380094314RfyB.jpg

第一個值是一個限制值,socket發送緩存區的最少字節數;
第二個值是默認值;
第三個值是一個限制值,socket發送緩存區的最大字節數;
根據實際測試,發送緩沖區的尺寸在默認情況下的全局設置是16384字節,即16k。
proc文件系統下的值和sysctl中的值都是全局值,應用程序可根據需要在程序中使用setsockopt()對某個socket的發送緩沖區尺寸進行單獨修改。

解決思路:通過合理的設置“TCP.SO_RCVBUF & TCP.SO_SNDBUF”來提高系統的吞吐量以及快速檢測tcp鏈路的連通性; 這兩個選項就是來設置TCP連接的兩個buffer尺寸的。

2、UDP接收緩沖區

每個UDP socket都有一個接收緩沖區,沒有發送緩沖區,從概念上來說就是只要有數據就發,不管對方是否可以正確接收,所以不緩沖,不需要發送緩沖區。

UDP:當套接口接收緩沖區滿時,新來的數據報無法進入接收緩沖區,此數據報就被丟棄。UDP是沒有流量控制的;快的發送者可以很容易地就淹沒慢的接收者,導致接收方的UDP丟棄數據報。

3、總結

這也是TCP可靠,UDP不可靠的表現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM