IP相關(guān)
IP:Internet Protocol網(wǎng)際協(xié)議,作用與TCP/IP模型中的互聯(lián)網(wǎng)層遇伞,也就是OSI中的網(wǎng)絡(luò)層辙喂。作用為實現(xiàn)端對端的連接,可實現(xiàn)不同數(shù)據(jù)鏈路的連接(數(shù)據(jù)鏈路層僅能實現(xiàn)相同數(shù)據(jù)鏈路的連接,而網(wǎng)絡(luò)層可跨越不同數(shù)據(jù)鏈路)巍耗。
首先明確IP屬于面向無連接型協(xié)議秋麸,即傳輸數(shù)據(jù)時并不會先確定是否已經(jīng)建立起了源主機與目標(biāo)主機的連接,而是直接發(fā)送數(shù)據(jù)包炬太,這就導(dǎo)致了在目標(biāo)主機關(guān)機或不存在時灸蟆,數(shù)據(jù)無法正常送達,由此產(chǎn)生了冗余的通信亲族,但IP采用無連接的方式目的在與簡化數(shù)據(jù)傳輸過程與加快傳輸速度炒考。(若要實現(xiàn)可靠地面向連接的傳遞,則由上層的TCP來實現(xiàn))
IP地址知識:
IP地址=網(wǎng)絡(luò)地址+主機地址
網(wǎng)絡(luò)地址即為同一網(wǎng)段的標(biāo)識霎迫,主機地址不允許在同一網(wǎng)段(即同一網(wǎng)絡(luò)地址)下重復(fù)斋枢。由此保證在相互連接的整個網(wǎng)絡(luò)中每臺主機的IP地址都不會重復(fù),即IP地址就具有了唯一性(但IP地址是有限的知给,具體的解決方案后文再詳述)瓤帚。
IP地址分為A,B涩赢,C戈次,D四類
如下圖所示:
A類:0.0.0.0~127.0.0.0,后24位為主機標(biāo)識位筒扒,由于網(wǎng)絡(luò)地址中0和127的被保留怯邪,可用的網(wǎng)絡(luò)地址為27-2=126個,同理花墩,主機地址中全0與全1的也為保留地址擎颖,所以每個網(wǎng)絡(luò)地址可分配224-2=16777214個主機地址
B類:128.0.0.0~191.255.0.0,后16位為主機標(biāo)識位观游,與A類的計算方法一樣搂捧,由于前兩位必須為10,所以網(wǎng)絡(luò)地址有214-2=16382個懂缕,每個網(wǎng)絡(luò)地址可分配216-2=65534個主機地址
C類:192.0.0.0~223.255.255.0允跑,后8位為主機標(biāo)識位,與A類的計算方法一樣搪柑,由于前三位必須為110聋丝,所以網(wǎng)絡(luò)地址有221-2=2097150個,每個網(wǎng)絡(luò)地址可分配28-2=254個主機地址
D類:224.0.0.0~239.255.255.255工碾,無主機標(biāo)識弱睦,常被用于多播
提高IP地址利用率的兩種方式:
- 子網(wǎng)掩碼:
根據(jù)上訴四類IP地址的分類,不難看出分類的其實并不合理渊额,比如B類網(wǎng)絡(luò)地址同一鏈路上最多可連接65534臺主機况木,這幾乎是不會發(fā)生的垒拢,所以這對于網(wǎng)絡(luò)地址來說是很浪費的,更別說A類資源了火惊,所以求类,通過一個“子網(wǎng)掩碼”方式來實現(xiàn)對網(wǎng)絡(luò)地址的進一步劃分。
子網(wǎng)掩碼有兩種表現(xiàn)形式:
A:當(dāng)做32位2進制數(shù)表示屹耐,網(wǎng)絡(luò)地址部分全為“1”尸疆,主機部分全為“0”
如:IP地址:192.40.102.60
子網(wǎng)掩碼:255.255.255.192
網(wǎng)絡(luò)地址:192.40.102.0
廣播地址為:192.40.102.63
B:用“/”+位數(shù)表示
如:IP地址:192.40.102.60 /26
網(wǎng)絡(luò)地址:192.40.102.0 /26
廣播地址為:192.40.102.63 /26
但是,當(dāng)我有一個區(qū)域的網(wǎng)絡(luò)惶岭,主機不需要連接外網(wǎng)時寿弱,此時的IP地址若通過上訴兩種方式來分又浪費了,所以按灶,又出現(xiàn)了私有地址與全局地址的概念症革。 - 私有地址:
A類:10.0.0.0~10.255.255.255 (10/8)
B類:172.16.0.0~172.31.255.255(172.16/12)
C類:192.168.0.0~192.168.255.255(192.168/16)
以上范圍內(nèi)的地址均屬于私有地址,在此之外的地址為全局地址兆衅。即公司可為每臺主機分配私有地址,再在對外服務(wù)器上設(shè)置全局地址(配有私有地址的主機連接外網(wǎng)時嗜浮,通過NAT協(xié)議實現(xiàn))羡亩。這樣,全局地址必須保持唯一性危融,而私有地址則只保證在同一域內(nèi)唯一就可以了畏铆,不同域內(nèi)的私有地址互不影響,這樣就很大程度上解決了IPv4地址的有限的分配問題吉殃。而全局地址則需要向?qū)iT的機構(gòu)申請(ICANN)辞居。
IP分割處理與再構(gòu)成處理
每種數(shù)據(jù)鏈路不同,其最大傳輸單元(MTU)也不同蛋勺,例如FDDI的最大MTU為4352瓦灶,而以太網(wǎng)的MTU為1500,所以大小為4000的IP數(shù)據(jù)報可以在FDDI中傳輸卻無法在以太網(wǎng)中傳輸抱完,路由器就承擔(dān)了分割作用贼陶,將IP數(shù)據(jù)報分割成一幀能傳輸?shù)淖畲髥挝唬儆赡康闹鳈C進行重組巧娱。路由器只會分片不會重組碉怔。(原因:路由器分組的數(shù)據(jù)也許會到達下一路由器,若此時重組禁添,則還會面臨分組的可能撮胧,降低了網(wǎng)絡(luò)傳送效率,所以僅在目標(biāo)主機處進行重組)
路徑MTU發(fā)現(xiàn):
發(fā)送主機首先將IP報文的分片禁止位置為1老翘,意思是不允許分片芹啥。當(dāng)途徑的路由器無法處理這么大的數(shù)據(jù)包時將其丟棄锻离,并返回發(fā)送主機一個目標(biāo)不可達的ICMP消息。此消息中包含了數(shù)據(jù)鏈路上的MTU值叁征,發(fā)送主機根據(jù)收到的這個ICPM將數(shù)據(jù)分片纳账,如此反復(fù),直到將數(shù)據(jù)分片為所經(jīng)數(shù)據(jù)鏈路的最小MTU而能到達目標(biāo)主機為止捺疼。
相關(guān)技術(shù)(用于支持IP協(xié)議疏虫,來完成最終的通信):
DNS:domain names system 背景:IP地址不方便記憶,也不方便表示其代表的服務(wù)啤呼,所以我們通常訪問的事域主機名稱卧秘,所以就產(chǎn)生了可以有效管理主機名與IP地址之間對應(yīng)關(guān)系的系統(tǒng)。
ARP:Address resolution protocol:根據(jù)目標(biāo)IP地址來定位下一應(yīng)該接受數(shù)據(jù)包的網(wǎng)絡(luò)設(shè)備對應(yīng)的MAC地址官扣。工作機制:目標(biāo)主機廣播發(fā)送ARP請求包翅敌,其中包含目標(biāo)主機的IP地址,若收到該請求包的路由器的IP地址與目標(biāo)地址相符惕蹄,則返回APR響應(yīng)包蚯涮,并在包中加入自己的MAC地址,由此源主機就知曉了目標(biāo)主機的MAC地址卖陵。
ICMP:確認(rèn)IP包是否成功送達目的主機遭顶,通知在發(fā)送過程當(dāng)中IP包被廢棄的具體原因,改善網(wǎng)絡(luò)設(shè)置等泪蔫。其信息主要分為通知出錯原因的錯誤消息和用于診斷的查詢消息棒旗。平時我們所用的ping指令就是利用ICMP來判斷目標(biāo)主機是否可達。
DHCP:Dynamic Host Configuration Protocol動態(tài)分配IP地址撩荣,聯(lián)網(wǎng)的設(shè)備向DHCP服務(wù)器請求即可獲取到自動分配的IP地址铣揉,實現(xiàn)了即插即用
NAT:Network Address Translator:將本地的私有地址轉(zhuǎn)換成全局IP地址的技術(shù)
IP隧道:在網(wǎng)絡(luò)層首部后面繼續(xù)追加網(wǎng)絡(luò)層首部,例如IPv4首部前追加一個ipv6首部餐曹,就可以穿過IPv6的網(wǎng)絡(luò)了
TCP詳細(xì)與UDP對比(Transmission Control Protocol):
UDP與TCP比較:
TCP面向連接逛拱,建立可靠連接,且有重發(fā)機制台猴,順序機制
UDP(User Datagram Protocol)面向無連接橘券,傳輸前無需提前建立連接,無重發(fā)機制卿吐,傳輸高速旁舰,適用于對實時性要求較高的場合(如音視頻傳輸)或傳輸數(shù)據(jù)較少,廣播通信嗡官,限定于LAN等特定網(wǎng)絡(luò)中的應(yīng)用通信
**TCP/IP通信中不可或缺的四個要素為:源IP地址箭窜,目標(biāo)IP地址,源端口號衍腥,目標(biāo)端口號
**
什么是端口號磺樱?
端口號即表示程序地址纳猫,用來識別同一計算機中的不同程序,傳輸層協(xié)議通過端口號決定將數(shù)據(jù)傳輸給哪個應(yīng)用層協(xié)議處理竹捉,如HTTP協(xié)議的端口號為80(也是默認(rèn)端口號)芜辕,ftp端口號為21
TCP連接狀態(tài)變遷圖(摘自TCP/IP詳解卷1):
根據(jù)這張狀態(tài)時序圖可看出客戶端與服務(wù)器在什么時候發(fā)送何種指令后處于什么狀態(tài),根據(jù)粗線即可看出客戶端的正常狀態(tài)變遷块差,虛線則是服務(wù)器的正常狀態(tài)變遷侵续。要牢記TCP的原則,即TCP連接是全雙工(即數(shù)據(jù)在兩個方向上能同時傳遞)憨闰,因此每個方向必須單獨地進行關(guān)閉状蜗。
實現(xiàn)可靠性傳輸要點:
1.序列號與ACK(positive acknowledgement)(確認(rèn)應(yīng)答):發(fā)送方發(fā)送數(shù)據(jù)序列號,接收方收到數(shù)據(jù)后返回ACK消息與已收到序列號的下一個數(shù)據(jù)序列號(未收到的序列號則不發(fā))
2.重發(fā)控制:等待超時則重發(fā)數(shù)據(jù)鹉动,它是一個動態(tài)變化的時間轧坎。這個時間總是略大于連接往返時間(RTT,Round Trip Time)
3.連接管理:一個連接的建立與斷開至少需要7個包來完成泽示,如下圖所示
4.MSS(Maximum Segment Size)最大消息長度缸血,三次握手時取出最小值放入TCP首部
5.窗口控制:每次發(fā)送端以窗口大小為單位發(fā)送一串?dāng)?shù)據(jù)嗎,并在發(fā)送端主機建立了緩沖區(qū)械筛,來放置未收到確認(rèn)信號可能重發(fā)的數(shù)據(jù)捎泻,直到收到確認(rèn)信號,再將此數(shù)據(jù)清除变姨。收到確認(rèn)應(yīng)答后族扰,窗口就滑動到了確認(rèn)ack中返回的序號處厌丑,就可以實現(xiàn)多段數(shù)據(jù)同時發(fā)送來提高通信速度定欧,這也稱為滑動窗口控制。
6.窗口控制與(高速)重發(fā)控制:若發(fā)送端連續(xù)三次收到同一序列號的應(yīng)答怒竿,則認(rèn)為此數(shù)據(jù)丟失砍鸠,重發(fā)此數(shù)據(jù)
情況一:目標(biāo)主機未收到應(yīng)該收到的數(shù)據(jù)時,例如本該收到下一數(shù)據(jù)為1001-2000耕驰,但卻收到了2001-3000的數(shù)據(jù)爷辱,證明1001-2000數(shù)據(jù)已丟失,此時需要源主機重發(fā)朦肘,目標(biāo)主機就應(yīng)答1001的ack信號饭弓,當(dāng)源主機連續(xù)收到三個該信號時,重發(fā)1001-2000的數(shù)據(jù)媒抠。
情況二:目標(biāo)主機收到數(shù)據(jù)弟断,但應(yīng)答信號半路丟失,例如1001的ack丟失了趴生,目標(biāo)主機下一接收到的數(shù)據(jù)為1001-2000阀趴,此時目標(biāo)主機正常應(yīng)答2001的ack昏翰,源主機雖然未收到1001的ack,但由于已經(jīng)確認(rèn)目標(biāo)主機收到了2001的ack刘急,所以不會重發(fā)數(shù)據(jù)棚菊,所以在窗口足夠大時,丟失少量的確認(rèn)應(yīng)答信號也不會導(dǎo)致重發(fā)消息
7.流控制:當(dāng)接收端主機處理不過來接收到的數(shù)據(jù)時叔汁,可能就將后續(xù)收到的數(shù)據(jù)直接丟棄统求,這就會導(dǎo)致發(fā)送端的數(shù)據(jù)重發(fā),為了避免這種浪費流量的情況攻柠,發(fā)送端需要時不時的發(fā)送窗口探測數(shù)據(jù)段球订,探測接收端緩沖區(qū)狀態(tài),以此來改變發(fā)送端的窗口大小
8.擁塞控制:連接剛建立時瑰钮,發(fā)送主機并不知道接收端緩沖窗口的大小冒滩,此時若發(fā)送大量的數(shù)據(jù),則可能會造成網(wǎng)絡(luò)過載導(dǎo)致網(wǎng)絡(luò)癱瘓浪谴,這時需要采用慢啟動算法類控制窗口(也叫擁塞窗口cwnd(congestion window))大小开睡。慢啟動算法與擁塞避免算法:慢啟動時將擁塞窗口初始值設(shè)置為1,以后每收到一個ACK則擁塞窗口值加1苟耻,如發(fā)送方開始時發(fā)送一個報文段篇恒,然后等待ACK。當(dāng)收到該ACK時凶杖,擁塞窗口從 1 增加為 2 胁艰,即可以發(fā)送兩個報文段。當(dāng)收到這兩個報文段的ACK時智蝠,擁塞窗口就增加為4腾么。發(fā)送數(shù)據(jù)前將擁塞窗口與接收端主機通知的窗口大小作比較,取較小值杈湾,發(fā)送比這個值小的數(shù)據(jù)量解虱,但是,隨著數(shù)據(jù)的成功發(fā)送漆撞,擁塞窗口的值成1殴泰,2,4的2的指數(shù)倍增長浮驳,也會導(dǎo)致數(shù)據(jù)激增的想象出現(xiàn)悍汛,所以又出現(xiàn)了慢啟動門限(ssthresh)的概念:當(dāng)擁塞窗口大于這個ssthresh值時,采用擁塞避免算法至会,擁塞避免算法要求每次收到一個確認(rèn)時將cwnd增加1/cwnd离咐。與慢啟動的指數(shù)增加比起來,這是一種加性增長( additivein crease)奋献。如下圖所示:
假設(shè)ssthresh設(shè)置為16健霹,網(wǎng)絡(luò)正常返回所有的ack時旺上,時間點1,發(fā)送端收到1個ack糖埋,將cwnd置為2宣吱,時間點2,發(fā)送端收到2個ack瞳别,將cwnd設(shè)置為4征候,時間點3,發(fā)送端收到4個ack祟敛,將cwnd設(shè)置為8疤坝,時間點4,發(fā)送端收到8個ack馆铁,將cwnd置為16跑揉,此時到達門限值,將不再使用慢啟動算法埠巨,改用擁塞避免算法历谍,時間點5,發(fā)送端收到16個ack辣垒,將cwnd增加16x1/16=1望侈,即cwnd置為17,時間點6勋桶,發(fā)送端收到17個ack脱衙,將cwnd增加17x1/17=1,即cwnd置為18例驹,后面的就依照線性增長捐韩。
窗口大小與吞吐量:
設(shè)窗口大小為W,往返時間為RTT
最大吞吐量Tmax=W/RTT bps
為什么建立TCP連接需要三次握手而不是2次或4次眠饮?(下列回答摘自網(wǎng)絡(luò))
回答1: TCP的三次握手最主要是防止已過期的連接再次傳到被連接的主機奥帘。
謝希仁版《計算機網(wǎng)絡(luò)》中的例子是這樣的铜邮,“已失效的連接請求報文段”的產(chǎn)生在這樣一種情況下:client發(fā)出的第一個連接請求報文段并沒有丟失仪召,而是在某個網(wǎng)絡(luò)結(jié)點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server松蒜。本來這是一個早已失效的報文段扔茅。但server收到此失效的連接請求報文段后,就誤認(rèn)為是client再次發(fā)出的一個新的連接請求秸苗。于是就向client發(fā)出確認(rèn)報文段召娜,同意建立連接。假設(shè)不采用“三次握手”惊楼,那么只要server發(fā)出確認(rèn)玖瘸,新的連接就建立了秸讹。由于現(xiàn)在client并沒有發(fā)出建立連接的請求,因此不會理睬server的確認(rèn)雅倒,也不會向server發(fā)送ACK包璃诀。
簡單點說就是:
如果采用兩次的話,會出現(xiàn)下面這種情況蔑匣。
比如是A機要連到B機劣欢,結(jié)果發(fā)送的連接信息由于某種原因沒有到達B機;
于是裁良,A機又發(fā)了一次凿将,結(jié)果這次B收到了,于是就發(fā)信息回來价脾,兩機就連接牧抵。傳完東西后,斷開侨把。結(jié)果這時候灭忠,原先沒有到達的連接信息突然又傳到了B機,于是B機發(fā)信息給A座硕,然后B機就以為和A連上了弛作,這個時候B機就在等待A傳東西過去。
回答2:三次握手改成僅需要兩次握手华匾,死鎖是可能發(fā)生
考慮計算機A和B之間的通信映琳,假定B給A發(fā)送一個連接請求分組,A收到了這個分組蜘拉,并發(fā)送了確認(rèn)應(yīng)答分組萨西。按照兩次握手的協(xié)定,A認(rèn)為連接已經(jīng)成功地建立了旭旭,可以開始發(fā)送數(shù)據(jù)分組谎脯。可是持寄,B在A的應(yīng)答分組在傳輸中被丟失的情況下源梭,將不知道A是否已準(zhǔn)備好,不知道A建議什么樣的序列號稍味,B甚至懷疑A是否收到自己的連接請求分組废麻。在這種情況下,B認(rèn)為連接還未建立成功模庐,將忽略A發(fā)來的任何數(shù)據(jù)分組烛愧,只等待連接確認(rèn)應(yīng)答分組。而A在發(fā)出的分組超時后,重復(fù)發(fā)送同樣的分組怜姿。這樣就形成了死鎖慎冤。
然而,A在發(fā)送之后也有超時等待沧卢,當(dāng)?shù)却鼴的回應(yīng)信號時間過長時也會重新發(fā)送SYN粪薛,所以并不一定出現(xiàn)死鎖。
**我的理解:
世界上不存在完全可靠的通信協(xié)議搏恤,三次握手只是為了證明雙方的收發(fā)都是可以的违寿,但不排除其中出現(xiàn)某一方的收發(fā)有問題的情況發(fā)生,三次握手是最少的連接熟空,為了確認(rèn)也可以不同的重復(fù)發(fā)送藤巢。首先請求方發(fā)送SYN請求連接時證明了請求方有發(fā)送數(shù)據(jù)的能力,接收方接收后回發(fā)ACK+SYN證明了接收方有接收數(shù)據(jù)的能力與發(fā)送數(shù)據(jù)的能力息罗,最后發(fā)送方收到接收方的反饋并發(fā)送ack掂咒,證明了發(fā)送方有接收數(shù)據(jù)的能力,所以三次握手是最少的能進行雙向通信的保障迈喉。
**
為什么TCP協(xié)議終止連接要四次绍刮?
TCP提供了連接的一端在結(jié)束它的發(fā)送后還能接收來自另一端數(shù)據(jù)的能力,也稱為半關(guān)閉特性
1挨摸、當(dāng)主機A確認(rèn)發(fā)送完數(shù)據(jù)且知道B已經(jīng)接受完了孩革,想要關(guān)閉發(fā)送數(shù)據(jù)口(當(dāng)然確認(rèn)信號還是可以發(fā)),就會發(fā)FIN給主機B得运。
2膝蜈、主機B收到A發(fā)送的FIN,表示收到了熔掺,就會發(fā)送ACK回復(fù)饱搏。
3、但這是B可能還在發(fā)送數(shù)據(jù)置逻,沒有想要關(guān)閉數(shù)據(jù)口的意思推沸,所以FIN與ACK不是同時發(fā)送的,而是等到B數(shù)據(jù)發(fā)送完了券坞,才會發(fā)送FIN給主機A鬓催。
4、A收到B發(fā)來的FIN报慕,知道B的數(shù)據(jù)也發(fā)送完了深浮,回復(fù)ACK压怠, A等待2MSL以后眠冈,沒有收到B傳來的任何消息,知道B已經(jīng)收到自己的ACK了,A就關(guān)閉鏈接蜗顽,B也關(guān)閉鏈接了布卡。