TCP緩沖區大小及限制


TCP輸出

下圖展示了應用進程寫數據到TCP套接口的過程。

 

每一個TCP套接口有一個發送緩沖區,我們可以用SO_SNDBUF套接口選項來改變這個緩沖區的大小。當應用程序調用write時,內核從應用程序進程的緩沖區中拷貝所有數據到套接口的發送緩沖區。如果套接口的發送緩沖區容不下應用程序的所有數據(或是應用程序的緩沖區大於套接口發送緩沖區,或是套接口發送緩沖區還有其他數據),應用進程將被掛起(睡眠)。這里假設套接口是阻塞的,它是通常的缺省設置(還有非阻塞的套接口)。內核將不從write系統調用返回,直到應用程序緩沖區中的所有數據都拷貝到套接口發送緩沖區。因此從寫一個TCP套接口的write調用成功返回僅僅表示我們可以重新使用應用進程的緩沖區。它並不告訴我們對端的TCP或應用程序已接收到數據。

TCP取套接口發送緩沖區的數據並把它發送給對端TCP,其過程基於TCP數據傳送的所有規則。對端TCP必需確認收到數據,只有收到對端的ACK,本端TCP才能刪除套接口發送緩沖區中已確認的數據。TCP必需保留數據拷貝直到對端確認為止。

TCP以MSS大小的或更小的塊把數據傳遞給IP,同時給每個數據塊安上一個TCP頭部以構成TCP分節,其中的MSS是由對端通告的,當對端未通告時就用536這個值(IPv4的最小重組緩沖區字節數576減去IPv4頭部字節20和TCP頭部字節數20)。IP給每個TCP分節安上IP頭部以構成IP數據報,查找其宿IP地址的路由表項以確定外出接口,然后把數據報傳遞給相應的數據鏈路。IP可能在把數據報傳遞給數據鏈路之前將其分片,不過我們已經談到MSS選項的目的之一就是試圖避免分片,而較新的實現又使用了路徑MTU發現功能。每個數據鏈路都有一個輸出隊列,如果該隊列已滿,那么新到的分組將被丟棄,並沿協議棧向上返回一個錯誤,從鏈路層到IP層,再從IP層到TCP層。TCP將注意到這個錯誤,並在以后某個時刻重傳相應分片。應用進程並不知道這種暫時情況。

UDP輸出:

下圖展示了應用進程寫數據到UDP套接口的過程。

這一次我們展示的套接口發送緩沖區用虛線框,因為它並不存在。UDP套接口有發送緩沖區大小(我們可以用SO_SNDBUF套接口選項修改),不過它僅僅是寫到套接口的UDP數據報的大小上限。如果應用進程寫一個大於套接口發送緩沖區大小的數據包,內核將返回一個EMSGSIZE錯誤。既然UDP是不可靠的,它不必保存應用程序的數據拷貝,因此無需一個真正的發送緩沖區。(應用進程的數據在沿協議向下傳遞時,以某種形式拷貝到內核的緩沖區,然而數據鏈路層在送出這些數據后將丟棄該拷貝)

UDP簡單地給用戶數據報安上它的8個字節的頭部以構成UDP數據報,然后傳遞給IP。IPv4或IPv6給UDP數據報安上相應的IP頭部以構成IP數據報,執行路由操作確定外出接口,然后直接把數據包加入數據鏈路層輸出隊列(如果適合於MTU),或者分片后再把每個片加入數據鏈路層的輸出隊列。如果某個UDP應用進程發送大數據報,那么它比TCP應用進程更有可能分片,因為TCP會把應用數據划分成MSS大小的塊,而UDP卻沒有對等的手段。

 

 

從寫UDP套接口的write調用成功地返回表示用戶寫入的數據報或其所有片段已被加入數據鏈路層的輸出隊列。如果該隊列沒有足夠的空間存放該數據報或它的某個片段,內核通常將給應用程序返回一個ENOBUFS錯誤。

SCTP輸出:

 

上圖展示了應用程序寫數據到SCTP套接口的過程。

 

既然SCTP是類似TCP的可靠協議,它的套接口也有一個發送緩沖區,而且跟TCP一樣,我們可以用SO_SNDBUF套接口選項來改變這個緩沖區的大小。當應用進程調用write時,內核從應用進程的緩沖區中拷貝所有數據到套接口的發送緩沖區。如果套接口的發送緩沖區容不下應用程序的所有數據(或是應用程序的緩沖區大於套接口發送緩沖區,或是套接口發送緩沖區還有其他數據),應用進程將被投入睡眠。這里假設套接口是阻塞的,它是通常的缺省設置。內核將不從write系統調用返回,直到應用進程緩沖區中的所有數據都拷貝到套接口發送緩沖區。因此從寫一個SCTP套接口的write調用成功返回僅僅表示我們可以重新使用應用進程的緩沖區。它並不告訴我們對端的SCTP或應用進程已接收到數據。

SCTP取套接口發送緩沖區的數據並把它發送給對端SCTP,其過程基於SCTP數據傳送的所有規則。SCTP必須等待SACK,在累計確認點超過已發送的數據后,才可以從套接口緩沖區中刪除這些數據。

http://www.cnblogs.com/ChangeIt/archive/2011/12/23/2298207.html


免責聲明!

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



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