關(guān)于 TCP/IP,必知必會(huì)的十個(gè)問(wèn)題原杂!

本文整理了一些TCP/IP協(xié)議簇中需要必知必會(huì)的十大問(wèn)題印颤,既是面試高頻問(wèn)題,又是程序員必備基礎(chǔ)素養(yǎng)污尉。

圖片
image.gif

?

一膀哲、TCP/IP模型

TCP/IP協(xié)議模型(Transmission Control Protocol/Internet Protocol),包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)的網(wǎng)絡(luò)協(xié)議被碗,是Internet的核心協(xié)議某宪。

基于TCP/IP的參考模型將協(xié)議分成四個(gè)層次,它們分別是鏈路層锐朴、網(wǎng)絡(luò)層兴喂、傳輸層和應(yīng)用層。下圖表示TCP/IP模型與OSI模型各層的對(duì)照關(guān)系焚志。

圖片
image.gif

?

TCP/IP協(xié)議族按照層次由上到下衣迷,層層包裝。最上面的是應(yīng)用層酱酬,這里面有http壶谒,ftp,等等我們熟悉的協(xié)議。而第二層則是傳輸層膳沽,著名的TCP和UDP協(xié)議就在這個(gè)層次汗菜。第三層是網(wǎng)絡(luò)層,IP協(xié)議就在這里挑社,它負(fù)責(zé)對(duì)數(shù)據(jù)加上IP地址和其他的數(shù)據(jù)以確定傳輸?shù)哪繕?biāo)陨界。第四層是數(shù)據(jù)鏈路層,這個(gè)層次為待傳送的數(shù)據(jù)加入一個(gè)以太網(wǎng)協(xié)議頭痛阻,并進(jìn)行CRC編碼菌瘪,為最后的數(shù)據(jù)傳輸做準(zhǔn)備。

圖片
image.gif

?

上圖清楚地表示了TCP/IP協(xié)議中每個(gè)層的作用阱当,而TCP/IP協(xié)議通信的過(guò)程其實(shí)就對(duì)應(yīng)著數(shù)據(jù)入棧與出棧的過(guò)程俏扩。入棧的過(guò)程,數(shù)據(jù)發(fā)送方每層不斷地封裝首部與尾部弊添,添加一些傳輸?shù)男畔⒍_保能傳輸?shù)侥康牡亍3鰲5倪^(guò)程表箭,數(shù)據(jù)接收方每層不斷地拆除首部與尾部,得到最終傳輸?shù)臄?shù)據(jù)。

圖片
image.gif

?

上圖以HTTP協(xié)議為例免钻,具體說(shuō)明彼水。關(guān) 注公號(hào)Java技術(shù)棧,回 復(fù):面試极舔,可以獲取 Java 系列面試題凤覆,帶全部答案。

二拆魏、數(shù)據(jù)鏈路層

物理層負(fù)責(zé)0盯桦、1比特流與物理設(shè)備電壓高低、光的閃滅之間的互換渤刃。數(shù)據(jù)鏈路層負(fù)責(zé)將0拥峦、1序列劃分為數(shù)據(jù)幀從一個(gè)節(jié)點(diǎn)傳輸?shù)脚R近的另一個(gè)節(jié)點(diǎn),這些節(jié)點(diǎn)是通過(guò)MAC來(lái)唯一標(biāo)識(shí)的(MAC,物理地址,一個(gè)主機(jī)會(huì)有一個(gè)MAC地址)卖子。

圖片
image.gif

?

  • 封裝成幀: 把網(wǎng)絡(luò)層數(shù)據(jù)報(bào)加頭和尾略号,封裝成幀,幀頭中包括源MAC地址和目的MAC地址。

  • 透明傳輸:零比特填充洋闽、轉(zhuǎn)義字符玄柠。

  • 可靠傳輸: 在出錯(cuò)率很低的鏈路上很少用,但是無(wú)線鏈路WLAN會(huì)保證可靠傳輸诫舅。

  • 差錯(cuò)檢測(cè)(CRC):接收者檢測(cè)錯(cuò)誤,如果發(fā)現(xiàn)差錯(cuò)羽利,丟棄該幀。

三刊懈、網(wǎng)絡(luò)層

1.IP協(xié)議

IP協(xié)議是TCP/IP協(xié)議的核心这弧,所有的TCP,UDP俏讹,IMCP当宴,IGMP的數(shù)據(jù)都以IP數(shù)據(jù)格式傳輸。要注意的是泽疆,IP不是可靠的協(xié)議户矢,這是說(shuō),IP協(xié)議沒(méi)有提供一種數(shù)據(jù)未傳達(dá)以后的處理機(jī)制殉疼,這被認(rèn)為是上層協(xié)議:TCP或UDP要做的事情梯浪。

1.1 IP地址

在數(shù)據(jù)鏈路層中我們一般通過(guò)MAC地址來(lái)識(shí)別不同的節(jié)點(diǎn),而在IP層我們也要有一個(gè)類似的地址標(biāo)識(shí)瓢娜,這就是IP地址挂洛。

32位IP地址分為網(wǎng)絡(luò)位和地址位,這樣做可以減少路由器中路由表記錄的數(shù)目眠砾,有了網(wǎng)絡(luò)地址虏劲,就可以限定擁有相同網(wǎng)絡(luò)地址的終端都在同一個(gè)范圍內(nèi),那么路由表只需要維護(hù)一條這個(gè)網(wǎng)絡(luò)地址的方向,就可以找到相應(yīng)的這些終端了柒巫。

A類IP地址: 0.0.0.0~127.0.0.0 B類IP地址:128.0.0.1~191.255.0.0 C類IP地址:192.168.0.0~239.255.255.0

1.2 IP協(xié)議頭

圖片
image.gif

?

這里只介紹:八位的TTL字段励堡。這個(gè)字段規(guī)定該數(shù)據(jù)包在穿過(guò)多少個(gè)路由之后才會(huì)被拋棄。某個(gè)IP數(shù)據(jù)包每穿過(guò)一個(gè)路由器堡掏,該數(shù)據(jù)包的TTL數(shù)值就會(huì)減少1应结,當(dāng)該數(shù)據(jù)包的TTL成為零,它就會(huì)被自動(dòng)拋棄泉唁。這個(gè)字段的最大值也就是255鹅龄,也就是說(shuō)一個(gè)協(xié)議包也就在路由器里面穿行255次就會(huì)被拋棄了,根據(jù)系統(tǒng)的不同亭畜,這個(gè)數(shù)字也不一樣扮休,一般是32或者是64。

2.ARP及RARP協(xié)議

ARP 是根據(jù)IP地址獲取MAC地址的一種協(xié)議贱案。

ARP(地址解析)協(xié)議是一種解析協(xié)議肛炮,本來(lái)主機(jī)是完全不知道這個(gè)IP對(duì)應(yīng)的是哪個(gè)主機(jī)的哪個(gè)接口,當(dāng)主機(jī)要發(fā)送一個(gè)IP包的時(shí)候宝踪,會(huì)首先查一下自己的ARP高速緩存(就是一個(gè)IP-MAC地址對(duì)應(yīng)表緩存)侨糟。

如果查詢的IP-MAC值對(duì)不存在,那么主機(jī)就向網(wǎng)絡(luò)發(fā)送一個(gè)ARP協(xié)議廣播包瘩燥,這個(gè)廣播包里面就有待查詢的IP地址秕重,而直接收到這份廣播的包的所有主機(jī)都會(huì)查詢自己的IP地址,如果收到廣播包的某一個(gè)主機(jī)發(fā)現(xiàn)自己符合條件厉膀,那么就準(zhǔn)備好一個(gè)包含自己的MAC地址的ARP包傳送給發(fā)送ARP廣播的主機(jī)溶耘。

而廣播主機(jī)拿到ARP包后會(huì)更新自己的ARP緩存(就是存放IP-MAC對(duì)應(yīng)表的地方)。發(fā)送廣播的主機(jī)就會(huì)用新的ARP緩存數(shù)據(jù)準(zhǔn)備好數(shù)據(jù)鏈路層的的數(shù)據(jù)包發(fā)送工作服鹅。

RARP協(xié)議的工作與此相反凳兵,不做贅述。

3. ICMP協(xié)議

IP協(xié)議并不是一個(gè)可靠的協(xié)議企软,它不保證數(shù)據(jù)被送達(dá)庐扫,那么,自然的仗哨,保證數(shù)據(jù)送達(dá)的工作應(yīng)該由其他的模塊來(lái)完成形庭。其中一個(gè)重要的模塊就是ICMP(網(wǎng)絡(luò)控制報(bào)文)協(xié)議。ICMP不是高層協(xié)議厌漂,而是IP層的協(xié)議萨醒。

當(dāng)傳送IP數(shù)據(jù)包發(fā)生錯(cuò)誤。比如主機(jī)不可達(dá)苇倡,路由不可達(dá)等等富纸,ICMP協(xié)議將會(huì)把錯(cuò)誤信息封包囤踩,然后傳送回給主機(jī)。給主機(jī)一個(gè)處理錯(cuò)誤的機(jī)會(huì)晓褪,這 也就是為什么說(shuō)建立在IP層以上的協(xié)議是可能做到安全的原因高职。

四、ping

ping可以說(shuō)是ICMP的最著名的應(yīng)用辞州,是TCP/IP協(xié)議的一部分。利用“ping”命令可以檢查網(wǎng)絡(luò)是否連通寥粹,可以很好地幫助我們分析和判定網(wǎng)絡(luò)故障变过。

例如:當(dāng)我們某一個(gè)網(wǎng)站上不去的時(shí)候。通常會(huì)ping一下這個(gè)網(wǎng)站涝涤。ping會(huì)回顯出一些有用的信息媚狰。一般的信息如下:

圖片
image.gif

?

ping這個(gè)單詞源自聲納定位,而這個(gè)程序的作用也確實(shí)如此阔拳,它利用ICMP協(xié)議包來(lái)偵測(cè)另一個(gè)主機(jī)是否可達(dá)崭孤。原理是用類型碼為0的ICMP發(fā)請(qǐng) 求,受到請(qǐng)求的主機(jī)則用類型碼為8的ICMP回應(yīng)糊肠。

ping程序來(lái)計(jì)算間隔時(shí)間辨宠,并計(jì)算有多少個(gè)包被送達(dá)。用戶就可以判斷網(wǎng)絡(luò)大致的情況货裹。我們可以看到嗤形, ping給出來(lái)了傳送的時(shí)間和TTL的數(shù)據(jù)。

五弧圆、Traceroute

Traceroute是用來(lái)偵測(cè)主機(jī)到目的主機(jī)之間所經(jīng)路由情況的重要工具赋兵,也是最便利的工具。

Traceroute的原理是非常非常的有意思搔预,它收到到目的主機(jī)的IP后霹期,首先給目的主機(jī)發(fā)送一個(gè)TTL=1的UDP數(shù)據(jù)包,而經(jīng)過(guò)的第一個(gè)路由器收到這個(gè)數(shù)據(jù)包以后拯田,就自動(dòng)把TTL減1历造,而TTL變?yōu)?以后,路由器就把這個(gè)包給拋棄了勿锅,并同時(shí)產(chǎn)生 一個(gè)主機(jī)不可達(dá)的ICMP數(shù)據(jù)報(bào)給主機(jī)帕膜。主機(jī)收到這個(gè)數(shù)據(jù)報(bào)以后再發(fā)一個(gè)TTL=2的UDP數(shù)據(jù)報(bào)給目的主機(jī),然后刺激第二個(gè)路由器給主機(jī)發(fā)ICMP數(shù)據(jù) 報(bào)溢十。如此往復(fù)直到到達(dá)目的主機(jī)垮刹。這樣,traceroute就拿到了所有的路由器IP张弛。

圖片
image.gif

?

六荒典、TCP/UDP

TCP/UDP都是是傳輸層協(xié)議酪劫,但是兩者具有不同的特性,同時(shí)也具有不同的應(yīng)用場(chǎng)景寺董,下面以圖表的形式對(duì)比分析覆糟。

圖片
image.gif

?

面向報(bào)文

面向報(bào)文的傳輸方式是應(yīng)用層交給UDP多長(zhǎng)的報(bào)文,UDP就照樣發(fā)送遮咖,即一次發(fā)送一個(gè)報(bào)文滩字。因此,應(yīng)用程序必須選擇合適大小的報(bào)文御吞。若報(bào)文太長(zhǎng)麦箍,則IP層需要分片,降低效率陶珠。若太短挟裂,會(huì)是IP太小。

面向字節(jié)流

面向字節(jié)流的話揍诽,雖然應(yīng)用程序和TCP的交互是一次一個(gè)數(shù)據(jù)塊(大小不等)诀蓉,但TCP把應(yīng)用程序看成是一連串的無(wú)結(jié)構(gòu)的字節(jié)流。TCP有一個(gè)緩沖暑脆,當(dāng)應(yīng)用程序傳送的數(shù)據(jù)塊太長(zhǎng)渠啤,TCP就可以把它劃分短一些再傳送。

關(guān)于擁塞控制饵筑,流量控制埃篓,是TCP的重點(diǎn),后面講解根资。

TCP和UDP協(xié)議的一些應(yīng)用

圖片
image.gif

?

什么時(shí)候應(yīng)該使用TCP架专?

當(dāng)對(duì)網(wǎng)絡(luò)通訊質(zhì)量有要求的時(shí)候,比如:整個(gè)數(shù)據(jù)要準(zhǔn)確無(wú)誤的傳遞給對(duì)方玄帕,這往往用于一些要求可靠的應(yīng)用部脚,比如HTTP、HTTPS裤纹、FTP等傳輸文件的協(xié)議委刘,POP、SMTP等郵件傳輸?shù)膮f(xié)議鹰椒。

什么時(shí)候應(yīng)該使用UDP锡移?

當(dāng)對(duì)網(wǎng)絡(luò)通訊質(zhì)量要求不高的時(shí)候,要求網(wǎng)絡(luò)通訊速度能盡量的快漆际,這時(shí)就可以使用UDP淆珊。

七、DNS

DNS(Domain Name System奸汇,域名系統(tǒng))施符,因特網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù)往声,能夠使用戶更方便的訪問(wèn)互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串戳吝。通過(guò)主機(jī)名浩销,最終得到該主機(jī)名對(duì)應(yīng)的IP地址的過(guò)程叫做域名解析(或主機(jī)名解析)。DNS協(xié)議運(yùn)行在UDP協(xié)議之上听哭,使用端口號(hào)53慢洋。

八、TCP連接的建立與終止

1.三次握手

TCP是面向連接的陆盘,無(wú)論哪一方向另一方發(fā)送數(shù)據(jù)之前且警,都必須先在雙方之間建立一條連接。在TCP/IP協(xié)議中礁遣,TCP協(xié)議提供可靠的連接服務(wù),連接是通過(guò)三次握手進(jìn)行初始化的肩刃。三次握手的目的是同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換 TCP窗口大小信息祟霍。

圖片
image.gif

?

第一次握手: 建立連接∮客戶端發(fā)送連接請(qǐng)求報(bào)文段沸呐,將SYN位置為1,Sequence Number為x呢燥;然后崭添,客戶端進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器的確認(rèn)叛氨;

第二次握手: 服務(wù)器收到SYN報(bào)文段呼渣。服務(wù)器收到客戶端的SYN報(bào)文段,需要對(duì)這個(gè)SYN報(bào)文段進(jìn)行確認(rèn)寞埠,設(shè)置Acknowledgment Number為x+1(Sequence Number+1)屁置;同時(shí),自己自己還要發(fā)送SYN請(qǐng)求信息仁连,將SYN位置為1蓝角,Sequence Number為y;服務(wù)器端將上述所有信息放到一個(gè)報(bào)文段(即SYN+ACK報(bào)文段)中饭冬,一并發(fā)送給客戶端使鹅,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);

第三次握手: 客戶端收到服務(wù)器的SYN+ACK報(bào)文段昌抠。然后將Acknowledgment Number設(shè)置為y+1患朱,向服務(wù)器發(fā)送ACK報(bào)文段,這個(gè)報(bào)文段發(fā)送完畢以后扰魂,客戶端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài)麦乞,完成TCP三次握手蕴茴。

為什么要三次握手?

為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端姐直,因而產(chǎn)生錯(cuò)誤倦淀。

具體例子:“已失效的連接請(qǐng)求報(bào)文段”的產(chǎn)生在這樣一種情況下:client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒(méi)有丟失,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間的滯留了声畏,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server撞叽。本來(lái)這是一個(gè)早已失效的報(bào)文段。但server收到此失效的連接請(qǐng)求報(bào)文段后插龄,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接請(qǐng)求愿棋。于是就向client發(fā)出確認(rèn)報(bào)文段,同意建立連接均牢。假設(shè)不采用“三次握手”糠雨,那么只要server發(fā)出確認(rèn),新的連接就建立了徘跪。由于現(xiàn)在client并沒(méi)有發(fā)出建立連接的請(qǐng)求甘邀,因此不會(huì)理睬server的確認(rèn),也不會(huì)向server發(fā)送數(shù)據(jù)垮庐。但server卻以為新的運(yùn)輸連接已經(jīng)建立松邪,并一直等待client發(fā)來(lái)數(shù)據(jù)。這樣哨查,server的很多資源就白白浪費(fèi)掉了逗抑。采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生。例如剛才那種情況寒亥,client不會(huì)向server的確認(rèn)發(fā)出確認(rèn)邮府。server由于收不到確認(rèn),就知道client并沒(méi)有要求建立連接溉奕⌒矗”

2.四次揮手

當(dāng)客戶端和服務(wù)器通過(guò)三次握手建立了TCP連接以后,當(dāng)數(shù)據(jù)傳送完畢腐宋,肯定是要斷開(kāi)TCP連接的啊紊服。那對(duì)于TCP的斷開(kāi)連接,這里就有了神秘的“四次分手”胸竞。

image.gif
?

第一次分手: 主機(jī)1(可以使客戶端欺嗤,也可以是服務(wù)器端),設(shè)置Sequence Number卫枝,向主機(jī)2發(fā)送一個(gè)FIN報(bào)文段煎饼;此時(shí),主機(jī)1進(jìn)入FIN_WAIT_1狀態(tài)校赤;這表示主機(jī)1沒(méi)有數(shù)據(jù)要發(fā)送給主機(jī)2了吆玖;

第二次分手: 主機(jī)2收到了主機(jī)1發(fā)送的FIN報(bào)文段筒溃,向主機(jī)1回一個(gè)ACK報(bào)文段,Acknowledgment Number為Sequence Number加1沾乘;主機(jī)1進(jìn)入FIN_WAIT_2狀態(tài)怜奖;主機(jī)2告訴主機(jī)1,我“同意”你的關(guān)閉請(qǐng)求翅阵;

第三次分手: 主機(jī)2向主機(jī)1發(fā)送FIN報(bào)文段歪玲,請(qǐng)求關(guān)閉連接,同時(shí)主機(jī)2進(jìn)入LAST_ACK狀態(tài)掷匠;

第四次分手: 主機(jī)1收到主機(jī)2發(fā)送的FIN報(bào)文段滥崩,向主機(jī)2發(fā)送ACK報(bào)文段,然后主機(jī)1進(jìn)入TIME_WAIT狀態(tài)讹语;主機(jī)2收到主機(jī)1的ACK報(bào)文段以后钙皮,就關(guān)閉連接;此時(shí)顽决,主機(jī)1等待2MSL后依然沒(méi)有收到回復(fù)株灸,則證明Server端已正常關(guān)閉,那好擎值,主機(jī)1也可以關(guān)閉連接了。

為什么要四次分手逐抑?

TCP協(xié)議是一種面向連接的鸠儿、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議厕氨。TCP是全雙工模式进每,這就意味著,當(dāng)主機(jī)1發(fā)出FIN報(bào)文段時(shí)命斧,只是表示主機(jī)1已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了田晚,主機(jī)1告訴主機(jī)2,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了国葬;但是贤徒,這個(gè)時(shí)候主機(jī)1還是可以接受來(lái)自主機(jī)2的數(shù)據(jù);當(dāng)主機(jī)2返回ACK報(bào)文段時(shí)汇四,表示它已經(jīng)知道主機(jī)1沒(méi)有數(shù)據(jù)發(fā)送了接奈,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的;當(dāng)主機(jī)2也發(fā)送了FIN報(bào)文段時(shí)通孽,這個(gè)時(shí)候就表示主機(jī)2也沒(méi)有數(shù)據(jù)要發(fā)送了序宦,就會(huì)告訴主機(jī)1,我也沒(méi)有數(shù)據(jù)要發(fā)送了背苦,之后彼此就會(huì)愉快的中斷這次TCP連接互捌。

為什么要等待2MSL潘明?

MSL:報(bào)文段最大生存時(shí)間,它是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長(zhǎng)時(shí)間秕噪。原因有二:

  • 保證TCP協(xié)議的全雙工連接能夠可靠關(guān)閉

  • 保證這次連接的重復(fù)數(shù)據(jù)段從網(wǎng)絡(luò)中消失

第一點(diǎn):如果主機(jī)1直接CLOSED了钳降,那么由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡(luò)原因,導(dǎo)致主機(jī)2沒(méi)有收到主機(jī)1最后回復(fù)的ACK巢价。那么主機(jī)2就會(huì)在超時(shí)之后繼續(xù)發(fā)送FIN牲阁,此時(shí)由于主機(jī)1已經(jīng)CLOSED了,就找不到與重發(fā)的FIN對(duì)應(yīng)的連接壤躲。所以城菊,主機(jī)1不是直接進(jìn)入CLOSED,而是要保持TIME_WAIT碉克,當(dāng)再次收到FIN的時(shí)候凌唬,能夠保證對(duì)方收到ACK,最后正確的關(guān)閉連接漏麦。

第二點(diǎn):如果主機(jī)1直接CLOSED客税,然后又再向主機(jī)2發(fā)起一個(gè)新連接,我們不能保證這個(gè)新連接與剛關(guān)閉的連接的端口號(hào)是不同的撕贞。也就是說(shuō)有可能新連接和老連接的端口號(hào)是相同的更耻。一般來(lái)說(shuō)不會(huì)發(fā)生什么問(wèn)題,但是還是有特殊情況出現(xiàn):假設(shè)新連接和已經(jīng)關(guān)閉的老連接端口號(hào)是一樣的捏膨,如果前一次連接的某些數(shù)據(jù)仍然滯留在網(wǎng)絡(luò)中秧均,這些延遲數(shù)據(jù)在建立新連接之后才到達(dá)主機(jī)2,由于新連接和老連接的端口號(hào)是一樣的号涯,TCP協(xié)議就認(rèn)為那個(gè)延遲的數(shù)據(jù)是屬于新連接的目胡,這樣就和真正的新連接的數(shù)據(jù)包發(fā)生混淆了。所以TCP連接還要在TIME_WAIT狀態(tài)等待2倍MSL链快,這樣可以保證本次連接的所有數(shù)據(jù)都從網(wǎng)絡(luò)中消失誉己。

九、TCP流量控制

如果發(fā)送方把數(shù)據(jù)發(fā)送得過(guò)快域蜗,接收方可能會(huì)來(lái)不及接收巨双,這就會(huì)造成數(shù)據(jù)的丟失。所謂流量控制就是讓發(fā)送方的發(fā)送速率不要太快霉祸,要讓接收方來(lái)得及接收炉峰。

利用滑動(dòng)窗口機(jī)制可以很方便地在TCP連接上實(shí)現(xiàn)對(duì)發(fā)送方的流量控制。

設(shè)A向B發(fā)送數(shù)據(jù)脉执。在連接建立時(shí)疼阔,B告訴了A:“我的接收窗口是 rwnd = 400 ”(這里的 rwnd 表示 receiver window) 。因此,發(fā)送方的發(fā)送窗口不能超過(guò)接收方給出的接收窗口的數(shù)值婆廊。請(qǐng)注意迅细,TCP的窗口單位是字節(jié),不是報(bào)文段淘邻。假設(shè)每一個(gè)報(bào)文段為100字節(jié)長(zhǎng)茵典,而數(shù)據(jù)報(bào)文段序號(hào)的初始值設(shè)為1。大寫(xiě)ACK表示首部中的確認(rèn)位ACK宾舅,小寫(xiě)ack表示確認(rèn)字段的值ack统阿。

圖片
image.gif

?

從圖中可以看出,B進(jìn)行了三次流量控制筹我。第一次把窗口減少到 rwnd = 300 扶平,第二次又減到了 rwnd = 100 ,最后減到 rwnd = 0 蔬蕊,即不允許發(fā)送方再發(fā)送數(shù)據(jù)了结澄。這種使發(fā)送方暫停發(fā)送的狀態(tài)將持續(xù)到主機(jī)B重新發(fā)出一個(gè)新的窗口值為止。B向A發(fā)送的三個(gè)報(bào)文段都設(shè)置了 ACK = 1 岸夯,只有在ACK=1時(shí)確認(rèn)號(hào)字段才有意義麻献。

TCP為每一個(gè)連接設(shè)有一個(gè)持續(xù)計(jì)時(shí)器(persistence timer)。只要TCP連接的一方收到對(duì)方的零窗口通知猜扮,就啟動(dòng)持續(xù)計(jì)時(shí)器勉吻。若持續(xù)計(jì)時(shí)器設(shè)置的時(shí)間到期,就發(fā)送一個(gè)零窗口控測(cè)報(bào)文段(攜1字節(jié)的數(shù)據(jù))旅赢,那么收到這個(gè)報(bào)文段的一方就重新設(shè)置持續(xù)計(jì)時(shí)器齿桃。

十、TCP擁塞控制

1.慢開(kāi)始和擁塞避免

發(fā)送方維持一個(gè)擁塞窗口 cwnd ( congestion window )的狀態(tài)變量鲜漩。擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動(dòng)態(tài)地在變化集惋。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口孕似。

發(fā)送方控制擁塞窗口的原則是:只要網(wǎng)絡(luò)沒(méi)有出現(xiàn)擁塞,擁塞窗口就再增大一些刮刑,以便把更多的分組發(fā)送出去喉祭。但只要網(wǎng)絡(luò)出現(xiàn)擁塞,擁塞窗口就減小一些雷绢,以減少注入到網(wǎng)絡(luò)中的分組數(shù)泛烙。

慢開(kāi)始算法:

當(dāng)主機(jī)開(kāi)始發(fā)送數(shù)據(jù)時(shí),如果立即所大量數(shù)據(jù)字節(jié)注入到網(wǎng)絡(luò)翘紊,那么就有可能引起網(wǎng)絡(luò)擁塞,因?yàn)楝F(xiàn)在并不清楚網(wǎng)絡(luò)的負(fù)荷情況。因此右钾,較好的方法是 先探測(cè)一下,即由小到大逐漸增大發(fā)送窗口宇立,也就是說(shuō),由小到大逐漸增大擁塞窗口數(shù)值自赔。

通常在剛剛開(kāi)始發(fā)送報(bào)文段時(shí)妈嘹,先把擁塞窗口 cwnd 設(shè)置為一個(gè)最大報(bào)文段MSS的數(shù)值。而在每收到一個(gè)對(duì)新的報(bào)文段的確認(rèn)后绍妨,把擁塞窗口增加至多一個(gè)MSS的數(shù)值润脸。用這樣的方法逐步增大發(fā)送方的擁塞窗口 cwnd ,可以使分組注入到網(wǎng)絡(luò)的速率更加合理他去。

圖片
image.gif

?

每經(jīng)過(guò)一個(gè)傳輸輪次毙驯,擁塞窗口 cwnd 就加倍。一個(gè)傳輸輪次所經(jīng)歷的時(shí)間其實(shí)就是往返時(shí)間RTT孤页。不過(guò)“傳輸輪次”更加強(qiáng)調(diào):把擁塞窗口cwnd所允許發(fā)送的報(bào)文段都連續(xù)發(fā)送出去尔苦,并收到了對(duì)已發(fā)送的最后一個(gè)字節(jié)的確認(rèn)。

另行施,慢開(kāi)始的“慢”并不是指cwnd的增長(zhǎng)速率慢允坚,而是指在TCP開(kāi)始發(fā)送報(bào)文段時(shí)先設(shè)置cwnd=1,使得發(fā)送方在開(kāi)始時(shí)只發(fā)送一個(gè)報(bào)文段(目的是試探一下網(wǎng)絡(luò)的擁塞情況)蛾号,然后再逐漸增大cwnd稠项。

為了防止擁塞窗口cwnd增長(zhǎng)過(guò)大引起網(wǎng)絡(luò)擁塞,還需要設(shè)置一個(gè)慢開(kāi)始門(mén)限ssthresh狀態(tài)變量鲜结。慢開(kāi)始門(mén)限ssthresh的用法如下:

  • 當(dāng) cwnd < ssthresh 時(shí)展运,使用上述的慢開(kāi)始算法。

  • 當(dāng) cwnd > ssthresh 時(shí)精刷,停止使用慢開(kāi)始算法而改用擁塞避免算法拗胜。

  • 當(dāng) cwnd = ssthresh 時(shí),既可使用慢開(kāi)始算法怒允,也可使用擁塞控制避免算法埂软。

擁塞避免

讓擁塞窗口cwnd緩慢地增大,即每經(jīng)過(guò)一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞窗口cwnd加1纫事,而不是加倍勘畔。這樣擁塞窗口cwnd按線性規(guī)律緩慢增長(zhǎng),比慢開(kāi)始算法的擁塞窗口增長(zhǎng)速率緩慢得多丽惶。

圖片
image.gif

?

無(wú)論在慢開(kāi)始階段還是在擁塞避免階段炫七,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒(méi)有收到確認(rèn)),就要把慢開(kāi)始門(mén)限ssthresh設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送 方窗口值的一半(但不能小于2)钾唬。然后把擁塞窗口cwnd重新設(shè)置為1万哪,執(zhí)行慢開(kāi)始算法侠驯。

這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生 擁塞的路由器有足夠時(shí)間把隊(duì)列中積壓的分組處理完畢壤圃。

如下圖陵霉,用具體數(shù)值說(shuō)明了上述擁塞控制的過(guò)程。現(xiàn)在發(fā)送窗口的大小和擁塞窗口一樣大伍绳。

圖片
image.gif

?

2.快重傳和快恢復(fù)

快重傳

快重傳算法首先要求接收方每收到一個(gè)失序的報(bào)文段后就立即發(fā)出重復(fù)確認(rèn)(為的是使發(fā)送方及早知道有報(bào)文段沒(méi)有到達(dá)對(duì)方)而不要等到自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn)踊挠。

圖片
image.gif

?

接收方收到了M1和M2后都分別發(fā)出了確認(rèn)。現(xiàn)在假定接收方?jīng)]有收到M3但接著收到了M4冲杀。

顯然效床,接收方不能確認(rèn)M4,因?yàn)镸4是收到的失序報(bào)文段权谁。根據(jù) 可靠傳輸原理剩檀,接收方可以什么都不做,也可以在適當(dāng)時(shí)機(jī)發(fā)送一次對(duì)M2的確認(rèn)旺芽。

但按照快重傳算法的規(guī)定沪猴,接收方應(yīng)及時(shí)發(fā)送對(duì)M2的重復(fù)確認(rèn),這樣做可以讓 發(fā)送方及早知道報(bào)文段M3沒(méi)有到達(dá)接收方采章。發(fā)送方接著發(fā)送了M5和M6运嗜。接收方收到這兩個(gè)報(bào)文后,也還要再次發(fā)出對(duì)M2的重復(fù)確認(rèn)悯舟。這樣担租,發(fā)送方共收到了 接收方的四個(gè)對(duì)M2的確認(rèn),其中后三個(gè)都是重復(fù)確認(rèn)抵怎。

快重傳算法還規(guī)定奋救,發(fā)送方只要一連收到三個(gè)重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對(duì)方尚未收到的報(bào)文段M3,而不必 繼續(xù)等待M3設(shè)置的重傳計(jì)時(shí)器到期反惕。

由于發(fā)送方盡早重傳未被確認(rèn)的報(bào)文段尝艘,因此采用快重傳后可以使整個(gè)網(wǎng)絡(luò)吞吐量提高約20%。

快恢復(fù)

與快重傳配合使用的還有快恢復(fù)算法姿染,其過(guò)程有以下兩個(gè)要點(diǎn):

  • 當(dāng)發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn)背亥,就執(zhí)行“乘法減小”算法,把慢開(kāi)始門(mén)限ssthresh減半盔粹。

  • 與慢開(kāi)始不同之處是現(xiàn)在不執(zhí)行慢開(kāi)始算法(即擁塞窗口cwnd現(xiàn)在不設(shè)置為1)隘梨,而是把cwnd值設(shè)置為 慢開(kāi)始門(mén)限ssthresh減半后的數(shù)值程癌,然后開(kāi)始執(zhí)行擁塞避免算法(“加法增大”)舷嗡,使擁塞窗口緩慢地線性增大。


    1200360.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嵌莉,一起剝皮案震驚了整個(gè)濱河市进萄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖中鼠,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可婶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡援雇,警方通過(guò)查閱死者的電腦和手機(jī)矛渴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惫搏,“玉大人具温,你說(shuō)我怎么就攤上這事】鹋猓” “怎么了铣猩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茴丰。 經(jīng)常有香客問(wèn)我达皿,道長(zhǎng),這世上最難降的妖魔是什么贿肩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任峦椰,我火速辦了婚禮,結(jié)果婚禮上尸曼,老公的妹妹穿的比我還像新娘们何。我一直安慰自己,他們只是感情好控轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布冤竹。 她就那樣靜靜地躺著,像睡著了一般茬射。 火紅的嫁衣襯著肌膚如雪鹦蠕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天在抛,我揣著相機(jī)與錄音钟病,去河邊找鬼。 笑死刚梭,一個(gè)胖子當(dāng)著我的面吹牛肠阱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朴读,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屹徘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了衅金?” 一聲冷哼從身側(cè)響起噪伊,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤簿煌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鉴吹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體姨伟,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年豆励,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夺荒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡良蒸,死狀恐怖般堆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诚啃,我是刑警寧澤淮摔,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站始赎,受9級(jí)特大地震影響和橙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜造垛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一魔招、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧五辽,春花似錦办斑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至罪郊,卻和暖如春蠕蚜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悔橄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工靶累, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人癣疟。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓挣柬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親睛挚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邪蛔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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