淺談網(wǎng)絡(luò)協(xié)議
網(wǎng)絡(luò)協(xié)議模型通常有OSI七層模型、TCP/IP模型妻味、五層模型。
OSI是ISO組織定義的國際化標(biāo)準(zhǔn)欣福,但并不實用责球,一般只用于學(xué)習(xí)。TCP/IP模型是事實上的標(biāo)準(zhǔn)拓劝,當(dāng)前主流應(yīng)用一般都使用此模型雏逾。
TCP/IP模型分為四層:應(yīng)用層、傳輸層郑临、網(wǎng)際層栖博、網(wǎng)絡(luò)接口層,五層模型則在TCP/IP模型基礎(chǔ)上將網(wǎng)絡(luò)接口層細(xì)分為數(shù)據(jù)鏈路層和物理層厢洞,此處使用五層模型仇让。
1、物理層為傳輸載體躺翻,有雙絞線丧叽、光纖、同軸電纜公你。雙絞線一般用于局域網(wǎng)踊淳,光纖一般用于遠(yuǎn)距離傳輸,同軸電纜可用于局域網(wǎng)陕靠,但基本已被雙絞線取代迂尝,現(xiàn)在用于有線電視線路。
信道復(fù)用技術(shù)有:時分復(fù)用剪芥、頻分復(fù)用垄开、波分復(fù)用、碼分復(fù)用税肪。
2说榆、數(shù)據(jù)鏈路層在物理層之上虚吟,PPP協(xié)議是目前應(yīng)用最廣泛的數(shù)據(jù)鏈路層協(xié)議寸认,PPP非常簡單签财,接收方每收到一個幀,就進行CRC校驗偏塞,如正確則收下唱蒸,反之則丟棄這個幀。數(shù)據(jù)的表示方式有歸零制灸叼、不歸零制神汹、曼切斯特編碼,差分曼切斯特編碼古今。
早期有以太網(wǎng)共享協(xié)議CSMA/CD屁魏,將許多站點接到一根總線上,CSMA/CD(Carrier Sense Multiple Access/Collision Detection)是以半雙工方式運行(發(fā)送和接收不能同時進行)捉腥。載波監(jiān)聽就是發(fā)送前先監(jiān)聽氓拼,發(fā)送前要檢測總線上是否有其他站點在發(fā)送數(shù)據(jù)(如果有則等空閑時再發(fā));碰撞檢測就是邊發(fā)送邊監(jiān)聽抵碟,適配器邊發(fā)送數(shù)據(jù)邊檢測其他站點是否也在發(fā)送數(shù)據(jù)桃漾,如果發(fā)現(xiàn)有其他站點也在發(fā)送數(shù)據(jù)(同時只能一個站點發(fā)),則立即停止發(fā)送拟逮,等待空閑后再發(fā)送撬统,CSMA/CD協(xié)議要求發(fā)送時延至少要兩倍的傳播時延才能保證沖突檢測。以太網(wǎng)有效幀長度為64~1518字節(jié)敦迄,大于或者小于有效長度的幀會被直接丟棄×底罚現(xiàn)在一般使用交換式集線器,也就是常說的交換機罚屋。
3苦囱、網(wǎng)絡(luò)層的兩大主要功能為分組轉(zhuǎn)發(fā)和路由選擇,分組轉(zhuǎn)發(fā)是路由器根據(jù)轉(zhuǎn)發(fā)表將接收到的分組從某個接口轉(zhuǎn)發(fā)出去沿后,路由選擇是網(wǎng)絡(luò)層決定轉(zhuǎn)發(fā)路徑的過程(內(nèi)部網(wǎng)關(guān)協(xié)議RIP沿彭、OSPF,外部網(wǎng)關(guān)協(xié)議BGP尖滚、)喉刘。
IP協(xié)議是網(wǎng)絡(luò)層的重要協(xié)議,網(wǎng)絡(luò)層還有其他輔助協(xié)議漆弄,如ARP睦裳,RARP、ICMP撼唾、IGMP廉邑。IPV4為32位二進制數(shù),一般使用點分十進制來表示,IPV6為128位二進制數(shù)蛛蒙。IP地址由網(wǎng)絡(luò)部分和主機部分組成糙箍,例如在192.168.0.1/24中,網(wǎng)絡(luò)地址為192.168.0.0牵祟,主機號為1深夯。
一些特殊的IP地址不能分配給主機:網(wǎng)絡(luò)地址和主機號全為0表示為本網(wǎng)絡(luò)上的本主機(0.0.0.0),主機地址全為1的地址表示該網(wǎng)段的廣播地址诺苹。本地專用網(wǎng)段地址有:10.0.0.0-10.255.255.255咕晋、172.16.0.0-172.31.255.255、192.168.0.0-192.168.255.255收奔,IP協(xié)議會將大于MTU大小的數(shù)據(jù)報分成多個數(shù)據(jù)報發(fā)送据德,到達(dá)目的地后再組裝续挟。
ARP協(xié)議的作用是獲取IP地址對應(yīng)的Mac地址遍尺。路由器轉(zhuǎn)發(fā)IP數(shù)據(jù)報的過程基本如下:提取目的IP地址D挠轴,對路由器各個網(wǎng)絡(luò)的掩碼與D相與(AND位運算),如結(jié)果與網(wǎng)絡(luò)地址匹配损姜,則直接交付饰剥。否則查詢路由表中的每一行(目的網(wǎng)絡(luò)地址、掩碼摧阅、下一跳汰蓉、接口),用其掩碼與D相與棒卷,結(jié)果與網(wǎng)絡(luò)地址匹配則交付顾孽。如果路由表查詢完畢還未找到則查看是否有默認(rèn)路由,有則轉(zhuǎn)發(fā)至默認(rèn)路由比规,沒有則報錯若厚。知道IP地址但不知道物理地址無法到達(dá),所以需要ARP來完成這個工作 蜒什,如果ARP表中找不到某個IP的MAC地址测秸,則會發(fā)送一個廣播,由該IP主機回應(yīng)灾常。
ICMP協(xié)議霎冯,ICMP差錯報告報文有五種:終點不可達(dá)、源點抑制钞瀑、超時沈撞、參數(shù)問題、改變路由(重定向)雕什,Windows系統(tǒng)常用的Ping命令使用的就是ICMP報文缠俺∠跃В可以使用Wireshark抓取各個協(xié)議數(shù)據(jù)包和使用Cisco Pakcket Tracer模擬網(wǎng)絡(luò)連接。
4壹士、傳輸層在網(wǎng)絡(luò)層之上磷雇,主要協(xié)議有TCP和UDP,TCP協(xié)議需要先建立連接墓卦,有分段機制倦春、滑動窗口機制(分為可用部分,已發(fā)送未確認(rèn)部分落剪,已發(fā)送部分)、流量控制尿庐、擁塞控制(發(fā)送速率慢慢增加忠怖,遇到網(wǎng)絡(luò)擁塞立即停止發(fā)送)等功能。TCP會將過大的數(shù)據(jù)包分段發(fā)送(在建立連接時會溝通MSS大谐)凡泣,這樣IP協(xié)議就不用再分片重組。使用Nagle算法會產(chǎn)生粘包現(xiàn)象(數(shù)據(jù)包太小時會與接下來到達(dá)的數(shù)據(jù)包合并為一個大的數(shù)據(jù)包發(fā)送)皮假。因為這些現(xiàn)象需要對TCP接收到數(shù)據(jù)包進行拆包和判斷是否接收完畢鞋拟,通常的做法有:固定TCP數(shù)據(jù)包長度或者將數(shù)據(jù)包分為頭部+數(shù)據(jù),頭部存儲數(shù)據(jù)包總長度*惹资,TCP是一種可靠地傳輸層協(xié)議贺纲。
UDP基本沒有對IP數(shù)據(jù)報做處理,所以可能會產(chǎn)生包順序錯亂和丟包現(xiàn)象(數(shù)據(jù)報分片發(fā)送褪测,每個數(shù)據(jù)幀選擇的路由線路可能不同就會產(chǎn)生順序錯亂猴誊,路由器緩存區(qū)滿了就會產(chǎn)生丟包現(xiàn)象)。UDP不需要合并數(shù)據(jù)段侮措,這個工作由IP協(xié)議完成懈叹,可在應(yīng)用層實現(xiàn)數(shù)據(jù)包分段,增加應(yīng)答分扎、重傳等機制實現(xiàn)可靠UDP(如KCP協(xié)議)澄成。
5、應(yīng)用層協(xié)議有很多畏吓,例如DNS域名解析墨状、FTP文件傳輸、DHCP動態(tài)主機配置庵佣、HTTP超文本傳輸?shù)惹附骸?梢允褂肧ocket實現(xiàn)自己的應(yīng)用層協(xié)議參考C#實現(xiàn)