一---導讀緩存
首先咱們來看實際生活中這樣一個實例,大人喂小孩子吃飯,若是孩子嘴裏還有飯,孩子表示不想吃了,但大人仍是繼續喂。喂多了。這樣就會給孩子留下一個完整的不愉快童年。spa
那麼在使用TCP協議的雙方端系統中,發送方就像餵飯的大人,而接收方就是孩子,發送方發送的量應該由接收方來決定或者說來調節。操作系統
二---TCP流量控制(flow control)的產生緣由以及控制手段blog
讓發送方不要太快,以避免接收方接收不過來。滑動窗口就是控制手段。im
上圖即爲滑動窗口,圖示滑動窗口大小爲400,滑動窗口由接收方調節。數據
三---實例說明協議
在看下圖以前,咱們首先必須搞清楚這樣幾個專有名詞的含義英文
1---seq(順序;序號;初始序號;序列號;排列機):是TCP報文段首部中的序號字段,取值爲1則表示TCP報文段數據載荷的第一個字節的序號爲1,取值爲101表示TCP報文段數據載荷的第一個字節的序號爲101;img
2---DATA:表示TCP報文段;計算機
3---ACK(Acknowledge character 接收字符):表示TCP報文段首部中的標識位,取值爲1表示是一個確認報文段,爲0表示報文中不包含確認信息,忽略確認號字段。
4---ack:表示TCP報文段中的確認號字段,取值爲x表示發送方發送的x部分的字節已經確認收到;
5---rwnd(receive window):滑動窗口的英文名;滑動窗口也可理解爲接收窗口。
四---死鎖的產生和解決
思考這樣一個問題,當接收方發送給發送方的確認報文段丟失,而它一直傻傻的覺得報文段成功被接收方接收,滿懷期待的等着接收方發送新的報文段給它。然而另外一邊,發送方一直等待着接收方發送的確認報文段,好繼續發送新的報文段給接收方,然而確認報文段在路上的時候就走丟了。因而雙方陷入千年的等待。這就是死鎖(死鎖在計算機操做系統中也出現了這個概念,思想和計算機網路的大體相同)。這個時候就須要一個來解決問題的調節員。持續計時器就是這樣一個調解員,若超時了,發送方發送一個大小爲1字節的0窗口探測報文段。若是接收方回答爲當前的接收窗口爲0,則發送方繼續等待,等待一會後,若是接收方的接收緩存有了空閒,則發送能接受多大的接收窗口(rwnd)給發送方,發送方按照接收方回答的值調整滑動窗口繼續去發送報文段。
朋友們可能會有這樣一個疑問,既然接收方的接收窗口都爲0了,那就應該什麼都收不到纔對,爲何能收到發送發送的0窗口探測報文段而且返回確認呢? 這是由於TCP規定,即便接收窗口爲0,接收方必須無條件的接收0窗口探測報文段,攜帶緊急數據的報文段,確認報文段。
繼續思考這樣一個問題:若是0窗口檢測報文段丟失了,會出現什麼問題?還能打破死鎖的局面嗎?回答是確定的,由於0窗口探測報文段自己帶有重傳計時器,若是重傳計時器超時,則從新發送0窗口探測報文段