基于Linux的集群系统(八)--转
引用位置:http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part8/index.html
OSI參考模型及TCP/IP參考模型
OSI模型(open system interconnection reference model)是基于國際標(biāo)準(zhǔn)化組織(ISO)的建議而發(fā)展起來的,它分為如圖3-1所示的七層。當(dāng)衛(wèi)星和無線網(wǎng)絡(luò)出現(xiàn)以后,現(xiàn)有的協(xié)議在和這些網(wǎng)絡(luò)互聯(lián)時(shí)出現(xiàn)了問題,所以需要一種新的參考體系結(jié)構(gòu),能無縫地連接多個(gè)網(wǎng)絡(luò)。這個(gè)體系結(jié)構(gòu)就是TCP/IP參考模型。
TCP 協(xié)議
因特網(wǎng)在傳輸層有兩種主要的協(xié)議:一種是面向連接的協(xié)議,一種是無連接的協(xié)議。傳輸控制協(xié)議TCP是(transmission control protocol)專門用于在不可靠的因特網(wǎng)上提供可靠的、端對(duì)端的字節(jié)流通信的協(xié)議。通過在發(fā)送方和接收方分別創(chuàng)建一個(gè)稱為套接字的通信端口就可以獲得TCP服務(wù)。所有的TCP 連接均是全雙工的和點(diǎn)到點(diǎn)的。
發(fā)送和接收方TCP實(shí)體以數(shù)據(jù)報(bào)的形式交換數(shù)據(jù)。一個(gè)數(shù)據(jù)報(bào)包含一個(gè)固定的20字節(jié)的頭、一個(gè)可選部分以及0或多字節(jié)的數(shù)據(jù)。對(duì)數(shù)據(jù)報(bào)的大小有兩個(gè)限制條件:首先,每個(gè)數(shù)據(jù)報(bào)(包括TCP頭在內(nèi))必須適合IP的載荷能力,不能超過65535字節(jié);其次,每個(gè)網(wǎng)絡(luò)都存在最大傳輸單元MTU(maximum transfer unit),要求每個(gè)數(shù)據(jù)報(bào)必須適合MTU。如果一個(gè)數(shù)據(jù)報(bào)進(jìn)入了一個(gè)MTU小于該數(shù)據(jù)報(bào)長(zhǎng)度的網(wǎng)絡(luò),那么處于網(wǎng)絡(luò)邊界上的路由器會(huì)把該數(shù)據(jù)報(bào)分解為多個(gè)小的數(shù)據(jù)報(bào)。
TCP實(shí)體所采用的基本協(xié)議是滑動(dòng)窗口協(xié)議。當(dāng)發(fā)送方傳送一個(gè)數(shù)據(jù)報(bào)時(shí),它將啟動(dòng)計(jì)時(shí)器。當(dāng)該數(shù)據(jù)報(bào)到達(dá)目的地后,接收方的TCP實(shí)體向回發(fā)送一個(gè)數(shù)據(jù)報(bào),其中包含有一個(gè)確認(rèn)序號(hào),它等于希望收到的下一個(gè)數(shù)據(jù)報(bào)的順序號(hào)。如果發(fā)送方的定時(shí)器在確認(rèn)信息到達(dá)之前超時(shí),那么發(fā)送方會(huì)重發(fā)該數(shù)據(jù)報(bào)。
2.1 TCP數(shù)據(jù)報(bào)頭
圖3-2給出了TCP數(shù)據(jù)報(bào)頭的格式。
源端口、目的端口:16位長(zhǎng)。標(biāo)識(shí)出遠(yuǎn)端和本地的端口號(hào)。
順序號(hào):32位長(zhǎng)。表明了發(fā)送的數(shù)據(jù)報(bào)的順序。
確認(rèn)號(hào):32位長(zhǎng)。希望收到的下一個(gè)數(shù)據(jù)報(bào)的序列號(hào)。
TCP頭長(zhǎng):4位長(zhǎng)。表明TCP頭中包含多少個(gè)32位字。
接下來的6位未用。?
ACK:ACK位置1表明確認(rèn)號(hào)是合法的。如果ACK為0,那么數(shù)據(jù)報(bào)不包含確認(rèn)信息,確認(rèn)字段被省略。
PSH:表示是帶有PUSH標(biāo)志的數(shù)據(jù)。接收方因此請(qǐng)求數(shù)據(jù)報(bào)一到便可送往應(yīng)用程序而不必等到緩沖區(qū)裝滿時(shí)才傳送。
RST:用于復(fù)位由于主機(jī)崩潰或其它原因而出現(xiàn)的錯(cuò)誤的連接。還可以用于拒絕非法的數(shù)據(jù)報(bào)或拒絕連接請(qǐng)求。
SYN:用于建立連接。
FIN:用于釋放連接。
窗口大小:16位長(zhǎng)。窗口大小字段表示在確認(rèn)了字節(jié)之后還可以發(fā)送多少個(gè)字節(jié)。
校驗(yàn)和:16位長(zhǎng)。是為了確保高可靠性而設(shè)置的。它校驗(yàn)頭部、數(shù)據(jù)和偽TCP頭部之和。
可選項(xiàng):0個(gè)或多個(gè)32位字。包括最大TCP載荷,窗口比例、選擇重發(fā)數(shù)據(jù)報(bào)等選項(xiàng)。
2.2 連接管理
在TCP中建立連接采用三次握手的方法。為了建立連接,其中一方,如服務(wù)器,通過執(zhí)行LISTEN和ACCEPT原語被動(dòng)地等待一個(gè)到達(dá)的連接請(qǐng)求。
另一方,如客戶方,執(zhí)行CONNECT原語,同時(shí)要指明它想連接到的IP地址和端口號(hào),設(shè)置它能夠接受的TCP數(shù)據(jù)報(bào)的最大值,以及一些可選的用戶數(shù)據(jù)。CONNECT原語發(fā)送一個(gè)SYN=1,ACK=0的數(shù)據(jù)報(bào)到目的端,并等待對(duì)方響應(yīng)。
該數(shù)據(jù)報(bào)到達(dá)目的端后,那里的TCP實(shí)體將察看是否有進(jìn)程在偵聽目的端口字段指定的端口。如果沒有,它將發(fā)送一個(gè)RST=1的應(yīng)答,拒絕建立該連接。
如果某個(gè)進(jìn)程正在對(duì)該端口進(jìn)行偵聽,于是便將到達(dá)的TCP數(shù)據(jù)報(bào)交給該進(jìn)程,它可以接受或拒絕建立連接。如果接受,便發(fā)回一個(gè)確認(rèn)數(shù)據(jù)報(bào)。一般情況下,TCP的連接建立過程如圖3-3所示。
為了釋放連接,每方均可發(fā)送一個(gè)FIN=1的TCP數(shù)據(jù)報(bào),表明本方已無數(shù)據(jù)發(fā)送。當(dāng)FIN數(shù)據(jù)報(bào)被確認(rèn)后,那個(gè)方向的連接即告關(guān)閉。當(dāng)兩個(gè)方向上的連接均關(guān)閉后,該連接就被完全釋放了。一般情況下,釋放一個(gè)連接需要4個(gè)TCP數(shù)據(jù)報(bào):每個(gè)方向均有一個(gè)FIN數(shù)據(jù)報(bào)和一個(gè)ACK數(shù)據(jù)報(bào)。
2.3 傳輸策略
TCP中采用滑動(dòng)窗口來進(jìn)行傳輸控制,滑動(dòng)窗口的大小意味著接收方還有多大的緩沖區(qū)可以用于接收數(shù)據(jù)。發(fā)送方可以通過滑動(dòng)窗口的大小來確定應(yīng)該發(fā)送多少字節(jié)的數(shù)據(jù)。當(dāng)滑動(dòng)窗口為0時(shí),發(fā)送方一般不能再發(fā)送數(shù)據(jù)報(bào),但有兩種情況除外,一種情況是可以發(fā)送緊急數(shù)據(jù),例如,允許用戶終止在遠(yuǎn)端機(jī)上的運(yùn)行進(jìn)程。另一種情況是發(fā)送方可以發(fā)送一個(gè)1字節(jié)的數(shù)據(jù)報(bào)來通知接收方重新聲明它希望接收的下一字節(jié)及發(fā)送方的滑動(dòng)窗口大小。
2.4 擁塞控制
當(dāng)加載到某個(gè)網(wǎng)絡(luò)上的載荷能力超過其處理能力時(shí),便會(huì)出現(xiàn)擁塞現(xiàn)象。對(duì)于因特網(wǎng)來說有兩個(gè)潛在的問題--網(wǎng)絡(luò)的容量和接收方的容量,應(yīng)該分別進(jìn)行處理。發(fā)送方始終保持兩個(gè)窗口:接收方承認(rèn)的窗口和擁塞窗口。取兩個(gè)窗口的最小值作為可以發(fā)送的字節(jié)數(shù)。
當(dāng)建立連接時(shí),發(fā)送方將擁塞窗口大小初始化為該連接所用的最大數(shù)據(jù)報(bào)的長(zhǎng)度值,并隨后發(fā)送一個(gè)最大長(zhǎng)度的數(shù)據(jù)報(bào)。如果該數(shù)據(jù)報(bào)在定時(shí)器超時(shí)之前得到了確認(rèn),那么發(fā)送方會(huì)在原擁塞窗口的基礎(chǔ)上再增加一個(gè)數(shù)據(jù)報(bào)的字節(jié)值,使其為兩倍最大數(shù)據(jù)報(bào)的大小,然后發(fā)送兩個(gè)數(shù)據(jù)報(bào)。當(dāng)這些數(shù)據(jù)報(bào)中的每一個(gè)都被確認(rèn)后,擁塞窗口大小就再增加一個(gè)最大數(shù)據(jù)報(bào)的長(zhǎng)度。當(dāng)擁塞窗口是N個(gè)數(shù)據(jù)報(bào)的大小時(shí),如果發(fā)送的所有N個(gè)數(shù)據(jù)報(bào)都被及時(shí)確認(rèn),那么將擁塞窗口大小增加N個(gè)數(shù)據(jù)報(bào)對(duì)應(yīng)的字節(jié)數(shù)目。擁塞窗口保持指數(shù)規(guī)律增大,直到數(shù)據(jù)傳輸超時(shí)或者達(dá)到接收方設(shè)定的窗口大小。擁塞窗口便設(shè)置為恰好不造成超時(shí)或達(dá)到接收方的窗口大小的字節(jié)數(shù)。
2.5 定時(shí)器管理
TCP使用多個(gè)定時(shí)器,如重發(fā)定時(shí)器、持續(xù)定時(shí)器、"keep alive"定時(shí)器等。 最重要的是重發(fā)定時(shí)器。在發(fā)送一個(gè)數(shù)據(jù)報(bào)的同時(shí),啟動(dòng)一個(gè)數(shù)據(jù)重發(fā)定時(shí)器。如果在定時(shí)器超時(shí)前該數(shù)據(jù)報(bào)被確認(rèn),則關(guān)閉該定時(shí)器;相反,如果在確認(rèn)到達(dá)之前定時(shí)器超時(shí),則需要重發(fā)該數(shù)據(jù)報(bào)。
持續(xù)定時(shí)器用于防止出現(xiàn)死鎖情況。 當(dāng)一個(gè)連接長(zhǎng)時(shí)間閑置時(shí),"keep alive"定時(shí)器會(huì)超時(shí)而使一方去檢測(cè)另一方是否仍然存在。如果它未得到響應(yīng),便終止該連接。
UDP協(xié)議
因特網(wǎng)協(xié)議組也支持無連接的傳輸協(xié)議UDP(user data protocol)。 UDP使用底層的因特網(wǎng)協(xié)議來傳送報(bào)文,提供與IP一樣的不可靠的、無連接的數(shù)據(jù)報(bào)傳輸服務(wù)。它不使用確認(rèn)信息對(duì)報(bào)文的到達(dá)進(jìn)行確認(rèn),不對(duì)收到的數(shù)據(jù)報(bào)進(jìn)行排序,也不提供反饋信息來控制機(jī)器之間傳輸?shù)男畔⒘髁俊DP通信的可靠性方面的工作,包括報(bào)文的丟失、重復(fù)、亂序等現(xiàn)象,由使用UDP的應(yīng)用程序來承擔(dān)。
一個(gè)UDP數(shù)據(jù)報(bào)包括一個(gè)8字節(jié)的頭和數(shù)據(jù)部分。報(bào)頭的格式如下圖3-4所示,它包括四個(gè)長(zhǎng)為16字節(jié)的字段。源端口和目的端口的作用與TCP中的相同,是用來標(biāo)明源端和目的端的端口號(hào)。UDP長(zhǎng)度字段指明包括8個(gè)字節(jié)的頭和數(shù)據(jù)在內(nèi)的數(shù)據(jù)報(bào)長(zhǎng)度。UDP校驗(yàn)和字段是可選項(xiàng),用于紀(jì)錄 UDP頭、UDP偽頭、用戶數(shù)據(jù)三者的校驗(yàn)和。
IP協(xié)議
IP協(xié)議提供了不可靠的、無連接的數(shù)據(jù)報(bào)傳輸機(jī)制。TCP/IP是為了適應(yīng)物理網(wǎng)絡(luò)的多樣性而設(shè)計(jì)的,而這種適應(yīng)性主要是通過IP層來體現(xiàn)的。由于物理網(wǎng)絡(luò)的多樣性,各種物理網(wǎng)絡(luò)的數(shù)據(jù)幀格式、地址格式之間的差異很大。為了將這些底層的細(xì)節(jié)屏蔽起來,使得采用不同物理網(wǎng)絡(luò)的網(wǎng)絡(luò)之間進(jìn)行通訊, TCP/IP分別采用了IP數(shù)據(jù)報(bào)和IP地址作為物理數(shù)據(jù)幀與物理地址的統(tǒng)一描述形式。 這樣IP向上層提供統(tǒng)一的IP數(shù)據(jù)報(bào)和統(tǒng)一的IP地址,使得各種物理幀及物理地址的差異性對(duì)上層協(xié)議不復(fù)存在。
4.1 IP數(shù)據(jù)報(bào)頭
一個(gè)IP數(shù)據(jù)報(bào)由一個(gè)頭部和數(shù)據(jù)部分構(gòu)成。頭部包括一個(gè)20字節(jié)的固定長(zhǎng)度部分和一個(gè)可選任意長(zhǎng)度部分。頭部格式如圖3-5所示。
版本:4位長(zhǎng)。記錄了數(shù)據(jù)報(bào)對(duì)應(yīng)的協(xié)議版本號(hào)。當(dāng)前的IP協(xié)議有兩個(gè)版本:IPV4 和IPV6。
IHL:4位長(zhǎng)。代表頭部的總長(zhǎng)度,以32位字節(jié)為一個(gè)單位。
服務(wù)類型:8位長(zhǎng)。使主機(jī)可以告訴子網(wǎng)它想要什么樣的服務(wù)。如下圖所示,服務(wù)類型域又分為了5個(gè)部分。優(yōu)先權(quán)字段是標(biāo)志優(yōu)先級(jí)的;三個(gè)標(biāo)志位分別代表延遲、吞吐量、可靠性。
總長(zhǎng):16位。指頭部和數(shù)據(jù)的總長(zhǎng)。最大長(zhǎng)度是65535個(gè)字節(jié)。
標(biāo)識(shí):16位。通過它使目的主機(jī)判斷新來的分段屬于哪個(gè)分組,所有屬于同一分組的分段包含同樣的標(biāo)識(shí)值。
DF:代表不要分段。它命令路由器不要將數(shù)據(jù)報(bào)分段,因?yàn)槟康亩瞬荒苤亟M分段。
MF:代表還有進(jìn)一步的分段,用它來標(biāo)志是否所有的分組都已到達(dá)。除了最后一個(gè)分段的所有分段都設(shè)置了這一位。
分段偏移:13位。標(biāo)明分段在當(dāng)前數(shù)據(jù)報(bào)的什么位置。
生命期:8位。用來限制分組生命周期的計(jì)數(shù)器。它在每個(gè)節(jié)點(diǎn)中都遞減,而且當(dāng)在一個(gè)路由器中排隊(duì)時(shí)可以倍數(shù)遞減。
協(xié)議:8位。說明將分組發(fā)送給那個(gè)傳輸進(jìn)程,如TCR、VDP等。
頭校驗(yàn)和:16位。僅用來校驗(yàn)頭部。
源地址: 32位。產(chǎn)生IP數(shù)據(jù)報(bào)的源主機(jī)IP地址。
目的地址:32位。IP數(shù)據(jù)報(bào)的目的主機(jī)的IP地址。
可選項(xiàng):是變長(zhǎng)的。每個(gè)可選項(xiàng)用一個(gè)字節(jié)標(biāo)明內(nèi)容。有些可選項(xiàng)還跟有一字節(jié)的可選項(xiàng)長(zhǎng)度字段,其后是一個(gè)或多個(gè)數(shù)據(jù)字節(jié)。現(xiàn)在已定義了安全性、嚴(yán)格的源路由選擇、松的源路由選擇、記錄路由和時(shí)間標(biāo)記五個(gè)可選項(xiàng)。但不是所有的路由器都支持全部5個(gè)可選項(xiàng)。
安全性選項(xiàng)說明了信息的安全程度。
嚴(yán)格的源路由選擇選項(xiàng)以一系列的IP地址方式,給出了從源到目的地的完整路徑。數(shù)據(jù)報(bào)必須嚴(yán)格地從這條路徑傳送。當(dāng)路由選擇表崩潰,系統(tǒng)管理員發(fā)送緊急分組時(shí),或作時(shí)間測(cè)量時(shí),此字段很有用。
松的源路由選擇選項(xiàng)要求分組遍及所列的路由器,但它可以在其間穿過其它的路由器。
記錄路由選項(xiàng)讓沿途的路由器都將其IP地址加到可選字段之后,這使系統(tǒng)管理者可以跟蹤路由選擇算法的錯(cuò)誤。
時(shí)間標(biāo)記選項(xiàng)像記錄路由選項(xiàng)一樣,除了記錄32位的IP地址外,每個(gè)路由器還要記錄一個(gè)32位的時(shí)間標(biāo)記。同樣地,這一選擇可用來為路由選擇算法查錯(cuò)。
4.2 IP數(shù)據(jù)報(bào)的分段與重組
IP數(shù)據(jù)報(bào)是通過封裝為物理幀來傳輸?shù)摹S捎谝蛱鼐W(wǎng)是通過各種不同物理網(wǎng)絡(luò)技術(shù)互連起來的,在因特網(wǎng)的不同部分,物理幀的大小(最大傳輸單元MTU)可能各不相同。為了最大程度的利用物理網(wǎng)絡(luò)的能力,IP模塊以所在的物理網(wǎng)絡(luò)的MTU做為依據(jù),來確定IP數(shù)據(jù)報(bào)的大小。當(dāng)IP數(shù)據(jù)報(bào)在兩個(gè)不同MTU的網(wǎng)絡(luò)之間傳輸時(shí),就可能出現(xiàn)IP數(shù)據(jù)報(bào)的分段與重組操作。
在IP頭中控制分段和重組的IP頭域有三個(gè):標(biāo)識(shí)域、標(biāo)志域、分段偏移域。標(biāo)識(shí)是源主機(jī)賦予IP數(shù)據(jù)報(bào)的標(biāo)識(shí)符。目的主機(jī)根據(jù)標(biāo)識(shí)域來判斷收到的IP數(shù)據(jù)報(bào)分段屬于哪一個(gè)數(shù)據(jù)報(bào),以進(jìn)行IP數(shù)據(jù)報(bào)重組。標(biāo)志域中的DF位標(biāo)識(shí)該IP數(shù)據(jù)報(bào)是否允許分段。當(dāng)需要對(duì)IP數(shù)據(jù)報(bào)進(jìn)行分段時(shí),如果DF位置1,網(wǎng)關(guān)將會(huì)拋棄該IP數(shù)據(jù)報(bào),并向源主機(jī)發(fā)送出錯(cuò)信息。標(biāo)志域中的MF位標(biāo)識(shí)該IP數(shù)據(jù)報(bào)分段是否是最后一個(gè)分段。分段偏移域記錄了該IP數(shù)據(jù)報(bào)分段在原IP數(shù)據(jù)報(bào)中的偏移量。偏移量是8字節(jié)的整數(shù)倍。分段偏移域被用來確定該IP數(shù)據(jù)報(bào)分段在IP數(shù)據(jù)報(bào)重組時(shí)的順序。
IP數(shù)據(jù)報(bào)在被傳輸過程中,一旦被分段,各段就作為獨(dú)立的IP數(shù)據(jù)報(bào)進(jìn)行傳輸,在到達(dá)目的主機(jī)之前有可能會(huì)被再次或多次分段。但是IP數(shù)據(jù)報(bào)分段的重組都只在目的主機(jī)進(jìn)行。
4.3 IP對(duì)輸入數(shù)據(jù)報(bào)的處理
IP對(duì)輸入數(shù)據(jù)報(bào)的處理分為兩種,一種是主機(jī)對(duì)數(shù)據(jù)報(bào)的處理,一種是網(wǎng)關(guān)對(duì)數(shù)據(jù)報(bào)的處理。
當(dāng)IP數(shù)據(jù)報(bào)到達(dá)主機(jī)時(shí),如果IP數(shù)據(jù)報(bào)的目的地址與主機(jī)地址匹配,IP接收該數(shù)據(jù)報(bào)并將它傳給高級(jí)協(xié)議軟件處理;否則拋棄該IP數(shù)據(jù)報(bào)。
網(wǎng)關(guān)則不同,當(dāng)IP數(shù)據(jù)報(bào)到達(dá)網(wǎng)關(guān)IP層后,網(wǎng)關(guān)首先判斷本機(jī)是否是數(shù)據(jù)報(bào)到達(dá)的目的主機(jī)。如果是,網(wǎng)關(guān)將接收到的IP數(shù)據(jù)報(bào)上傳給高級(jí)協(xié)議軟件處理。如果不是,網(wǎng)關(guān)將對(duì)接收到的IP數(shù)據(jù)報(bào)進(jìn)行尋徑,并隨后將其轉(zhuǎn)發(fā)出去。
4.4 IP對(duì)輸出數(shù)據(jù)報(bào)的處理
IP對(duì)輸出數(shù)據(jù)報(bào)的處理也分為兩種,一種是主機(jī)對(duì)數(shù)據(jù)報(bào)的處理,一種是網(wǎng)關(guān)對(duì)數(shù)據(jù)報(bào)的處理。
對(duì)于網(wǎng)關(guān)來說,IP接收到IP數(shù)據(jù)報(bào)后,經(jīng)過尋徑,找到該IP數(shù)據(jù)報(bào)的傳輸路徑。該路徑實(shí)際上是全路徑中的下一個(gè)網(wǎng)關(guān)的IP地址。然后,該網(wǎng)關(guān)將該IP數(shù)據(jù)報(bào)和尋徑到的下一個(gè)網(wǎng)關(guān)的地址交給網(wǎng)絡(luò)接口軟件。網(wǎng)絡(luò)接口軟件收到IP數(shù)據(jù)報(bào)和下一個(gè)網(wǎng)關(guān)地址后,首先調(diào)用ARP完成下一個(gè)網(wǎng)關(guān)IP地址到物理地址的映射,然后將IP數(shù)據(jù)報(bào)封裝成幀,最后由子網(wǎng)完成數(shù)據(jù)報(bào)的物理傳輸。
ICMP協(xié)議
ICMP(Internet Control Message Protocol)-因特網(wǎng)控制報(bào)文協(xié)議。ICMP主要用于差錯(cuò)信息和控制信息的構(gòu)造及某些網(wǎng)絡(luò)信息的獲取。ICMP與IP 同屬IP層,但I(xiàn)CMP報(bào)文是經(jīng)IP封裝后,作為IP數(shù)據(jù)報(bào)發(fā)送出去的。不把ICMP作為一個(gè)獨(dú)立的協(xié)議層次,是因?yàn)镮CMP不是上層協(xié)議的基礎(chǔ),在概念上構(gòu)不成一個(gè)獨(dú)立的層次。
ICMP消息包括以下類型:目的不可達(dá)、超時(shí)、參數(shù)問題、源端抑制、重定向、回聲請(qǐng)求、回聲應(yīng)答、時(shí)間標(biāo)記請(qǐng)求、時(shí)間標(biāo)記應(yīng)答。
目的不可達(dá)消息用來報(bào)告子網(wǎng)或路由器不能定位目的地,或設(shè)置了DF位的分組不能繞過"小分組"網(wǎng)絡(luò)。
超時(shí)消息用來報(bào)告報(bào)文由于計(jì)時(shí)器為零而被丟棄。
參數(shù)問題消息表明在頭部字段中發(fā)現(xiàn)了非法值。
源端抑制消息用來抑制發(fā)送過多分組的主機(jī)。當(dāng)主機(jī)收到這個(gè)消息,就要減慢發(fā)送速度。
重定向消息在路由器發(fā)現(xiàn)可能出現(xiàn)了路由錯(cuò)誤時(shí)發(fā)送。
回聲請(qǐng)求和回聲應(yīng)答消息用來測(cè)試目的是否可達(dá)且正常運(yùn)行。收到回聲請(qǐng)求消息,目的端應(yīng)該往回發(fā)一個(gè)回聲應(yīng)答消息。時(shí)間標(biāo)記請(qǐng)求和時(shí)間標(biāo)記應(yīng)答與此類似,只是消息到達(dá)時(shí)間和應(yīng)答發(fā)出時(shí)間應(yīng)加入應(yīng)答中,其好處是可以用來測(cè)試網(wǎng)絡(luò)性能。
IP在Linux上的實(shí)現(xiàn)
如圖3-6所示,Linux以分層的軟件結(jié)構(gòu)實(shí)現(xiàn)了TCP/IP協(xié)議。BSD套接字由一般性的套接字管理軟件INET套接字層支持。INET套接字管理著基于IP的TCP或UDP協(xié)議端。在傳輸U(kuò)DP數(shù)據(jù)報(bào)時(shí),Linux不必關(guān)心數(shù)據(jù)報(bào)是否安全到達(dá)目的端。但對(duì)TCP數(shù)據(jù)報(bào)來說,Linux需要對(duì)數(shù)據(jù)報(bào)進(jìn)行編號(hào),數(shù)據(jù)報(bào)的源端和目的端需要協(xié)調(diào)工作,以便保證數(shù)據(jù)報(bào)不會(huì)丟失,或以錯(cuò)誤的順序發(fā)送。IP層包含的代碼需要處理數(shù)據(jù)報(bào)的報(bào)頭信息,并且必須將傳入的數(shù)據(jù)報(bào)發(fā)送到TCP或 UDP兩者中正確的一層處理。在IP層之下是Linux的網(wǎng)絡(luò)設(shè)備層,其中包括以太網(wǎng)設(shè)備或PPP設(shè)備等。和Linux系統(tǒng)中的其它設(shè)備不同,網(wǎng)絡(luò)設(shè)備并不總代表實(shí)際的物理設(shè)備,例如,回環(huán)設(shè)備就是一個(gè)純軟件設(shè)備。ARP協(xié)議提供地址解析功能,因此它處于IP層和網(wǎng)絡(luò)設(shè)備層之間。
6.1 套接字緩沖區(qū)
Linux利用套接字緩沖區(qū)在協(xié)議層和網(wǎng)絡(luò)設(shè)備之間傳送數(shù)據(jù)。Sk_buff包含了一些指針和長(zhǎng)度信息,從而可讓協(xié)議層以標(biāo)準(zhǔn)的函數(shù)或方法對(duì)應(yīng)用程序的數(shù)據(jù)進(jìn)行處理。如圖3-7所示,每個(gè)sk_buff均包含一個(gè)數(shù)據(jù)塊、四個(gè)數(shù)據(jù)指針以及兩個(gè)長(zhǎng)度字段。利用四個(gè)數(shù)據(jù)指針,各協(xié)議層可操縱和管理套接字緩沖區(qū)的數(shù)據(jù),這四個(gè)指針的用途如下。
Head:指向內(nèi)存中數(shù)據(jù)區(qū)的起始地址。Sk_buff和相關(guān)數(shù)據(jù)塊在分配之后,該指針的值是固定的。
Data:指向協(xié)議數(shù)據(jù)的當(dāng)前起始地址。該指針的值隨當(dāng)前擁有Sk_buff的協(xié)議層的變化而變化。
Tail:指向協(xié)議數(shù)據(jù)的當(dāng)前結(jié)尾地址。和data指針一樣,該指針的值也隨當(dāng)前擁有Sk_buff的協(xié)議層的變化而變化。
End:指向內(nèi)存中數(shù)據(jù)區(qū)的結(jié)尾。和head指針一樣,Sk_buff被分配之后,該指針的值也固定不變。
Sk_buff的兩個(gè)長(zhǎng)度字段,len和truesize,分別描述當(dāng)前協(xié)議數(shù)據(jù)報(bào)的長(zhǎng)度和數(shù)據(jù)緩沖區(qū)的實(shí)際長(zhǎng)度。
6.2 接收IP數(shù)據(jù)報(bào)
當(dāng)網(wǎng)絡(luò)設(shè)備從網(wǎng)絡(luò)上接收到數(shù)據(jù)報(bào)時(shí),它必須將接收到的數(shù)據(jù)轉(zhuǎn)換為sk_buff數(shù)據(jù)結(jié)構(gòu),然后將該結(jié)構(gòu)添加到backlog隊(duì)列中排隊(duì)。當(dāng)backlog隊(duì)列變得很大時(shí),接收到的sk_buff數(shù)據(jù)將會(huì)被丟棄。當(dāng)新的sk_buff添加到backlog隊(duì)列時(shí),網(wǎng)絡(luò)底層程序?qū)⒈粯?biāo)志為就緒狀態(tài),從而可以讓調(diào)度程序調(diào)度底層程序進(jìn)行處理。
調(diào)度程序最終會(huì)運(yùn)行網(wǎng)絡(luò)的底層處理程序。這時(shí),網(wǎng)絡(luò)底層處理程序?qū)⑻幚砣魏蔚却齻鬏數(shù)臄?shù)據(jù)報(bào),但在這之前,底層處理程序首先會(huì)處理sk_buff結(jié)構(gòu)的backlog隊(duì)列。底層處理程序必須確定將接收到的數(shù)據(jù)報(bào)傳遞到哪個(gè)協(xié)議層。
在Linux進(jìn)行網(wǎng)絡(luò)層的初始化時(shí),每個(gè)協(xié)議要在ptype_all鏈表或ptype_base哈希表中添加packet_type數(shù)據(jù)結(jié)構(gòu)以進(jìn)行注冊(cè)。Packet_type數(shù)據(jù)結(jié)構(gòu)包含協(xié)議類型、指向網(wǎng)絡(luò)設(shè)備的指針、指向協(xié)議的接收數(shù)據(jù)處理例程的指針等 。Ptype_base是一個(gè)哈希表,其哈希函數(shù)以協(xié)議標(biāo)識(shí)符為參數(shù),內(nèi)核通常利用該哈希表判斷應(yīng)當(dāng)接受傳入的網(wǎng)絡(luò)數(shù)據(jù)報(bào)的協(xié)議。通過檢查ptype_all鏈表和ptype_base哈希表,網(wǎng)絡(luò)底層處理程序會(huì)復(fù)制新的sk_buff,最終,sk_buff會(huì)傳遞到一個(gè)或多個(gè)目標(biāo)協(xié)議的處理例程。
6.3 發(fā)送IP 數(shù)據(jù)報(bào)
網(wǎng)絡(luò)處理代碼必須建立sk_buff來包含要傳輸?shù)臄?shù)據(jù),并且在協(xié)議層之間傳遞數(shù)據(jù)時(shí),需要添加不同的協(xié)議頭和協(xié)議尾。
首先,IP協(xié)議需要決定要使用的網(wǎng)絡(luò)設(shè)備,網(wǎng)絡(luò)設(shè)備的選擇依賴于數(shù)據(jù)報(bào)的最佳路由。對(duì)于只利用調(diào)制解調(diào)器和PPP協(xié)議連接的計(jì)算機(jī)來說,路由的選擇比較容易,但是對(duì)于連接到以太網(wǎng)的計(jì)算機(jī)來說,路由的選擇是比較復(fù)雜的。
對(duì)每個(gè)要傳輸?shù)腎P數(shù)據(jù)報(bào),IP利用路由表解析目標(biāo)IP地址的路由。對(duì)每個(gè)可從路由表中找到路由的目標(biāo)IP地址,路由表返回一個(gè)rtable數(shù)據(jù)結(jié)構(gòu)描述可使用的路由。這包括要使用的源地址、網(wǎng)絡(luò)設(shè)備的device數(shù)據(jù)結(jié)構(gòu)的地址以及預(yù)先建立的硬件頭信息。該硬件頭信息和網(wǎng)絡(luò)設(shè)備相關(guān),包含了源和目標(biāo)的物理地址以及其它的介質(zhì)信息。
6.4 數(shù)據(jù)報(bào)的分段與重組
當(dāng)傳輸IP數(shù)據(jù)報(bào)時(shí),IP從IP路由表中找到發(fā)送該IP數(shù)據(jù)報(bào)的網(wǎng)絡(luò)設(shè)備,網(wǎng)絡(luò)設(shè)備對(duì)應(yīng)的device數(shù)據(jù)結(jié)構(gòu)中包含由一個(gè)mtu字段,該字段描述最大的傳輸單元。如果設(shè)備的mtu小于等待發(fā)送的IP數(shù)據(jù)報(bào)的大小,就需要將該IP數(shù)據(jù)報(bào)劃分為小的片斷。每個(gè)片斷由一個(gè)sk_buff代表,其中的IP頭標(biāo)記為數(shù)據(jù)報(bào)片斷,以及該片斷在IP數(shù)據(jù)報(bào)中的偏移。最后的數(shù)據(jù)報(bào)被標(biāo)志為最后的IP片斷。如果分段過程中IP不能分配sk_buff,則傳輸失敗。
IP片斷的接收較片斷的發(fā)送更加復(fù)雜一些,因?yàn)镮P片斷可能以任意的順序接收到,而在重組之前,必須接受到所有的片斷。每次接收到IP數(shù)據(jù)報(bào)時(shí),IP 要檢查是否是一個(gè)分段數(shù)據(jù)報(bào)。當(dāng)?shù)谝淮谓邮盏椒侄蔚南r(shí),IP建立一個(gè)新的ipq數(shù)據(jù)結(jié)構(gòu),并將它鏈接到由等待重組的IP片斷形成的ipqueue鏈表中。隨著其他IP片斷的接收,IP找到正確的ipq數(shù)據(jù)結(jié)構(gòu),同時(shí)建立新的ipfrag數(shù)據(jù)結(jié)構(gòu)描述該片斷。每個(gè)ipq數(shù)據(jù)結(jié)構(gòu)中包含有其源和目標(biāo)IP地址、高層協(xié)議的標(biāo)識(shí)符以及該IP幀的標(biāo)識(shí)符,從而唯一描述了一個(gè)分段的IP接收幀。當(dāng)所有的片斷接收到之后,它們被組合成單一的sk_buff并傳遞到上一級(jí)協(xié)議層處理。如果定時(shí)器在所有的片斷到達(dá)之前到期,ipq數(shù)據(jù)結(jié)構(gòu)和ipfrag被丟棄,并假定消息已經(jīng)在傳輸中丟失,這時(shí),高層協(xié)議需要請(qǐng)求源主機(jī)重新發(fā)送丟失的信息。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3592415.html
總結(jié)
以上是生活随笔為你收集整理的基于Linux的集群系统(八)--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Caching Best Practic
- 下一篇: Linux 2.4调度系统分析--转