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將丟棄它。

查看socket發送緩沖區大小,cat /proc/sys/net/ipv4/tcp_wmem

 


免責聲明!

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



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