內容原創,未經本人同意請勿轉載。聯系本人:jianshu_kevin@126.com
擁塞窗口(congestion window, cwd)
顧名思義,擁塞窗口就是用來避免網絡擁塞而設計的一個針對發送方保存的一個變量,是指發送方允許向網絡發送的數據量。tcp在發送數據時不是隨意發送的,要根據擁塞窗口來確定當前的可發送數據的大小。
初始擁塞窗口大小
初始擁塞窗口在RFC2581
中有明確的定義:
- 不超過發送放的2*MSS
- 不得超過兩個TCP包
發送過程中的窗口變化(建議后面再看)
慢啟動
當網絡狀況不好的情況下,為了避免網絡狀態進一步惡化,而采取的一種減少數據發送的一種策略。
慢啟動門限值(ssthresh)
擁塞避免
系統采用滿啟動后,隨著網絡狀況好轉,如果發送方數據持續發送,那么數據量會越來越大。擁塞窗口CWD
會不斷變大,為了避免數據量過大,就需要采取擁塞避免。
快速重傳
快速重傳用在網絡狀態有差變好的情況下。當發送方收到一個無序的確認報文后,就立即發送重復確認,為的是讓對方早點知道有報文沒有到達,而不是超時等待后再重傳。
快速重傳算法規定,當發送方收到連續的三次重復確認,就立即發送對方沒有收到的報文段,而不必等待重傳超時到期。
快速恢復
當接收方收到3次重復確認后,說明網絡狀況變好了,沒有必要采用慢啟動算法
,直接采用快速恢復。快速恢復和滿啟動的區別就是可以發送的數據量不同
。
RTT(Round Trip Time)
網絡往返時間,等于一個數據包收到ACK-發送時的時間。
Nagle算法
防止小報數據,大量傳輸引起網絡過載,因為即使1個字節的數據+頭也得有41個字節了。所以為了避免小包數據,該算法采用了如下步驟避免這種情況:
- 緩沖區數量達到一定的上限才發送
- 等待了一段時間(200ms),才啟動發送
socket接口有TCP_CORK選項開關Nagle算法
on = 0;
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 拔去塞子 */
立即/捎帶/延遲 ACK
立即ACK
需要滿足以下條件:
- 狀態為SYN_SENT
- 接收到FIN包
- 整個數據包都在pcb->recv_nxt,立即發送dupack
- 接收到數據包長度為0
延遲ACK
接收到的數據不滿足立即ACK
條件,就會將TF_ACK_DELAY
置位,等待到時發送延遲ACK
捎帶ACK
在延遲ACK
到達之前,如果上層有數據要發送,那么就會將ACK
捎帶在數據中發送,稱為捎帶ack
TCP連接和斷開的流程(非常重要)
Paste_Image.png