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