国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解

這篇具有很好參考價(jià)值的文章主要介紹了Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本章從兩方面探討IP協(xié)議:
1.IP頭部信息。IP頭部出現(xiàn)在每個(gè)IP數(shù)據(jù)報(bào)中,用于指定IP通信的源端IP地址、目的端IP地址,指導(dǎo)IP分片和重組,指定部分通信行為。

2.IP數(shù)據(jù)報(bào)的路由和轉(zhuǎn)發(fā)。IP數(shù)據(jù)報(bào)的路由和轉(zhuǎn)發(fā)發(fā)生在除目標(biāo)機(jī)器外的所有主機(jī)和路由器上,它們決定數(shù)據(jù)報(bào)是否應(yīng)該轉(zhuǎn)發(fā)以及如何轉(zhuǎn)發(fā)。

由于32位的IPv4地址即將全部用完,因此人們開發(fā)出了新版本的IPv6協(xié)議。

IP協(xié)議為上層協(xié)議提供無狀態(tài)、無連接、不可靠的服務(wù)。

無狀態(tài)(stateless)指所有IP數(shù)據(jù)報(bào)的發(fā)送、傳輸、接收都是相互獨(dú)立、沒有上下文關(guān)系的,這種服務(wù)的缺點(diǎn)是無法處理亂序和重復(fù)的IP數(shù)據(jù)報(bào),如發(fā)送端發(fā)送出的第N個(gè)IP數(shù)據(jù)報(bào)可能比第N+1個(gè)IP數(shù)據(jù)報(bào)后到達(dá)接收端,而相同源地址和目的地址的IP數(shù)據(jù)報(bào)也可能經(jīng)過不同路徑到達(dá)接收端,也會(huì)出現(xiàn)同一個(gè)IP數(shù)據(jù)報(bào)多次到達(dá)接收端(正常情況下,同一個(gè)IP數(shù)據(jù)報(bào)不會(huì)多次到達(dá)接收端,只有在網(wǎng)絡(luò)故障的情況下才會(huì)出現(xiàn)),這樣接收端的IP模塊無法檢測到亂序和重復(fù),因?yàn)檫@些IP數(shù)據(jù)報(bào)之間沒有任何上下文關(guān)系。接收端的IP模塊只要接收到了完整的IP數(shù)據(jù)報(bào)(如果IP分片的話,IP模塊會(huì)先將其重組),就將其數(shù)據(jù)部分(如TCP報(bào)文段、UDP數(shù)據(jù)報(bào)、ICMP報(bào)文)上交給上層協(xié)議,從上層協(xié)議來看,這些數(shù)據(jù)就可能是亂序、重復(fù)的,而面向連接的上層協(xié)議,如TCP,則能自己處理亂序、重復(fù)的報(bào)文段,從而遞交給TCP的上層的內(nèi)容絕對(duì)是有序的、正確的。

IP數(shù)據(jù)報(bào)頭部提供了一個(gè)標(biāo)識(shí)字段用來唯一標(biāo)識(shí)一個(gè)IP數(shù)據(jù)報(bào),但它是用來處理IP分片和重組的,而非用來指示接收順序的。

無狀態(tài)服務(wù)的優(yōu)點(diǎn)是簡單、高效,我們無須為保持通信的狀態(tài)而分配一些內(nèi)核資源,也無須每次傳輸數(shù)據(jù)時(shí)都攜帶狀態(tài)信息。在網(wǎng)絡(luò)協(xié)議中,無狀態(tài)是很常見的,如UDP協(xié)議和HTTP協(xié)議都是無狀態(tài)協(xié)議,以HTTP協(xié)議為例,一個(gè)瀏覽器的連續(xù)兩次網(wǎng)頁請(qǐng)求之間沒有任何關(guān)聯(lián),它們被Web服務(wù)器獨(dú)立地處理。

無連接(connectionless)指IP通信雙方都不長久地維持對(duì)方的任何信息,這樣,上層協(xié)議每次發(fā)送數(shù)據(jù)的時(shí)候,都必須明確指定對(duì)方的IP地址。

不可靠指的是IP協(xié)議不保證IP數(shù)據(jù)報(bào)準(zhǔn)確地到達(dá)接收端,它只是承諾盡最大努力(best effort),很多情況都會(huì)導(dǎo)致IP數(shù)據(jù)報(bào)發(fā)送失敗,如某個(gè)中間路由器發(fā)現(xiàn)IP數(shù)據(jù)報(bào)在網(wǎng)絡(luò)上存活的時(shí)間太長(根據(jù)IP首部中的TTL字段判斷),那么該路由器將丟棄此IP數(shù)據(jù)報(bào),并返回一個(gè)ICMP錯(cuò)誤消息(超時(shí)錯(cuò)誤)給發(fā)送端;又比如接收端發(fā)現(xiàn)收到的IP數(shù)據(jù)報(bào)不正確(通過校驗(yàn)機(jī)制),接收端也會(huì)將該IP數(shù)據(jù)報(bào)丟棄,并返回一個(gè)ICMP錯(cuò)誤消息(ICMP首部參數(shù)錯(cuò)誤)給發(fā)送端。而發(fā)送端的IP模塊一旦檢測到IP數(shù)據(jù)報(bào)發(fā)送失敗,就通知上層協(xié)議發(fā)送失敗,而不會(huì)試圖重傳,因此,使用IP服務(wù)的上層協(xié)議(如TCP)需要自己實(shí)現(xiàn)數(shù)據(jù)確認(rèn)、超時(shí)重傳等機(jī)制以達(dá)到可靠傳輸?shù)哪康摹?/p>

IP首部結(jié)構(gòu)如下圖,其長度通常為20字節(jié),除非含有可變長度的選項(xiàng)部分:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
4位版本號(hào)字段指定IP協(xié)議的版本,對(duì)IPv4來說,其值為4。

4位首部長度字段標(biāo)識(shí)IP頭部長度,以4字節(jié)為單位,因此IP頭部最長為2 4 ^{4} 4*4=60字節(jié)。

8位服務(wù)類型字段(Type Of Service,TOS)包括一個(gè)3位的優(yōu)先權(quán)字段(現(xiàn)已被忽略)、4位的TOS字段和1位保留字段(必須置0)。4位的TOS字段分別為:最小延時(shí)、最大吞吐量、最高可靠性、最小費(fèi)用,其中最多只能有一位置1,應(yīng)用程序可根據(jù)實(shí)際需要來設(shè)置它,如像ssh和telnet這樣的登錄程序需要最小延時(shí)服務(wù),而ftp則需要最大吞吐量服務(wù)。而目前的IPv4使用DiffServ(Differentiated Services,區(qū)分服務(wù))和ECN(顯式擁塞通知,Explicit Congestion Notification)等更現(xiàn)代的QoS(服務(wù)質(zhì)量,Quality of Service,即對(duì)服務(wù)質(zhì)量的要求)機(jī)制所取代。

16位總長度字段指IP頭部+數(shù)據(jù)部分的整個(gè)IP數(shù)據(jù)報(bào)的長度,以字節(jié)為單位,因此IP數(shù)據(jù)報(bào)的最大長度為2 16 ^{16} 16-1=65535字節(jié)。但由于MTU的限制,長度超過MTU的數(shù)據(jù)報(bào)都將被分片傳輸,所以實(shí)際傳輸?shù)腎P數(shù)據(jù)報(bào)(或分片)的長度都遠(yuǎn)遠(yuǎn)沒有達(dá)到最大值,接下來的3個(gè)字段描述了如何實(shí)現(xiàn)分片。

16位標(biāo)識(shí)字段(identification)唯一地標(biāo)識(shí)主機(jī)發(fā)送的每個(gè)數(shù)據(jù)報(bào),其初始值由系統(tǒng)隨機(jī)生成,每發(fā)送一個(gè)數(shù)據(jù)報(bào),其值就加1,該值在數(shù)據(jù)報(bào)分片時(shí)被復(fù)制到每個(gè)分片中,因此同一個(gè)數(shù)據(jù)報(bào)的所有分片都具有相同的標(biāo)識(shí)值。

3位標(biāo)志字段的第一位保留,必須置0;第二位表示禁止分片(DF,Don’t Fragment),如果設(shè)置了此位,IP模塊將不對(duì)數(shù)據(jù)報(bào)進(jìn)行分片,此時(shí),如果IP數(shù)據(jù)報(bào)長度超過MTU,IP模塊將丟棄該數(shù)據(jù)報(bào)并返回一個(gè)ICMP差錯(cuò)報(bào)文;第三位表示更多分片(MF,More Fragment),除了數(shù)據(jù)報(bào)的最后一個(gè)分片外,其他分片都要將其置為1。

13位分片偏移字段(fragmentation offset)是分片相對(duì)分片前的IP數(shù)據(jù)報(bào)的數(shù)據(jù)部分開始處的偏移,以8字節(jié)為單位,原因?yàn)樵撟侄沃挥?3位,而整個(gè)IP數(shù)據(jù)報(bào)長度字段有16位,因此需要以8字節(jié)為單位偏移值才能覆蓋整個(gè)IP數(shù)據(jù)報(bào),因此,除了最后一個(gè)IP分片外,每個(gè)IP分片的數(shù)據(jù)部分的長度必須是8字節(jié)的整數(shù)倍。

8位生存時(shí)間字段(TTL,Time To Live)是數(shù)據(jù)報(bào)到達(dá)目的地前允許經(jīng)過的路由器最大跳數(shù),TTL值被發(fā)送端設(shè)置(常見的值是64或128),數(shù)據(jù)報(bào)在轉(zhuǎn)發(fā)過程中每經(jīng)過一個(gè)路由,該值就被路由器減1,當(dāng)TTL值減為0時(shí),路由器將丟棄數(shù)據(jù)報(bào),并向源端發(fā)送一個(gè)ICMP差錯(cuò)報(bào)文。TTL值可防止數(shù)據(jù)報(bào)陷入路由循環(huán)。

8位協(xié)議字段(protocol)用來區(qū)分上層協(xié)議,/etc/protocols文件定義了所有上層協(xié)議對(duì)應(yīng)的protocol字段的值,其中,ICMP是1,TCP是6,UDP是17。RFC 1700中規(guī)定了協(xié)議號(hào)的分配,/etc/protocols文件中的內(nèi)容一般是RFC 1700中規(guī)定的協(xié)議號(hào)分配的子集。

16位頭部校驗(yàn)和字段(header checksum)由發(fā)送端填充,接收端對(duì)其進(jìn)行檢驗(yàn)(僅檢驗(yàn)頭部)以確定IP頭部是否在傳輸過程中被損壞。

32位源端IP地址和目的端IP地址用來標(biāo)識(shí)發(fā)送端和接收端,一般,這兩個(gè)地址在整個(gè)數(shù)據(jù)報(bào)的傳遞過程中保持不變,而無論它經(jīng)過了多少中間路由器。

選項(xiàng)字段是可變長的可選信息,最多包含40字節(jié),因?yàn)镮P頭部最長為60字節(jié),減去前面固定部分20字節(jié)。部分IP選項(xiàng):
1.記錄路由(record route)選項(xiàng):告訴該數(shù)據(jù)報(bào)途徑的所有路由器都將自己的IP地址填入IP頭部的選項(xiàng)部分,這樣我們就可以跟蹤數(shù)據(jù)報(bào)的傳遞路徑。

2.時(shí)間戳(timestamp)選項(xiàng):告訴每個(gè)路由器將數(shù)據(jù)報(bào)被轉(zhuǎn)發(fā)的時(shí)間填入IP頭部的選項(xiàng)部分,這樣就可測量途徑的路由之間的數(shù)據(jù)報(bào)傳輸?shù)臅r(shí)間。

3.松散源路由選擇(loose source routing)選項(xiàng):指定一個(gè)路由器IP列表,數(shù)據(jù)報(bào)發(fā)送過程中必須經(jīng)過其中所有路由器。

4.嚴(yán)格源路由選擇(strict source routing)選項(xiàng):類似松散源路由選擇,但數(shù)據(jù)報(bào)只能經(jīng)過被指定的路由器。

其他IP頭部選項(xiàng)可參考RFC 791,但其他選項(xiàng)很少被使用,使用松散源路由選擇和嚴(yán)格源路由選擇的例子可能只有traceroute程序。作為記錄路由選項(xiàng)的替代品,traceroute程序使用UDP和ICMP實(shí)現(xiàn)了更可靠的記錄路由功能,可參考RFC 1393。

我們?cè)趀rnest-laptop上執(zhí)行telnet命令登錄該主機(jī)本身,并用tcpdump抓取此過程中telnet客戶和telnet服務(wù)器之間交換的數(shù)據(jù)包,具體操作如下:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
tcpdump輸出的第一個(gè)數(shù)據(jù)包:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
該數(shù)據(jù)包描述的是一個(gè)IP數(shù)據(jù)報(bào),由于我們是使用telnet登錄本機(jī)的,所以IP數(shù)據(jù)報(bào)的源IP地址和目的端IP地址都是127.0.0.1。telnet服務(wù)器使用端口號(hào)23(參見/etc/services文件),而telnet客戶使用臨時(shí)端口號(hào)41621與服務(wù)器通信。Flags、seq、win、option描述的都是TCP頭部信息。length指出該IP數(shù)據(jù)報(bào)所攜帶的應(yīng)用程序數(shù)據(jù)的長度為0。

本次抓包我們開啟了tcpdump的-x選項(xiàng),使其輸出數(shù)據(jù)包的二進(jìn)制碼,此數(shù)據(jù)包共含60字節(jié),其中前20字節(jié)是IP首部,后40字節(jié)是TCP首部,不包含應(yīng)用程序數(shù)據(jù)。以下是IP頭部中的每個(gè)字節(jié)含義:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
上表中第二列的空格子表示我們不關(guān)心相應(yīng)字段的十進(jìn)制值。由上表可見,telnet服務(wù)選擇具有最小延時(shí)的服務(wù),且默認(rèn)使用的傳輸層協(xié)議是TCP協(xié)議。這個(gè)IP數(shù)據(jù)報(bào)沒有被分片,且沒有攜帶任何應(yīng)用程序數(shù)據(jù)。

當(dāng)IP數(shù)據(jù)報(bào)的長度超過幀的MTU時(shí),它將被分片傳輸,分片可能發(fā)生在發(fā)送端,也可能發(fā)生在中轉(zhuǎn)路由器上,且在傳輸過程中可能被多次分片,但只有在最終的目標(biāo)機(jī)器上,這些分片才會(huì)被內(nèi)核中的IP模塊重新組裝。

IP頭部的以下三個(gè)字段為IP的分片和重組提供了足夠的信息:數(shù)據(jù)報(bào)標(biāo)識(shí)、標(biāo)志、片偏移。一個(gè)IP數(shù)據(jù)報(bào)的每個(gè)分片都有自己的IP頭部,它們具有相同的標(biāo)識(shí)值,但片偏移不同,且除了最后一個(gè)分片外,其他分片都將設(shè)置MF標(biāo)志。此外,每個(gè)分片的IP頭部的總長度字段都被設(shè)置為該分片的長度。

以太網(wǎng)幀的MTU是1500字節(jié),可通過ifconfig命令查看:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
以太網(wǎng)MTU為1500字節(jié),它指定的是可以在單個(gè)幀中傳輸?shù)淖畲髷?shù)據(jù)量,不包括幀頭和幀尾,因此一個(gè)以太網(wǎng)幀可以攜帶的IP數(shù)據(jù)報(bào)的最大長度為1500字節(jié),減去20字節(jié)的IP固定首部長度,得到IP數(shù)據(jù)報(bào)的數(shù)據(jù)部分最多是1480字節(jié)。我們用IP數(shù)據(jù)報(bào)封裝一個(gè)長度為1481字節(jié)的ICMP報(bào)文(包括8字節(jié)ICMP頭部和1473字節(jié)數(shù)據(jù)部分),該IP數(shù)據(jù)報(bào)在使用以太網(wǎng)幀傳輸時(shí)必須被分片,如下圖所示:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
上圖中,長為1501字節(jié)的IP數(shù)據(jù)報(bào)被拆分成兩個(gè)IP分片,第一個(gè)IP分片長度為1500字節(jié),第二個(gè)IP分片長度為21字節(jié),每個(gè)IP分片都包含自己的IP頭部(20字節(jié)),且第一個(gè)IP分片的IP首部設(shè)置了MF標(biāo)志,而第二個(gè)IP分片的IP首部沒有設(shè)置該標(biāo)志,因?yàn)樗呀?jīng)是第二個(gè)分片了。原始IP數(shù)據(jù)報(bào)中的ICMP頭部內(nèi)容被完整地復(fù)制到了第一個(gè)IP分片中,第二個(gè)IP分片不包含ICMP頭部信息,因?yàn)镮P模塊重組該ICMP報(bào)文的時(shí)候只需要一份ICMP頭部信息,重復(fù)傳送這個(gè)信息沒有用處。1473字節(jié)的ICMP報(bào)文數(shù)據(jù)的前1472字節(jié)被IP模塊復(fù)制到第一個(gè)IP分片中,使其總長度為1500字節(jié),從而滿足MTU的要求,而多出的最后1個(gè)字節(jié)被復(fù)制到第二個(gè)IP分片中。

ICMP報(bào)文的頭部長度取決于報(bào)文的類型,變化范圍很大,上圖中以8字節(jié)為例,ping程序使用的ICMP回顯和應(yīng)答報(bào)文的頭部長度是8字節(jié)的。

我們?cè)趀rnest-laptop上ping Kongming20,每次傳送1473字節(jié)的數(shù)據(jù)(即ICMP報(bào)文的數(shù)據(jù)部分長1473字節(jié))以強(qiáng)制引起IP分片,并用tcpdump抓取這一過程雙方交換的數(shù)據(jù)包,具體操作如下(tcpdump的-n選項(xiàng)表示顯示數(shù)值形式的IP地址和端口號(hào),-v選項(xiàng)顯示更詳細(xì)的輸出):
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
tcpdump會(huì)輸出一個(gè)IP數(shù)據(jù)報(bào)的兩個(gè)分片,其內(nèi)容如下:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
這兩個(gè)IP分片的標(biāo)識(shí)值都是61197,說明它們是同一個(gè)IP數(shù)據(jù)報(bào)的分片。第一個(gè)分片的片偏移為0,而第二個(gè)是1480,顯然,第二個(gè)分片的片偏移值實(shí)際也是第一個(gè)分片的ICMP報(bào)文長度?!癴lags [+]”表示第一個(gè)分片設(shè)置了MF標(biāo)志,因?yàn)樗竺孢€有分片,而第二個(gè)分片沒有設(shè)置任何標(biāo)志,因此tcpdump輸出“flags [none]”。這兩個(gè)分片的長度分別是1500字節(jié)和21字節(jié),與圖2-2中描述的一致。

IP層傳遞給數(shù)據(jù)鏈路層的數(shù)據(jù)可能是一個(gè)完整的IP數(shù)據(jù)報(bào),也可能是一個(gè)IP分片,它們統(tǒng)稱為IP分組。

IP協(xié)議會(huì)決定數(shù)據(jù)報(bào)到目標(biāo)機(jī)器的路徑,即數(shù)據(jù)報(bào)的路由。

IP模塊的基本工作流程:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
從右往左分析上圖,當(dāng)IP模塊收到來自數(shù)據(jù)鏈路層的IP數(shù)據(jù)報(bào)時(shí),它首先對(duì)該數(shù)據(jù)報(bào)的頭作校驗(yàn),確認(rèn)無誤后就分析其頭部的信息。

如果該IP數(shù)據(jù)報(bào)的頭部設(shè)置了源站選路選項(xiàng)(松散源路由選擇或嚴(yán)格源路由選擇),則IP模塊調(diào)用數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)子模塊來處理該數(shù)據(jù)報(bào),這是因?yàn)榻?jīng)過某個(gè)源路由后,該路由地址會(huì)從選項(xiàng)中被刪除,從而到達(dá)目標(biāo)機(jī)器時(shí)源站選路選項(xiàng)已為空。如果該IP數(shù)據(jù)報(bào)的頭部中目標(biāo)IP地址是本機(jī)的某個(gè)IP地址,或是廣播地址,則該數(shù)據(jù)報(bào)是發(fā)送給本機(jī)的,則IP模塊就根據(jù)數(shù)據(jù)報(bào)頭部中的協(xié)議字段決定將它派發(fā)給哪個(gè)上層應(yīng)用(分用);如果IP模塊發(fā)現(xiàn)這個(gè)數(shù)據(jù)報(bào)不是發(fā)送給本機(jī)的,則也調(diào)用數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)子模塊來處理該數(shù)據(jù)報(bào)。

數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)子模塊首先檢測系統(tǒng)是否允許轉(zhuǎn)發(fā),如果不允許,IP模塊就將數(shù)據(jù)報(bào)丟棄,如果允許,數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)子模塊將對(duì)該數(shù)據(jù)報(bào)執(zhí)行一些操作,然后將它交給IP數(shù)據(jù)報(bào)輸出子模塊。

IP數(shù)據(jù)報(bào)應(yīng)發(fā)送至哪個(gè)下一跳路由(或目標(biāo)機(jī)器),以及經(jīng)過哪個(gè)網(wǎng)卡來發(fā)送,就是IP路由過程,即上圖中“計(jì)算下一跳路由”子模塊。IP模塊實(shí)現(xiàn)數(shù)據(jù)報(bào)路由的核心數(shù)據(jù)結(jié)構(gòu)是路由表,這個(gè)表按照數(shù)據(jù)報(bào)的目標(biāo)IP地址分類,同一類型的IP數(shù)據(jù)報(bào)將被發(fā)往相同的下一條路由器(或目標(biāo)機(jī)器)。

IP輸出隊(duì)列中存放的是所有等待發(fā)送的IP數(shù)據(jù)報(bào),其中除了需要轉(zhuǎn)發(fā)的IP數(shù)據(jù)報(bào)外,還包括封裝了本機(jī)上層數(shù)據(jù)(如ICMP報(bào)文、TCP報(bào)文段、UDP數(shù)據(jù)報(bào))的IP數(shù)據(jù)報(bào)。

上圖中的虛線箭頭顯示了路由表更新的過程,此過程通過路由協(xié)議或route命令調(diào)整路由表,使其更適應(yīng)最新的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。

可用route命令查看路由表,在ernest-laptop上執(zhí)行route命令:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
每項(xiàng)包含8個(gè)字段,如下表所示:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
代碼清單2-2所示的路由表中,第一項(xiàng)的目標(biāo)地址是default,即默認(rèn)路由項(xiàng),該項(xiàng)包含一個(gè)G標(biāo)志,說明路由的下一跳是網(wǎng)關(guān),網(wǎng)關(guān)地址為192.168.1.1(這是此網(wǎng)絡(luò)中路由器的本地IP地址)。另一個(gè)路由項(xiàng)的目標(biāo)地址是192.168.1.0,它指的是本地局域網(wǎng)(主機(jī)號(hào)全0的地址為網(wǎng)絡(luò)地址,它不會(huì)分配給實(shí)際主機(jī),因?yàn)榇说刂吠ǔ1硎菊麄€(gè)網(wǎng)絡(luò)),該路由項(xiàng)的網(wǎng)關(guān)地址為*,說明數(shù)據(jù)報(bào)不需路由器中轉(zhuǎn),可直接發(fā)送到目標(biāo)機(jī)器。

給定一個(gè)IP,在路由表中的匹配過程:
1.查找路由表中和給定IP完全匹配的主機(jī)IP地址,如果找到,就使用該路由項(xiàng),否則轉(zhuǎn)步驟2。

2.查找路由表中和數(shù)據(jù)報(bào)的目標(biāo)IP地址具有相同網(wǎng)絡(luò)ID的IP地址,如果找到,就使用該路由項(xiàng),否則轉(zhuǎn)步驟3。

3.選擇默認(rèn)路由項(xiàng),通常意味著數(shù)據(jù)報(bào)的下一跳路由是網(wǎng)關(guān)。

因此,對(duì)于ernest-laptop機(jī)器而言,所有發(fā)送到IP地址為192.168.1.*的IP數(shù)據(jù)報(bào)都可直接發(fā)送到目標(biāo)機(jī)器(匹配路由表第二項(xiàng)),而所有訪問因特網(wǎng)的請(qǐng)求都將通過網(wǎng)關(guān)來轉(zhuǎn)發(fā)(匹配默認(rèn)路由項(xiàng))。

路由表必須能更新,以反映網(wǎng)絡(luò)連接的變化,這樣IP模塊才能準(zhǔn)確、高效地轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)。route命令可修改路由表,以下操作在ernest-laptop上執(zhí)行:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
第一行表示添加主機(jī)192.168.1.109(Kongming20機(jī)器)對(duì)應(yīng)的路由項(xiàng),這樣設(shè)置后,所有從ernest-laptop發(fā)送到Kongming20的IP數(shù)據(jù)報(bào)將通過網(wǎng)卡eth0直接發(fā)送至目標(biāo)機(jī)器的接收網(wǎng)卡。第二行表示刪除網(wǎng)絡(luò)192.168.1.0對(duì)應(yīng)的路由項(xiàng),這樣,除了Kongming20外,ernest-laptop將無法訪問該局域網(wǎng)上的任何其他機(jī)器(能訪問到Kongming20是由于執(zhí)行了第一行命令)。第三行表示刪除默認(rèn)路由項(xiàng),這樣做的后果是無法訪問因特網(wǎng)。第四行表示重新設(shè)置默認(rèn)路由項(xiàng),但這次其網(wǎng)關(guān)是Kongming20,而非能直接訪問因特網(wǎng)的路由器。經(jīng)過以上操作后的路由表:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
第一行路由項(xiàng)是主機(jī)路由項(xiàng),因?yàn)樗辉O(shè)置了H標(biāo)志,我們?cè)O(shè)計(jì)這樣的路由表的目的是為后文討論ICMP重定向提供環(huán)境。

通過route命令或其他工具手工修改路由表是靜態(tài)的路由更新方式,對(duì)于大型路由器,它們通常通過BGP(Border Gateway Protocol,邊際網(wǎng)關(guān)協(xié)議)、RIP(Routing Information Protocol,路由信息協(xié)議)、OSPF等協(xié)議來發(fā)現(xiàn)路徑,并更新自己的路由表,這種更新方式是動(dòng)態(tài)的,自動(dòng)的。

不是發(fā)給本機(jī)的IP數(shù)據(jù)報(bào)將由數(shù)據(jù)包轉(zhuǎn)發(fā)子模塊處理,路由器都能執(zhí)行數(shù)據(jù)報(bào)的轉(zhuǎn)發(fā)操作,而主機(jī)一般只發(fā)送和接收數(shù)據(jù)報(bào),因?yàn)橹鳈C(jī)上/proc/sys/net/ipv4/ip_forward內(nèi)核參數(shù)默認(rèn)被設(shè)置為0,我們可通過修改此參數(shù)開啟主機(jī)的數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)功能,我們?cè)贙ongming20上以root身份執(zhí)行:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
允許IP數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)的系統(tǒng)(主機(jī)或路由器)的數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)子模塊會(huì)對(duì)要轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)做以下操作:
1.檢查數(shù)據(jù)報(bào)頭部的TTL值,如果該值已經(jīng)為0,則丟棄該數(shù)據(jù)報(bào)。

2.查看數(shù)據(jù)報(bào)頭部的嚴(yán)格源路由選項(xiàng)是否設(shè)置,如果設(shè)置,則檢測數(shù)據(jù)報(bào)的目標(biāo)IP地址是否是本機(jī)的某個(gè)IP,如果不是,則發(fā)送一個(gè)ICMP源站選路失敗報(bào)文給發(fā)送端。

3.如果有必要,給源端發(fā)送一個(gè)ICMP重定向報(bào)文,以告訴它一個(gè)更合理的下一跳。

4.將TTL值減1。

5.處理IP頭部選項(xiàng)。

6.如果有必要,執(zhí)行IP分片操作。

ICMP重定向報(bào)文也能用于更新路由表,其報(bào)文格式為:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
ICMP報(bào)文頭部有3個(gè)固定的字段:8位類型、8位代碼、16位校驗(yàn)和。ICMP重定向報(bào)文的類型值為5,代碼字段有4個(gè)可選值,用來區(qū)分不同的重定向類型,我們僅討論主機(jī)重定向,其代碼值為1。

ICMP重定向報(bào)文數(shù)據(jù)部分給接收方提供以下信息:
1.引起重定向的IP數(shù)據(jù)報(bào)的源端和目的端IP地址。

2.應(yīng)使用的路由器的IP地址。

接收主機(jī)根據(jù)這兩條信息獲知引起重定向的IP數(shù)據(jù)報(bào)應(yīng)使用哪個(gè)路由器來轉(zhuǎn)發(fā),并由此更新路由表(通常是路由表緩沖,而不是直接修改路由表)。

/proc/sys/net/ipv4/conf/all/send_redirects內(nèi)核參數(shù)指定是否允許發(fā)送ICMP重定向報(bào)文,而/proc/sys/net/ipv4/conf/all/accept_redirects內(nèi)核參數(shù)指定是否允許接收ICMP重定向報(bào)文。一般主機(jī)只能接收ICMP重定向報(bào)文,而路由器只能發(fā)送ICMP重定向報(bào)文。

上文中,我們把ernest-laptop機(jī)器的網(wǎng)關(guān)設(shè)置成了機(jī)器Kongming20,然后又打開了Kongming20的數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)功能,因此機(jī)器ernest-laptop將通過Kongming20訪問因特網(wǎng),如果我們?cè)趀rnest-laptop上執(zhí)行ping命令:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
從ping命令的輸出看,Kongming20給ernest-laptop發(fā)送了一個(gè)ICMP重定向報(bào)文,告訴ernest-laptop使其通過192.1681.1(路由器)來訪問目標(biāo)機(jī)器,因?yàn)檫@對(duì)ernest-laptop來說是更合理的路由方式。當(dāng)主機(jī)ernest-laptop收到此ICMP重定向報(bào)文后,它將更新其路由表緩沖(可用命令route -Cn查看,-C選項(xiàng)表示操作的是路由表緩沖),并使用新的路由方式發(fā)送后續(xù)數(shù)據(jù)報(bào),重定向過程為:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
IPv6是網(wǎng)絡(luò)層技術(shù)的發(fā)現(xiàn)趨勢,它不僅解決了IPv4地址不夠用的問題,還做了很大改進(jìn),如增加了多播和流功能,為網(wǎng)絡(luò)上多媒體內(nèi)容的質(zhì)量提供精細(xì)的控制;引入了自動(dòng)配置功能,使局域網(wǎng)管理更方便;增加了專門的網(wǎng)絡(luò)安全功能等。IPv6的細(xì)節(jié)可參考RFC 2460。

IPv6由40字節(jié)的固定頭部和可變長的擴(kuò)展頭部組成,以下是IPv6的固定頭部:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
4位版本號(hào)指定IP協(xié)議版本,對(duì)IPv6來說,其值為6。

8位通信類型指示數(shù)據(jù)流通信類型或優(yōu)先級(jí),與IPv4中的TOS類似。

20位流標(biāo)簽用于某些對(duì)連接的服務(wù)質(zhì)量有特殊要求的通信,如音頻或視頻等實(shí)時(shí)數(shù)據(jù)傳輸,可通過流標(biāo)簽為這些流量提供差異化的服務(wù)質(zhì)量(如低延遲、高帶寬)。

16位凈荷長度指的是IPv6擴(kuò)展頭部和應(yīng)用程序數(shù)據(jù)之和,不包括固定頭部長度。

8位下一個(gè)包頭指出緊跟IPv6固定頭部后的包頭類型,如擴(kuò)展頭(如果有的話)或某個(gè)上層協(xié)議頭(如TCP、UDP、ICMP),它類似IPv4頭部中的協(xié)議字段,且與IPv4頭部中的協(xié)議字段相同的取值有相同的含義。

8位跳數(shù)限制和IPv4中的TTL含義相同。

IPv6用128位(16字節(jié))表示IP地址,使得IP地址的總量達(dá)到了2 128 ^{128} 128個(gè),因此有人說,“IPv6使得地球上的每粒沙子都有一個(gè)IP地址”。

32位IPv4地址一般用點(diǎn)分十進(jìn)制表示,而IPv6地址用十六進(jìn)制字符串表示,如FE80:0000:0000:0000:1234:5678:0000:0012,可見IPv6地址被:分割為8組,每組2字節(jié),IPv6還可使用零壓縮法將其簡寫,即省略連續(xù)的、全0的組,本例用零壓縮法可表示為FE80::1234:5678:0000:0012,但零壓縮法對(duì)一個(gè)IPv6地址只能用一次,如本例中字節(jié)組5678后面的全零組不能再省略,否則我們將無法計(jì)算每個(gè)::之間省略了多少個(gè)全零組。

可變長的擴(kuò)展頭部使IPv6能支持更多選項(xiàng),便于將來的擴(kuò)展需要,它的長度可以是0,表示沒有使用擴(kuò)展頭部。一個(gè)數(shù)據(jù)報(bào)可以包含多個(gè)擴(kuò)展頭部,每個(gè)擴(kuò)展頭部的類型由前一個(gè)頭部(固定頭部或擴(kuò)展頭部)中的下一個(gè)報(bào)頭字段指定,一些可用的擴(kuò)展頭部如下表:
Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解,Linux高性能服務(wù)器編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)
IPv6協(xié)議不是IPv4協(xié)議的簡單擴(kuò)展,而是完全獨(dú)立的協(xié)議,用以太網(wǎng)幀封裝的IPv6數(shù)據(jù)報(bào)和IPv4數(shù)據(jù)報(bào)具有不同類型字段值,IPv4的是0x800,而IPv6是0x86dd。文章來源地址http://www.zghlxwxcb.cn/news/detail-707482.html

到了這里,關(guān)于Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux高性能服務(wù)器編程——學(xué)習(xí)筆記①

    Linux高性能服務(wù)器編程——學(xué)習(xí)筆記①

    第一章有一些概念講的很好,值得好好關(guān)注一下?。?! 1.1 主要的協(xié)議 1.1.1 數(shù)據(jù)鏈路層 ? 數(shù)據(jù)鏈路層實(shí)現(xiàn)了網(wǎng)卡接口的網(wǎng)絡(luò)驅(qū)動(dòng)程序,以處理數(shù)據(jù)在物理媒介(以太網(wǎng)、令牌環(huán))上的傳輸。 ? 常用的協(xié)議有兩種: ARP協(xié)議(Address Resolve Protocol,地址解析協(xié)議) RARP(Reverse

    2024年01月20日
    瀏覽(33)
  • Linux高性能服務(wù)器編程——ch10筆記

    信號(hào)是由用戶、系統(tǒng)或者進(jìn)程發(fā)送給目標(biāo)進(jìn)程的信息,以通知目標(biāo)進(jìn)程某個(gè)狀態(tài)的改變或系統(tǒng)異常。 :::tips int kill(pid_t pid, int sig); ::: kill函數(shù):一個(gè)進(jìn)程給其他進(jìn)程發(fā)送信號(hào)的API。 sig一般大于0,如果設(shè)為0則表示不發(fā)送信號(hào),可以用來檢測進(jìn)程或進(jìn)程組是否存在。由于進(jìn)程P

    2024年02月06日
    瀏覽(24)
  • Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第五章 Linux網(wǎng)絡(luò)編程基礎(chǔ)API

    Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第五章 Linux網(wǎng)絡(luò)編程基礎(chǔ)API

    我們將從以下3方面討論Linux網(wǎng)絡(luò)API: 1.socket地址API。socket最開始的含義是一個(gè)IP地址和端口對(duì)(ip,port),它唯一表示了使用TCP通信的一端,本書稱其為socket地址。 2.socket基礎(chǔ)API。socket的主要API都定義在sys/socket.h頭文件中,包括創(chuàng)建socket、命名socket、監(jiān)聽socket、接受連接、發(fā)

    2024年02月07日
    瀏覽(40)
  • Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解

    Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第二章 IP協(xié)議詳解

    本章從兩方面探討IP協(xié)議: 1.IP頭部信息。IP頭部出現(xiàn)在每個(gè)IP數(shù)據(jù)報(bào)中,用于指定IP通信的源端IP地址、目的端IP地址,指導(dǎo)IP分片和重組,指定部分通信行為。 2.IP數(shù)據(jù)報(bào)的路由和轉(zhuǎn)發(fā)。IP數(shù)據(jù)報(bào)的路由和轉(zhuǎn)發(fā)發(fā)生在除目標(biāo)機(jī)器外的所有主機(jī)和路由器上,它們決定數(shù)據(jù)報(bào)是否應(yīng)

    2024年02月09日
    瀏覽(30)
  • 【linux高性能服務(wù)器編程】項(xiàng)目實(shí)戰(zhàn)——仿QQ聊天程序源碼剖析

    【linux高性能服務(wù)器編程】項(xiàng)目實(shí)戰(zhàn)——仿QQ聊天程序源碼剖析

    hello !大家好呀! 歡迎大家來到我的Linux高性能服務(wù)器編程系列之項(xiàng)目實(shí)戰(zhàn)——仿QQ聊天程序源碼剖析,在這篇文章中, 你將會(huì)學(xué)習(xí)到如何利用Linux網(wǎng)絡(luò)編程技術(shù)來實(shí)現(xiàn)一個(gè)簡單的聊天程序,并且我會(huì)給出源碼進(jìn)行剖析,以及手繪UML圖來幫助大家來理解,希望能讓大家更能了

    2024年04月28日
    瀏覽(33)
  • Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第一章 TCP/IP協(xié)議族

    Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第一章 TCP/IP協(xié)議族

    現(xiàn)在Internet使用的主流協(xié)議族是TCP/IP協(xié)議族,它是一個(gè)分層、多協(xié)議的通信體系。 TCP/IP協(xié)議族包含眾多協(xié)議,我們只詳細(xì)討論IP協(xié)議和TCP協(xié)議,因?yàn)樗鼈儗?duì)編寫網(wǎng)絡(luò)應(yīng)用程序有最直接的影響。如果想系統(tǒng)學(xué)習(xí)網(wǎng)絡(luò)協(xié)議,RFC(Request For Comments,評(píng)論請(qǐng)求)是首選資料。 TCP/IP協(xié)議

    2024年02月09日
    瀏覽(37)
  • Linux高性能服務(wù)器編程|閱讀筆記:第6章 - 高級(jí)I/O函數(shù)

    Linux高性能服務(wù)器編程|閱讀筆記:第6章 - 高級(jí)I/O函數(shù)

    Hello! 非常感謝您閱讀海轟的文章,倘若文中有錯(cuò)誤的地方,歡迎您指出~ ? ?(?ˊ?ˋ)? 昵稱:海轟 標(biāo)簽:程序猿

    2024年02月03日
    瀏覽(20)
  • Linux高性能服務(wù)器編程|閱讀筆記:第1章 - TCP/IP協(xié)議族

    Linux高性能服務(wù)器編程|閱讀筆記:第1章 - TCP/IP協(xié)議族

    Hello! 非常感謝您閱讀海轟的文章,倘若文中有錯(cuò)誤的地方,歡迎您指出~ ? ?(?ˊ?ˋ)? 昵稱:海轟 標(biāo)簽:程序猿|C++選手|學(xué)生 簡介:因C語言結(jié)識(shí)編程,隨后轉(zhuǎn)入計(jì)算機(jī)專業(yè),獲得過國家獎(jiǎng)學(xué)金,有幸在競賽中拿過一些國獎(jiǎng)、省獎(jiǎng)…已保研 學(xué)習(xí)經(jīng)驗(yàn):扎實(shí)基礎(chǔ) + 多做

    2024年02月01日
    瀏覽(41)
  • 強(qiáng)推Linux高性能服務(wù)器編程, 真的是后端開發(fā)技術(shù)提升, 沉淀自身不容錯(cuò)過的一本經(jīng)典書籍

    強(qiáng)推Linux高性能服務(wù)器編程, 真的是后端開發(fā)技術(shù)提升, 沉淀自身不容錯(cuò)過的一本經(jīng)典書籍

    目錄 第1章 TCP/IP協(xié)議 1.1 TCP/IP協(xié)議族體系結(jié)構(gòu)以及主要協(xié)議 1.1.1 數(shù)據(jù)鏈路層 1.1.2 網(wǎng)絡(luò)層 1.1.3 傳輸層 1.1.4 應(yīng)用層 1.2 封裝 1.3 分用 1.5 ARP協(xié)議工作原理 1.5.1 以太網(wǎng)ARP請(qǐng)求/應(yīng)答報(bào)文詳解 1.5.2 ARP高速緩存的查看和修改 1.5.3 使用tcpdump觀察ARP通信過程所得結(jié)果如下 本篇核心關(guān)鍵所在

    2024年02月07日
    瀏覽(100)
  • 【網(wǎng)絡(luò)編程】高性能并發(fā)服務(wù)器源碼剖析

    【網(wǎng)絡(luò)編程】高性能并發(fā)服務(wù)器源碼剖析

    ? hello !大家好呀! 歡迎大家來到我的網(wǎng)絡(luò)編程系列之洪水網(wǎng)絡(luò)攻擊,在這篇文章中, 你將會(huì)學(xué)習(xí)到在網(wǎng)絡(luò)編程中如何搭建一個(gè)高性能的并發(fā)服務(wù)器,并且我會(huì)給出源碼進(jìn)行剖析,以及手繪UML圖來幫助大家來理解,希望能讓大家更能了解網(wǎng)絡(luò)編程技術(shù)!?。?希望這篇文章能

    2024年04月15日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包