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

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

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

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

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

全雙工:同時容許數據在兩個方向上同時傳輸,它在能力上至關於兩個單工通訊方式的結合。spa

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

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

發送到對端即服務器上去(和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_wmemip

相關文章
相關標籤/搜索