TCP/UDP詳解...

本文已經(jīng)優(yōu)先發(fā)表在掘金粘捎,請(qǐng)不要重讀,浪費(fèi)時(shí)間哦

GitHub

點(diǎn)個(gè)贊收藏吧

傳輸層

本文主要講的是傳輸中的兩大重要協(xié)議TCP和UDP,雖然在Android開(kāi)發(fā)中惭嚣,并不需要了解到這么底層,但有理論的支撐悔政,寫代碼總是很自信的啦晚吞。理論指導(dǎo)著實(shí)踐,實(shí)踐是理論檢驗(yàn)的唯一標(biāo)準(zhǔn)谋国。站在巨人的肩膀窺伺網(wǎng)絡(luò)世界载矿。

image

用戶數(shù)據(jù)報(bào)協(xié)議UDP

用戶數(shù)據(jù)報(bào)協(xié)議UDP只在IP的數(shù)據(jù)報(bào)服務(wù)至上增加了復(fù)用和分用的功能以及差錯(cuò)檢測(cè)的功能。只有面向無(wú)連接的報(bào)文,不可靠傳輸?shù)奶攸c(diǎn)闷盔。UDP對(duì)應(yīng)用層交下來(lái)的數(shù)據(jù)只添加首部弯洗,并進(jìn)行特別的處理,就交給網(wǎng)絡(luò)層逢勾;對(duì)網(wǎng)絡(luò)層傳遞上來(lái)的用戶數(shù)據(jù)報(bào)拆封首部后牡整,原封不動(dòng)的交給應(yīng)用層。

image

1溺拱、UDP的首部格式

用戶數(shù)據(jù)報(bào)UDP分為兩個(gè)字段:數(shù)據(jù)字段和首部字段逃贝,從圖來(lái)分析用戶數(shù)據(jù)報(bào)UDP的首部格式。


image

UDP首部字段很簡(jiǎn)單迫摔,由4個(gè)字段組成沐扳,每個(gè)字段的長(zhǎng)度都是兩個(gè)字節(jié),共8字節(jié)句占。

  • 源端口 原端口號(hào)沪摄,在需要對(duì)方回信時(shí)選用,不需要時(shí)可全0
  • 目的端口 目的端口號(hào)纱烘,這在終點(diǎn)交付報(bào)文時(shí)必須使用杨拐,不然數(shù)據(jù)交給誰(shuí)呢?
  • 長(zhǎng)度 UDP的長(zhǎng)度擂啥,最小值為8字節(jié)哄陶,僅有首部
  • 檢驗(yàn)和 檢測(cè)用戶數(shù)據(jù)報(bào)在傳輸過(guò)程是否有錯(cuò),有錯(cuò)就丟棄哺壶。

在傳輸?shù)倪^(guò)程中屋吨,如果接收方UDP發(fā)現(xiàn)收到的報(bào)文中的目的端口不存在,會(huì)直接丟棄山宾,然后由網(wǎng)際控制報(bào)文協(xié)議ICMP給發(fā)送方發(fā)送“端口不可達(dá)”差錯(cuò)報(bào)文至扰。

2、偽首部

計(jì)算校驗(yàn)和時(shí)塌碌,需要在UDP之前增加12個(gè)字節(jié)的偽首部渊胸。這種首部并不是用戶數(shù)據(jù)報(bào)的真正首部。偽首部并不在網(wǎng)絡(luò)中傳輸台妆,只是在計(jì)算檢驗(yàn)和翎猛,臨時(shí)添加在UDP用戶數(shù)據(jù)報(bào)前,得到一個(gè)臨時(shí)的用戶數(shù)據(jù)報(bào)接剩。

UDP的校驗(yàn)和是把首部和數(shù)據(jù)部分一起校驗(yàn)切厘,發(fā)送方計(jì)算校驗(yàn)和的一般步驟:

  1. 將首部的校驗(yàn)和字段填充為0(零)
  2. 把偽首部和用戶數(shù)據(jù)報(bào)UDP看出16位的字符串連接起來(lái)
  3. 如果數(shù)據(jù)部分不是偶數(shù)字節(jié),則填充一個(gè)全零字節(jié)(該字節(jié)不發(fā)送到網(wǎng)絡(luò)層)
  4. 按二進(jìn)制反馬計(jì)算出這些16位字的和
  5. 然后將和寫入校驗(yàn)和字段懊缺,就可以發(fā)送到網(wǎng)絡(luò)層了疫稿。

接收方收到用戶數(shù)據(jù)報(bào)后培他,連同偽首部一起,按二進(jìn)制反碼求這些16位字的和遗座,無(wú)差錯(cuò)結(jié)果是應(yīng)全為1.否則出錯(cuò)舀凛,直接丟棄該報(bào)文。

image

TCP協(xié)議

TCP協(xié)議作為傳輸層主要協(xié)議之一途蒋,具有面向連接猛遍,端到端,可靠的全雙工通信号坡,面向字節(jié)流的數(shù)據(jù)傳輸協(xié)議懊烤。

1、TCP報(bào)文段

雖然TCP面試字節(jié)流宽堆,但TCP傳輸?shù)臄?shù)據(jù)單元卻是報(bào)文段腌紧。TCP報(bào)文段分為TCP首部和數(shù)據(jù)部分,TCP報(bào)文段首部的前20個(gè)字節(jié)是固定的畜隶,后面有4n字節(jié)是更具需要而增加的選項(xiàng)壁肋,最大為40字節(jié)。


image
  • 源端口和目的端口 各占兩個(gè)字節(jié)代箭,TCP的分用功能也是通過(guò)端口實(shí)現(xiàn)的墩划。
  • 序號(hào) 占4個(gè)字節(jié)涕刚,范圍是[0,232],TCP是面向字節(jié)流的嗡综,每個(gè)字節(jié)都是按順序編號(hào)。例如一個(gè)報(bào)文段杜漠,序號(hào)字段是201极景,攜帶數(shù)據(jù)長(zhǎng)度是100,那么第一個(gè)數(shù)據(jù)的序號(hào)就是201驾茴,最后一個(gè)就是300盼樟。當(dāng)達(dá)到最大范圍,又從0開(kāi)始锈至。
  • 確認(rèn)號(hào) 占4個(gè)字節(jié)晨缴,是期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)字節(jié)的序號(hào)。若確認(rèn)號(hào)=N,則表示序號(hào)N前所有的數(shù)據(jù)已經(jīng)正確收到了峡捡。
  • 數(shù)據(jù)偏移 占4位击碗,表示報(bào)文段的數(shù)據(jù)部分的起始位置,距離報(bào)文段的起始位置的距離们拙。間接的指出首部的長(zhǎng)度稍途。
  • 保留 占6位,保留使用砚婆,目前為0.
  • URG(緊急) 當(dāng)URG=1,表明緊急指針字段有效械拍,該報(bào)文段有緊急數(shù)據(jù),應(yīng)盡快發(fā)送。
  • ACK(確認(rèn)) 僅當(dāng)ACK=1時(shí)坷虑,確認(rèn)號(hào)才有效甲馋,連接建立后,所有的報(bào)文段ACK都為1迄损。
  • PSH(推送) 接收方接收到PSH=1的報(bào)文段摔刁,會(huì)盡快交付接收應(yīng)用經(jīng)常,不再等待整個(gè)緩存填滿再交付海蔽。實(shí)際較少使用共屈。
  • RST(復(fù)位) RST=1時(shí),表明TCP連接中出現(xiàn)嚴(yán)重差錯(cuò)党窜,必須是否連接拗引,再重連。
  • SYN(同步) 在建立連接時(shí)用來(lái)同步序號(hào)幌衣。當(dāng)SYN=1,ACK=0矾削,則表明是一個(gè)連接請(qǐng)求報(bào)文段。SYN=1,ACK=1則表示對(duì)方同意連接豁护。TCP建立連接用到哼凯。
  • FIN(終止) 用來(lái)釋放一個(gè)連接窗口。當(dāng)FIN=1時(shí)楚里,表明此報(bào)文段的發(fā)送方不再發(fā)送數(shù)據(jù)断部,請(qǐng)求釋放單向連接。TCP斷開(kāi)連接用到班缎。
  • 窗口 占2個(gè)字節(jié)蝴光,表示自己的發(fā)送方自己的接收窗口,窗口值用來(lái)告訴對(duì)方允許發(fā)送的數(shù)據(jù)量达址。
  • 校驗(yàn)和 占2字節(jié)蔑祟,檢驗(yàn)和字段查驗(yàn)范圍包括首部和數(shù)據(jù)部分。
  • 緊急指正 占2字節(jié)沉唠,URG=1時(shí)疆虚,緊急指針指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)(緊急字節(jié)數(shù)結(jié)束后為普通字節(jié))。
  • 選項(xiàng) 長(zhǎng)度可變满葛,最長(zhǎng)可達(dá)40字節(jié)径簿。例如最大報(bào)文段長(zhǎng)度MSS。MSS指的是數(shù)據(jù)部分的長(zhǎng)度而不是整個(gè)TCP報(bào)文段長(zhǎng)度纱扭,MSS默認(rèn)為536字節(jié)長(zhǎng)牍帚。窗口擴(kuò)大,時(shí)間戳選項(xiàng)等乳蛾。

2暗赶、TCP建立連接-三次握手

三次握手圖例如下,與文字解釋配合使用效果更佳鄙币。

image

第一次:客戶端發(fā)送連接請(qǐng)求報(bào)文給服務(wù)端,其中SYN=1,seq=x蹂随。發(fā)送完畢后進(jìn)入YSN_END狀態(tài)十嘿。

第二次:服務(wù)端接收到報(bào)文后,發(fā)回確認(rèn)報(bào)文岳锁,其中ACK=1,ack=x+1绩衷,因?yàn)樾枰蛻舳舜_認(rèn),所以報(bào)文中也有SYN=1,seq=y的信息激率。發(fā)送完后進(jìn)入SYN_RCVD狀態(tài)咳燕。

第三次:客戶端接收到報(bào)文后,發(fā)送確認(rèn)報(bào)文,其中ACK=1,ack=y+1乒躺。發(fā)送完客戶端進(jìn)入ESTABLISHED狀態(tài)招盲,服務(wù)端接收到報(bào)文后,進(jìn)入ESTABLISHED狀態(tài)嘉冒。到此曹货,連接建立完成。

三次握手原因

避免資源被浪費(fèi)掉讳推。如果在第二步握手時(shí)顶籽,由于網(wǎng)絡(luò)延遲導(dǎo)致確認(rèn)包不能及時(shí)到達(dá)客戶端,那么客戶端會(huì)認(rèn)為第一次握手失敗银觅,再次發(fā)送連接請(qǐng)求礼饱,服務(wù)端收到后再次發(fā)送確認(rèn)包。在這種情況下设拟,服務(wù)端已經(jīng)創(chuàng)建了兩次連接慨仿,等待兩個(gè)客戶端發(fā)送數(shù)據(jù)久脯,而實(shí)際卻只有一個(gè)客戶端發(fā)送數(shù)據(jù)纳胧。

3、TCP斷開(kāi)連接-四次揮手

四次揮手指客戶端和服務(wù)端各發(fā)送一次請(qǐng)求終止連接的報(bào)文帘撰,同時(shí)雙方響應(yīng)彼此的請(qǐng)求跑慕。
四次揮手圖例如下,請(qǐng)配置文字解釋使用哦摧找。

四次揮手圖例

第一次揮手:客戶端發(fā)送FIN=1核行,seq=x的包給服務(wù)端,表示自己沒(méi)有數(shù)據(jù)要進(jìn)行傳輸蹬耘,單面連接傳輸要關(guān)閉芝雪。發(fā)送完后,客戶端進(jìn)入FIN_WAIT_1狀態(tài)综苔。

第二次揮手:服務(wù)端收到請(qǐng)求包后惩系,發(fā)回ACK=1,ack=x+1的確認(rèn)包钦奋,表示確認(rèn)斷開(kāi)連接赃春。服務(wù)端進(jìn)入CLOSE_WAIT狀態(tài)。客戶端收到該包后睬隶,進(jìn)入FIN_WAIT_2狀態(tài)。此時(shí)客戶端到服務(wù)端的數(shù)據(jù)連接已斷開(kāi)拦焚。

第三次揮手:服務(wù)端發(fā)送FIN=1,seq=y的包給客戶端亿昏,表示自己沒(méi)有數(shù)據(jù)要給客戶端了。發(fā)送完后進(jìn)入LAST_ACK狀態(tài)芥颈,等待客戶端的確認(rèn)包惠勒。

第四次揮手:客戶端收到請(qǐng)求包后,發(fā)送ACK=1,ack=y+1的確認(rèn)包給服務(wù)端爬坑,并進(jìn)入TIME_WAIT狀態(tài)捉撮,有可能要重傳確認(rèn)包。服務(wù)端收到確認(rèn)包后妇垢,進(jìn)入CLOSED狀態(tài)巾遭,服務(wù)端到客戶端的連接已斷開(kāi)〈彻溃客戶端等到一段時(shí)間后也會(huì)進(jìn)入CLOSED狀態(tài)灼舍。

四次揮手原因
由于TCP的連接是全雙工,雙方都可以主動(dòng)傳輸數(shù)據(jù)涨薪,一方的斷開(kāi)需要告知對(duì)方骑素,讓對(duì)方可以相關(guān)操作,負(fù)責(zé)任的表現(xiàn)刚夺。

使用TCP協(xié)議有:FTP(文件傳輸協(xié)議)献丑、Telnet(遠(yuǎn)程登錄協(xié)議)、SMTP(簡(jiǎn)單郵件傳輸協(xié)議)侠姑、POP3(和SMTP相對(duì)创橄,用于接收郵件)、HTTP協(xié)議等

4莽红、TCP流量控制

滑動(dòng)窗口協(xié)議

TCP滑動(dòng)窗口協(xié)議主要為了解決數(shù)據(jù)在網(wǎng)絡(luò)傳輸?shù)倪^(guò)程中妥畏,發(fā)送方和接收方速率不一致的問(wèn)題,從而保證數(shù)據(jù)傳輸?shù)目煽啃园灿酰_(dá)到流量控制的效果醉蚁。
發(fā)送方中的數(shù)據(jù)分為三種:

  • 發(fā)送已確認(rèn)
  • 發(fā)送未確認(rèn)
  • 未發(fā)送

接收方數(shù)據(jù)分為三種:

  • 已接收和確認(rèn)但未被上層讀取
  • 接收未確認(rèn)

在發(fā)送方的滑動(dòng)窗口中,可分為發(fā)送窗口和可用窗口鬼店。發(fā)送窗口中的數(shù)據(jù)已發(fā)送接收方网棍,但未接到接收方的確認(rèn);可用窗口則表示發(fā)送方還可以發(fā)送多少數(shù)據(jù)妇智。發(fā)送方的窗口大小會(huì)受到接收方窗口的改變而改變滥玷。

image

利用滑動(dòng)窗口機(jī)制能有效的控制發(fā)送方的發(fā)送數(shù)據(jù)速率捌锭。下面是個(gè)栗子:


image

TCP的窗口單位是字節(jié),不是報(bào)文端罗捎,所以上文假設(shè)一個(gè)報(bào)文包含100個(gè)字節(jié)观谦。ACK是確認(rèn)位,ack是確認(rèn)號(hào)桨菜,seq是序列號(hào)豁状,對(duì)應(yīng)報(bào)文的數(shù)據(jù)格式的。A和B在TCP三次握手時(shí)候倒得,B會(huì)告訴A自己的接收窗口rwnd大小泻红。上圖中,A向B先發(fā)送了三次數(shù)據(jù)霞掺,但第三次丟失了谊路,同時(shí)受到B的流量控制,當(dāng)前ack=201,還需允許繼續(xù)發(fā)送序號(hào)為201到500共300個(gè)字節(jié)菩彬。當(dāng)A發(fā)送到序號(hào)為500時(shí)缠劝,就不能發(fā)新的數(shù)據(jù)了,但能接收第三次丟失的數(shù)據(jù)骗灶。

接收方數(shù)據(jù)被上層讀取后惨恭,又可以接收序號(hào)為501-600共100個(gè)字節(jié),所以通知A,接收窗口大小為100耙旦,序號(hào)為501開(kāi)頭....在上圖的整個(gè)過(guò)程中脱羡,A共收到B三次流量控制。

TCP報(bào)文段發(fā)送的機(jī)制

應(yīng)用層把數(shù)據(jù)傳遞給傳輸層的TCP的發(fā)送緩存后免都,TCP通過(guò)不同的機(jī)制來(lái)控制報(bào)文段的發(fā)送時(shí)機(jī)锉罐。
主要有下面三種機(jī)制:

  • TCP維護(hù)一個(gè)變量,等于最大報(bào)文段長(zhǎng)度MSS,緩存中存放的數(shù)據(jù)達(dá)到MSS字節(jié)時(shí)绕娘,則以一個(gè)報(bào)文段發(fā)送出去脓规。
  • 發(fā)送應(yīng)用層指明要求的報(bào)文段,即TCP支持的推送操作业舍。
  • 發(fā)送法計(jì)時(shí)器期限到了抖拦,就要把前面緩存的數(shù)據(jù)以報(bào)文段發(fā)送出去,前提是長(zhǎng)度不能超過(guò)MSS舷暮。

TCP傳輸效率問(wèn)題

不同的發(fā)送機(jī)制都會(huì)帶來(lái)一定的效率問(wèn)題,例如用戶發(fā)送一個(gè)字符噩茄,加上20字節(jié)首部下面,得到21字節(jié)長(zhǎng)的TCP報(bào)文段,再加上21字節(jié)的IP首部绩聘,就變成41字節(jié)長(zhǎng)的IP數(shù)據(jù)報(bào)沥割。發(fā)送一個(gè)字節(jié)耗啦,線路上就需要發(fā)送41字節(jié)長(zhǎng)的IP數(shù)據(jù)報(bào),若等待接收方確認(rèn)机杜,線程就又多了40字節(jié)長(zhǎng)的數(shù)據(jù)報(bào)帜讲。所以在線程帶寬不富裕時(shí),這種傳輸效率非常不高椒拗。因此應(yīng)當(dāng)推遲發(fā)回確認(rèn)報(bào)文似将,并盡量使用捎帶確認(rèn)的方法。

Negle算法

Negle算法主要為了解決TCP的傳輸效率問(wèn)題蚀苛。Negle算法規(guī)定:若要把發(fā)送的數(shù)據(jù)逐個(gè)字節(jié)緩存起來(lái)在验,則發(fā)送方需要把第一個(gè)字節(jié)發(fā)送出去,然后緩存后面的字節(jié)堵未,在收到接收方第一個(gè)字節(jié)的確認(rèn)腋舌,再將現(xiàn)有緩存中所有字節(jié)組成一個(gè)報(bào)文段發(fā)送出去,繼續(xù)緩存后續(xù)數(shù)據(jù)渗蟹。只有在收到前一個(gè)報(bào)文的確認(rèn)之后發(fā)送后面的數(shù)據(jù)块饺。這是為了減少所用帶寬。當(dāng)發(fā)送數(shù)據(jù)到達(dá)TCP發(fā)送窗口的一半或已達(dá)到報(bào)文段的最大長(zhǎng)度也會(huì)立即發(fā)送報(bào)文段雌芽,而不是等待接收方確認(rèn)刨沦。這是為了提高網(wǎng)絡(luò)吞吐量。

糊涂窗口綜合征

TCP接收方的緩存已滿膘怕,若上層一次從緩存中讀取一個(gè)字節(jié)想诅,這樣接收方就可以繼續(xù)接納一個(gè)字節(jié)的窗口,然后向發(fā)送方發(fā)送確認(rèn)岛心,把窗口設(shè)為1個(gè)字節(jié)(上文所講来破,IP數(shù)據(jù)報(bào)為41字節(jié)長(zhǎng))。如果這樣持續(xù)下去忘古,那么網(wǎng)絡(luò)效率非常低徘禁。

所以有效的解決方法,就是讓接收方等待一定時(shí)間髓堪,讓緩存空間能夠接納一個(gè)最長(zhǎng)的報(bào)文段送朱,或者等待接收緩存已有一半的空閑空間,再發(fā)出確認(rèn)報(bào)文和通知當(dāng)前窗口大小干旁。

5驶沼、TCP的擁塞控制

擁塞

什么是擁塞呢,在某段時(shí)間争群,若對(duì)網(wǎng)絡(luò)中某一資源的需求超過(guò)了該資源所能提供的可用部分回怜,網(wǎng)絡(luò)性能就會(huì)變壞了,這種情況就叫擁塞换薄。網(wǎng)絡(luò)資源常指網(wǎng)絡(luò)鏈路容量(帶寬)玉雾、交換結(jié)點(diǎn)中的緩存和交換處理機(jī)翔试。

當(dāng)出現(xiàn)擁塞,條件允許一般都是通過(guò)添加網(wǎng)絡(luò)資源复旬,例如帶寬換成更大的垦缅,但這治標(biāo)不治本,而且不一定總是有用驹碍。網(wǎng)絡(luò)擁塞往往是有許多因素引起的壁涎,因此就需要擁塞控制了。

擁塞控制

擁塞控制指防止過(guò)多的的數(shù)據(jù)注入到網(wǎng)絡(luò)中幸冻,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不過(guò)載粹庞。擁塞機(jī)制是一個(gè)全局性的過(guò)程,涉及到所有主機(jī)洽损、所有路由器庞溜,以及與降低網(wǎng)絡(luò)傳輸性能有光的所有因素。

而滑動(dòng)窗口協(xié)議的流量控制碑定,是指點(diǎn)到點(diǎn)的通信量控制流码,是端到端的問(wèn)題。

TCP的擁塞控制方法

TCP進(jìn)行擁塞控制的算法有四種:慢開(kāi)始延刘、擁塞避免漫试、快重傳、快恢復(fù)碘赖。

擁塞控制是基于擁塞窗口的驾荣,發(fā)送方維持一個(gè)擁塞窗口 cwnd的狀態(tài)變量。窗口大小取決網(wǎng)絡(luò)的擁塞程度普泡,并且動(dòng)態(tài)變化播掷,發(fā)送方會(huì)讓自己的發(fā)送窗口等于擁塞窗口。判斷網(wǎng)絡(luò)擁塞的依據(jù)就是發(fā)送方接收接收方的確認(rèn)報(bào)文是否超時(shí)撼班。

1歧匈、慢開(kāi)始算法

慢開(kāi)始指主機(jī)由小到大逐漸增大發(fā)送窗口,即增大擁塞窗口的數(shù)值砰嘁。初始擁塞窗口cwnd設(shè)置為不超過(guò)2到4個(gè)最大報(bào)文段SMSS的數(shù)值件炉,具體規(guī)定:

  • 若SMSS≤1095字節(jié),cwnd=4 x SMSS字節(jié)矮湘,不得超過(guò)4個(gè)報(bào)文段斟冕。
  • 若SMSS>1095且≤2190字節(jié),cwnd=3 X SMSS字節(jié)板祝,不得超過(guò)3個(gè)報(bào)文段宫静。
  • 若SMSS>2190字節(jié),則 cwnd=2 x SMSS字節(jié)券时,不得超過(guò)2個(gè)報(bào)文段孤里。

從上面的規(guī)定限制了初始擁塞窗口的大小。

慢開(kāi)始在每收到一個(gè)對(duì)新的報(bào)文段的確認(rèn)后橘洞,cwnd就可以增加最多一個(gè)SMSS的數(shù)值捌袜。

image

N是剛收到確認(rèn)的報(bào)文段所確認(rèn)的字節(jié)數(shù),當(dāng)N<SMSS時(shí)炸枣,擁塞窗口每次的增加量要小于SMSS虏等。下文舉例說(shuō)明慢開(kāi)始的原理(實(shí)際上,TCP的窗口是以字節(jié)大小為單位适肠,下文為了方便以報(bào)文端形容):

image

從圖可知霍衫,初始化窗口未1,所有發(fā)送M1報(bào)文段侯养,收到確認(rèn)號(hào)之后敦跌,發(fā)送M2-M3兩個(gè)報(bào)文段,因?yàn)閾砣翱谠龃罅斯淇竺娴妮喆我彩沁@樣翻倍增加的柠傍。隨著輪次的增多,那么發(fā)送到網(wǎng)絡(luò)的數(shù)據(jù)就會(huì)急劇增加辩稽,容易出現(xiàn)擁塞惧笛,因此需要慢開(kāi)始門限(ssthresh)狀態(tài)變量。

  • 當(dāng)cwnd<ssthresh時(shí)逞泄,使用慢開(kāi)始算法
  • 當(dāng)cwnd>ssthresh時(shí)患整,使用擁塞避免算法
  • 當(dāng)cwnd=ssthresh時(shí),忙開(kāi)始或者擁塞避免算法
2喷众、擁塞避免算法

擁塞避免算法就是讓cwnd緩慢增大各谚,每一個(gè)輪次把擁cwnd增加1,而不是像慢開(kāi)始算法那樣翻倍增加侮腹。需要注意的是嘲碧,擁塞避免算法只是讓網(wǎng)絡(luò)不那么快出現(xiàn)擁塞,而不是避免擁塞出現(xiàn)父阻。

上文已經(jīng)說(shuō)到愈涩,判斷網(wǎng)絡(luò)是否擁塞以報(bào)文是否超時(shí)為準(zhǔn),當(dāng)網(wǎng)絡(luò)出現(xiàn)擁塞時(shí)加矛,會(huì)把ssthresh設(shè)為原有的一半履婉,然后開(kāi)始慢開(kāi)始算法。如下圖所示:

image

在上黑色園圈4點(diǎn)的時(shí)候斟览,發(fā)送方收到對(duì)同一個(gè)報(bào)文端重復(fù)確認(rèn)(3-ACK)毁腿。這種情況,個(gè)別報(bào)文端會(huì)在網(wǎng)絡(luò)中丟失,但實(shí)際上未發(fā)生網(wǎng)絡(luò)擁塞已烤,發(fā)送方未及時(shí)收到確認(rèn)鸠窗,就會(huì)產(chǎn)生超時(shí),誤認(rèn)為出現(xiàn)擁塞胯究,發(fā)送方會(huì)重新開(kāi)始慢開(kāi)始算法稍计。減低了傳輸效率。因此裕循,就需要快重傳算法了臣嚣。

3、 快重傳算法

快重傳算法是讓發(fā)送方今早知道發(fā)生了個(gè)別報(bào)文段的丟失剥哑」柙颍快重傳算法要求接收方不要等待自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn),而是立即發(fā)送確認(rèn)株婴。也就是說(shuō)怎虫,但出現(xiàn)丟包情況,接收方在接收新數(shù)據(jù)時(shí)會(huì)重復(fù)發(fā)送對(duì)丟失包的前一個(gè)報(bào)文段的確認(rèn)號(hào)督暂。發(fā)送方接收到三次確認(rèn)號(hào)后揪垄,就判斷該丟失報(bào)文段確實(shí)丟失,會(huì)立即進(jìn)行重傳(快重傳)逻翁。

image
4饥努、快恢復(fù)算法

在上文,知道只是報(bào)文段丟失八回,而不是網(wǎng)絡(luò)出現(xiàn)擁塞后酷愧,發(fā)送方會(huì)調(diào)整ssthresh為原來(lái)的一半,然后繼續(xù)進(jìn)行擁塞避免算法缠诅,這個(gè)過(guò)程就叫快開(kāi)恢復(fù)算法溶浴。

5、小結(jié)

可見(jiàn)管引,TCP擁塞控制四個(gè)算法是相輔相成士败,少了誰(shuí)都不行,共同維護(hù)這擁塞控制機(jī)制褥伴。下面是總體的流程圖谅将。

image

從流量控制和擁塞控制整體看,涉及到三個(gè)窗口重慢,接收窗口饥臂、發(fā)送窗口、擁塞窗口似踱。發(fā)送窗口的數(shù)值是不能大于接收窗口的隅熙,但是擁塞窗口由網(wǎng)絡(luò)的擁塞程度決定的(所以上文的發(fā)送窗口等于擁塞窗口稽煤,是假設(shè)在接收窗口數(shù)值足夠大,能夠容納擁塞窗口的數(shù)據(jù))囚戚。因此酵熙,發(fā)送窗口的上限值應(yīng)該是擁塞窗口cwnd和接收窗口rwnd之間的最小值。也就是說(shuō)弯淘,通過(guò)流量控制和擁塞控制绿店,發(fā)送的發(fā)送速率取決于cwnd和rwnd中數(shù)值較小的一個(gè)吉懊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庐橙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子借嗽,更是在濱河造成了極大的恐慌态鳖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恶导,死亡現(xiàn)場(chǎng)離奇詭異浆竭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)惨寿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門邦泄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人裂垦,你說(shuō)我怎么就攤上這事顺囊。” “怎么了蕉拢?”我有些...
    開(kāi)封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵特碳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我晕换,道長(zhǎng)午乓,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任闸准,我火速辦了婚禮益愈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夷家。我一直安慰自己蒸其,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布瘾英。 她就那樣靜靜地躺著枣接,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缺谴。 梳的紋絲不亂的頭發(fā)上但惶,一...
    開(kāi)封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天耳鸯,我揣著相機(jī)與錄音,去河邊找鬼膀曾。 笑死县爬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的添谊。 我是一名探鬼主播财喳,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斩狱!你這毒婦竟也來(lái)了耳高?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤所踊,失蹤者是張志新(化名)和其女友劉穎泌枪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秕岛,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碌燕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了继薛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片修壕。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遏考,靈堂內(nèi)的尸體忽然破棺而出慈鸠,到底是詐尸還是另有隱情,我是刑警寧澤诈皿,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布林束,位于F島的核電站,受9級(jí)特大地震影響稽亏,放射性物質(zhì)發(fā)生泄漏壶冒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一截歉、第九天 我趴在偏房一處隱蔽的房頂上張望胖腾。 院中可真熱鬧,春花似錦瘪松、人聲如沸咸作。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)记罚。三九已至,卻和暖如春壳嚎,著一層夾襖步出監(jiān)牢的瞬間桐智,已是汗流浹背末早。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留说庭,地道東北人然磷。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刊驴,于是被迫代替她去往敵國(guó)和親姿搜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容