TFTP使用了停止等待協(xié)議。數(shù)據(jù)發(fā)送方在發(fā)送下一塊數(shù)據(jù)塊之前必須要接受對已發(fā)送數(shù)據(jù)的確認怀读。
TCP使用的流量控制方法是滑動窗口協(xié)議菜枷。該協(xié)議允許發(fā)送方在停止能帶確認前可以連續(xù)發(fā)送多個分組,不必每發(fā)送一個分組就停下來確認啤誊。該協(xié)議加速了數(shù)據(jù)的傳輸。使用TCP的滑動窗口協(xié)議時瞳筏,接收方不必確認每一個收到的分組牡昆。
滑動窗口
窗口大小和確認序號是相對應(yīng)的柱宦。發(fā)送方計算它的可用窗口捷沸,該窗口表明有多少數(shù)據(jù)可立即被發(fā)送。
當接收方確認數(shù)據(jù)后痒给,這個滑動窗口不時地向右移動苍柏。窗口兩個邊沿的相對運動增加或減少了窗口的大小试吁。
當數(shù)據(jù)被發(fā)送且被確認時,窗口左邊向右邊沿靠近為窗口合攏烛恤。
當另一端的接收進程讀取已確認的數(shù)據(jù)并釋放TCP的接收緩存時缚柏,窗口右沿向右移動允許發(fā)送更多的數(shù)據(jù)碟贾,這稱為窗口張開。
當右邊沿向左移動時杀餐,稱為窗口收縮史翘。
如果接收到一個指示窗口左邊沿向左移動到ACK恶座,則它被認為是一個重復(fù)的ACK沥阳,并被丟棄。
如果左邊沿到達右邊沿脉让,則被稱為一個零窗口溅潜,此時發(fā)送方不能發(fā)送任何數(shù)據(jù)滚澜。
發(fā)送方不必發(fā)送一個全窗口大小的數(shù)據(jù)(有MSS限制)
來自接收方的一個報文段確認數(shù)據(jù)并把窗口向右移動嫁怀,這是因為窗口的大小是相對于確認序號的。
窗口的大小可以減小萝招,但是窗口的右邊沿不能向左移動存捺。
接收方在發(fā)送一個ACK前不必等待窗口被填滿。
窗口大小
窗口的大小通常由接收進程控制纽窟。API允許進程設(shè)置發(fā)送和接收緩存的大小臂港,接收緩存的小大是該連接上所能通告的最大窗口大小
PUSH標志
發(fā)送方使用PUSH標志通知接收方將所收到的數(shù)據(jù)全部提交給接收進程。這里的數(shù)據(jù)包括與PUSH一起傳送的數(shù)據(jù)以及接收方TCP已經(jīng)收到的其他數(shù)據(jù)周蹭。當TCP接收到一個設(shè)置了PUSH標志的報文段時,它需要立即將這些數(shù)據(jù)遞交給服務(wù)器進程而不能等待判斷是否還有額外的數(shù)據(jù)到達疲恢。
慢啟動
在一些情況下凶朗,發(fā)送方一開始就向網(wǎng)絡(luò)發(fā)送多個報文段,直至達到接收方通告的窗口大小為止显拳。當接收方和發(fā)送方處在同一個局域網(wǎng)時棚愤,這種方式是可以的。但是如果發(fā)送方和接收方之間存在多個路由器和速率較慢的鏈路時杂数,一些中間路由器就必須緩存分組宛畦,并可能就會耗盡存儲器的空間。
慢啟動的算法揍移,通過觀察到新分組進入網(wǎng)絡(luò)的速率應(yīng)該與另一端返回確認的速率相同而工作次和。
慢啟動為TCP增加了一個窗口:擁塞窗口(cwnd)。擁塞窗口被初始化為1個報文段(即另一端通告的報文段發(fā)小MSS)那伐。每收到一個ACK,擁塞窗口就增加一個報文段(cwnd以字節(jié)為單位畅形,慢啟動以報文段大小為單位)發(fā)送端則取擁塞窗口和通告的滑動窗口的最小值為發(fā)送上限。
擁塞窗口是發(fā)送方使用的流量控制,而通告窗口則是接收方使用的流量控制。當在某些點上可能達到了互聯(lián)網(wǎng)的容量帘皿,于是中間路由器開始丟棄分組丁恭,這時就通知發(fā)送方它的擁塞窗口開的太大了。
擁塞
當數(shù)據(jù)到達一個快速局域網(wǎng)(大的管道)并向一個較慢的局域網(wǎng)(小的管道)發(fā)送時,就會產(chǎn)生擁塞。當多個輸入流到達一個路由器飒赃,而路由器的輸出流小于這些輸入流時也會產(chǎn)生擁塞臀栈,會引起路由器丟棄分組藕漱。
緊急方式
可以通過設(shè)置TCP中URG比特位為1,并16bit的緊急指針設(shè)置為一個正的偏移量,該偏移量與TCP首部中的序號字段相加,以便得出緊急數(shù)據(jù)的最后一個字節(jié)的序號。