1,真正負(fù)責(zé)設(shè)備間傳輸?shù)氖蔷W(wǎng)絡(luò)層和數(shù)據(jù)鏈路層饲宛;
2皆愉,分工會(huì)帶來很多好處,因?yàn)槊總€(gè)人都可以專注于自己擅長(zhǎng)的領(lǐng)域艇抠,更好地服務(wù)他人亥啦;
3,網(wǎng)絡(luò)分層的目的并不僅僅是完成任務(wù)练链,而是要用最好的方式來完成翔脱;
4,網(wǎng)絡(luò)包是有大小限制的媒鼓,其最大值稱為MTU届吁,即最大傳輸單元。大多數(shù)網(wǎng)絡(luò)的MTU是1500Byte绿鸣,但也有些網(wǎng)絡(luò)啟用了巨幀(Jumbo Frame)疚沐,能達(dá)到9000Byte。一個(gè)8000Byte的包進(jìn)入巨幀網(wǎng)絡(luò)是沒有問題的潮模,但進(jìn)入1500Byte的網(wǎng)絡(luò)就會(huì)被丟棄或者切分亮蛔。被丟棄意味著意味著傳輸徹底失敗,因?yàn)橹貍鞯陌€是會(huì)被丟棄擎厢。而被切分則意味著傳輸效率降低究流;
5辣吃,OSI七層模型和TCP/IP模型;
6芬探,TCP提供有序的傳輸神得,所以每個(gè)數(shù)據(jù)段都要標(biāo)上一個(gè)序列號(hào)(Seq)。當(dāng)接收方收到亂序的包時(shí)偷仿,有了這個(gè)序號(hào)就可以重新排序了哩簿;
7,一個(gè)Seq號(hào)的大小是根據(jù)上一個(gè)數(shù)據(jù)段的Seq+Len得來的酝静,注意Len不包括TCP頭部节榜;
8,由于TCP是雙向的别智,在一個(gè)連接中雙方都可以是發(fā)送方宗苍,所以各自維護(hù)了一個(gè)Seq號(hào);
9亿遂,Ack確認(rèn)號(hào)浓若,確認(rèn)已經(jīng)收到了哪些字節(jié)渺杉。理論上蛇数,接收方回復(fù)的Ack號(hào)恰好等于發(fā)送方的下一個(gè)Seq號(hào);
10是越,TCP的確認(rèn)是可以累積的耳舅;
11,當(dāng)包亂序時(shí)倚评,接收方只要根據(jù)Seq號(hào)從小到大重新排序就好浦徊,這樣保證了TCP的有序性。再比如有包丟失的時(shí)候天梧,接收方通過前一個(gè)Seq+Len的值與下一個(gè)Seq的差盔性,就能判斷缺了哪些包,這保證了TCP的可靠性呢岗;
12冕香,TCP頭常見的幾個(gè)標(biāo)志位:
SYN:攜帶這個(gè)標(biāo)志的包表示正在發(fā)起連接請(qǐng)求,因?yàn)檫B接是雙向的后豫,所以建立連接時(shí)悉尾,雙方都要發(fā)一個(gè)SYN;
FIN:攜帶這個(gè)標(biāo)志的包表示正在請(qǐng)求終止連接挫酿。因?yàn)檫B接是雙向的构眯,所以徹底關(guān)閉一個(gè)連接時(shí),雙方都要發(fā)一個(gè)SYN早龟;
RST:用于重置一個(gè)混亂的連接惫霸,或者拒絕一個(gè)無效的請(qǐng)求猫缭。
#如果你在一個(gè)Wireshark鐘看到一個(gè)RST包,務(wù)必睜大眼睛好好檢查它褪。
13饵骨,TCP三次握手過程:
C:我能跟你建立連接嗎?我的初始發(fā)送序號(hào)是X茫打。如果你答應(yīng)就Ack=X+1居触;
S:收到啦,Ack=X+1老赤。我也想跟你建立連接轮洋,我的初始發(fā)送序號(hào)是Y,你如果答應(yīng)就回復(fù)Ack=Y+1抬旺;
C:收到了弊予,Ack=Y+1。
14开财,TCP四次揮手過程:
C:我希望斷開連接(請(qǐng)注意FIN標(biāo)志)汉柒;
S:知道了,斷開吧责鳍;
S:我這邊的連接也想斷開(請(qǐng)注意FIN標(biāo)志)碾褂;
C:知道了,斷開吧历葛。
15正塌,快遞送貨的策略是非常淺顯的,幾乎人人可以理解恤溶。而TCP傳輸大塊數(shù)據(jù)的策略卻很少有人懂乓诽。事實(shí)上這兩者原理是相似的:
假如發(fā)一個(gè)包就停下來等待確認(rèn),這樣一個(gè)往返時(shí)間內(nèi)就只能傳輸一個(gè)包咒程,這樣的傳輸效率太低了鸠天;
最快的方式是一口氣把所有的包發(fā)送出去,然后一起確認(rèn)帐姻。但現(xiàn)實(shí)存在很多限制稠集,接收方的緩存(接受窗口)可能一下接收不了這么多數(shù)據(jù)、網(wǎng)絡(luò)帶寬也不夠大容易導(dǎo)致丟包卖宠。
所以巍杈,發(fā)送方要知道接收方的接收窗口和網(wǎng)絡(luò)這兩個(gè)限制因素中哪一個(gè)更為嚴(yán)格,然后在其限制范圍內(nèi)盡可能多發(fā)包扛伍。這個(gè)一口氣能發(fā)送的數(shù)據(jù)量就是傳說中的TCP發(fā)送窗口筷畦。
TCP層里面window size不是發(fā)送窗口,而是再向?qū)Ψ铰暶髯约旱慕邮沾翱凇鳖宾;瑒?dòng)窗口機(jī)制吼砂,就是接收方向發(fā)送方聲明自己的接收窗口大小,然后發(fā)送方修改自己的發(fā)送窗口鼎文,說的就是這兩個(gè)窗口的關(guān)系渔肩。
發(fā)送窗口是由接收窗口決定的!只要在包里用“win=”告知發(fā)送方即可拇惋;
假如接收方處理數(shù)據(jù)的速度跟不上接收數(shù)據(jù)的速度周偎,緩存就會(huì)被占滿,從而導(dǎo)致接收窗口為0撑帖。意味那段時(shí)間內(nèi)發(fā)不出數(shù)據(jù)蓉坎。
網(wǎng)絡(luò)之所以限制發(fā)送窗口,是因?yàn)樗豢跉馐艿教鄶?shù)據(jù)時(shí)就會(huì)擁塞胡嘿,擁塞的結(jié)果是丟包蛉艾,這是發(fā)送方最忌憚的。能導(dǎo)致網(wǎng)絡(luò)擁塞的數(shù)據(jù)量稱為擁塞點(diǎn)衷敌。發(fā)送發(fā)當(dāng)然希望把發(fā)送窗口控制在擁塞點(diǎn)下以避免擁塞勿侯。
由于UDP協(xié)議頭長(zhǎng)度還不到TCP頭的一半,所以在同樣大小的包里缴罗,UDP攜帶的凈數(shù)據(jù)比TCP包多一些助琐;
由于UDP沒有Seq號(hào)和Ack號(hào)等概念,無法維持一個(gè)連接瞒爬,所以省去了建立連接的負(fù)擔(dān)弓柱。這個(gè)優(yōu)勢(shì)在DNS查詢中體現(xiàn)的淋漓盡致沟堡;