tcp核心:流量控制 擁塞控制
流量控制:滑動視窗來實現, 防止接收方能夠處理過來
擁塞控制:防止過多的包被傳送到網路中,避免出現網路負載過大
說一說 擁塞控制:
擁塞控制狀態機的狀態有五種,分別是open,disorder,cwr,recovery和loss狀態
四個演算法為慢啟動,擁塞避免,擁塞發生時演算法和快速恢復。
open狀態是擁塞控制狀態機的預設狀態。
這種狀態下,當ack到達時,傳送方根據擁塞視窗cwnd(congestion window)是小於還是大於慢啟動閾值ssthresh(slow start threshold),來按照慢啟動或者擁塞避免演算法來調整擁塞視窗。
當傳送方檢測到dack(重複確認)或者sack(選擇性確認)時,狀態機將轉變為disorder狀態。在此狀態下,傳送方遵循飛行(in-flight)包守恆原則,即乙個新包只有在乙個老包離開網路後才傳送,也就是傳送方收到老包的ack後,才會再傳送乙個新包。
傳送方接收到乙個擁塞通知時,並不會立刻減少擁塞視窗cwnd,而是每收到兩個ack(每隔乙個新的ack到達)就減少乙個段,直到視窗的大小減半為止。當cwnd正在減小並且網路中有沒有重傳包時,這個狀態就叫cwr(congestion window reduced,擁塞視窗減少)狀態。cwr狀態可以轉變成recovery或者loss狀態。
當傳送方接收到足夠(推薦為三個)的dack(重複確認)後,進入該狀態。在該狀態下,擁塞視窗cnwd每收到兩個ack就減少乙個段(segment),直到cwnd等於慢啟動閾值ssthresh,也就是剛進入recover狀態時cwnd的一半大小。 傳送方保持 recovery 狀態直到所有進入 recovery狀態時正在傳送的資料段都成功地被確認,然後傳送方恢復成open狀態,重傳超時有可能中斷 recovery 狀態,進入loss狀態。
當乙個rto(重傳超時時間)到期後,傳送方進入loss狀態。所有正在傳送的資料標記為丟失,擁塞視窗cwnd設定為乙個段(segment),傳送方再次以慢啟動演算法增大擁塞視窗cwnd。
loss 和 recovery 狀態的區別是:loss狀態下,擁塞視窗在傳送方設定為乙個段後增大,而 recovery 狀態下,擁塞視窗只能被減小。loss 狀態不能被其他的狀態中斷,因此,傳送方只有在所有 loss 開始時正在傳輸的資料都得到成功確認後,才能退到 open 狀態。
rfc官方**:http://
關於TCP的狀態機
另外 客戶端與伺服器端建立tcp ip連線後關閉socket後,伺服器端連線的埠 狀態為time wait 是不是所有執行主動關閉的socket都會進入time wait狀態呢?有沒有什麼情況使主動關閉的socket直接進入closed狀態呢?主動關閉的一方在傳送最後乙個 ack 後 就會進入 ti...
ip conntrack的TCP狀態機
深入理解ip conntrack的都知道,ip conntrack本身對於tcp維護了乙個狀態機,值得注意的是,該狀態機和tcp協議本身的狀態機相似但不相同。其區別如下 tcp狀態機 為tcp的兩端分別維護乙個狀態機,tcp連線的主動發起 被動發起和主動關閉 被動關閉的狀態機轉換是不同的。ip co...
ip conntrack的TCP狀態機
深入理解ip conntrack的都知道,ip conntrack本身對於tcp維護了乙個狀態機,值得注意的是,該狀態機和tcp協議本身的狀態機相似但不相同。其區別如下 tcp狀態機 為tcp的兩端分別維護乙個狀態機,tcp連線的主動發起 被動發起和主動關閉 被動關閉的狀態機轉換是不同的。ip co...