tcp/ip參考模型分為4層,分別為:1、數(shù)據(jù)鏈路層,實(shí)現(xiàn)網(wǎng)卡接口的網(wǎng)絡(luò)驅(qū)動(dòng)程序,以處理數(shù)據(jù)在物理媒介上的傳輸;2、網(wǎng)絡(luò)層,實(shí)現(xiàn)數(shù)據(jù)包的選路和轉(zhuǎn)發(fā);3、傳輸層,為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通信;4、應(yīng)用層,負(fù)責(zé)處理應(yīng)用程序的邏輯。
TCP/IP協(xié)議族是一個(gè)四層協(xié)議系統(tǒng),自底而上分別是數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。每一層完成不同
的功能,且通過(guò)若干協(xié)議來(lái)實(shí)現(xiàn),上層協(xié)議使用下層協(xié)議提供的服務(wù)。
數(shù)據(jù)鏈路層(網(wǎng)絡(luò)接口層)
數(shù)據(jù)鏈路層實(shí)現(xiàn)了網(wǎng)卡接口的網(wǎng)絡(luò)驅(qū)動(dòng)程序,以處理數(shù)據(jù)在物理媒介(比如以太網(wǎng)、令牌環(huán)等)上的傳輸。
數(shù)據(jù)鏈路層兩個(gè)常用的協(xié)議是ARP協(xié)議(Address Resolve Protocol,地址解析協(xié)議)和RARP協(xié)議(ReverseAddress Resolve Protocol,逆地址解析協(xié)議)。它們實(shí)現(xiàn)了IP地址和機(jī)器物理地址(通常是MAC地址,以太網(wǎng)、令牌環(huán)和802.11無(wú)線網(wǎng)絡(luò)都使用MAC地址)之間的相互轉(zhuǎn)換。
網(wǎng)絡(luò)層使用IP地址尋址一臺(tái)機(jī)器,而數(shù)據(jù)鏈路層使用物理地址尋址一臺(tái)機(jī)器,因此網(wǎng)絡(luò)層必須先將目標(biāo)機(jī)器的IP地址轉(zhuǎn)化成其物理地址,才能使用數(shù)據(jù)鏈路層提供的服務(wù),這就是ARP協(xié)議的用途。
RARP協(xié)議僅用于網(wǎng)絡(luò)上的某些無(wú)盤工作站。因?yàn)槿狈Υ鎯?chǔ)設(shè)備,無(wú)盤工作站無(wú)法記住自己的IP地址,但它們可以利用網(wǎng)卡上的物理地址來(lái)向網(wǎng)
絡(luò)管理者(服務(wù)器或網(wǎng)絡(luò)管理軟件)查詢自身的IP地址。運(yùn)行RARP服務(wù)的網(wǎng)絡(luò)管理者通常存有該網(wǎng)絡(luò)上所有機(jī)器的物理地址到IP地址的映射。
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層實(shí)現(xiàn)數(shù)據(jù)包的選路和轉(zhuǎn)發(fā)。
WAN(Wide Area Network,廣域網(wǎng))通常使用眾多分級(jí)的路由器來(lái)連接分散的主機(jī)或LAN(Local Area Network,局域網(wǎng)),因此,通信的兩臺(tái)主機(jī)一般不是直接相連的,而是通過(guò)多個(gè)中間節(jié)點(diǎn)(路由器)連接的。網(wǎng)絡(luò)層的任務(wù)就是選擇這些中間節(jié)點(diǎn),以確定兩臺(tái)主機(jī)之間的通信路徑。同時(shí),網(wǎng)絡(luò)層對(duì)上層協(xié)議隱藏了網(wǎng)絡(luò)拓?fù)溥B接的細(xì)節(jié),使得在傳輸層和網(wǎng)絡(luò)應(yīng)用程序看來(lái),通信的雙方是直接相連的。
網(wǎng)絡(luò)層最核心的協(xié)議是IP協(xié)議(Internet Protocol,因特網(wǎng)協(xié)議)。IP協(xié)議根據(jù)數(shù)據(jù)包的目的IP地址來(lái)決定如何投遞它。如果數(shù)據(jù)包不能直接發(fā)送給目標(biāo)主機(jī),那么IP協(xié)議就為它尋找一個(gè)合適的下一跳(next hop)路由器,并將數(shù)據(jù)包交付給該路由器來(lái)轉(zhuǎn)發(fā)。多次重復(fù)這一過(guò)程,數(shù)據(jù)包最終到達(dá)目標(biāo)主機(jī),或者由于發(fā)送失敗而被丟棄??梢?jiàn),IP協(xié)議使用逐跳(hop by hop)的方式確定通信路徑。
網(wǎng)絡(luò)層另外一個(gè)重要的協(xié)議是ICMP協(xié)議(Internet Control Message Protocol,因特網(wǎng)控制報(bào)文協(xié)議)。它是IP協(xié)議的重要補(bǔ)充,主要用于檢測(cè)網(wǎng)絡(luò)連接。
8位類型字段用于區(qū)分報(bào)文類型。它將ICMP報(bào)文分為兩大類
差錯(cuò)報(bào)文,這類報(bào)文主要用來(lái)回應(yīng)網(wǎng)絡(luò)錯(cuò)誤,比如目標(biāo)不可到達(dá)(類型值為3)和重定向(類型值為5);
查詢報(bào)文,這類報(bào)文用來(lái)查詢網(wǎng)絡(luò)信息,比如ping程序就是使用ICMP報(bào)文查看目標(biāo)是否可到達(dá)(類型值為8)的。
有的ICMP報(bào)文還使用8位代碼字段來(lái)進(jìn)一步細(xì)分不同的條件。比如重定向報(bào)文使用代碼值0表示對(duì)網(wǎng)絡(luò)重定向,代碼值1表示對(duì)主機(jī)重定向。
ICMP報(bào)文使用16位校驗(yàn)和字段對(duì)整個(gè)報(bào)文(包括頭部和內(nèi)容部分)進(jìn)行循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check,CRC),以檢驗(yàn)報(bào)文在傳輸過(guò)程中是否損壞。不同的ICMP報(bào)文類型具有不同的正文內(nèi)容。
傳輸層
傳輸層為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端(end to end)的通信。與網(wǎng)絡(luò)層使用的逐跳通信方式不同,傳輸層只關(guān)心通信的起始端和目的端,而不在乎數(shù)據(jù)包的中轉(zhuǎn)過(guò)程。
垂直的實(shí)線箭頭表示TCP/IP協(xié)議族各層之間的實(shí)體通信(數(shù)據(jù)包確實(shí)是沿著這些線路傳遞的),而水平的虛線箭頭表示邏輯通信線路。該圖中還附帶描述了不同物理網(wǎng)絡(luò)的連接方法。可見(jiàn),
數(shù)據(jù)鏈路層(驅(qū)動(dòng)程序)封裝了物理網(wǎng)絡(luò)的電氣細(xì)節(jié);網(wǎng)絡(luò)層封裝了網(wǎng)絡(luò)連接的細(xì)節(jié);傳輸層則為應(yīng)用程序封裝了一條端到端的邏輯通信鏈路,它負(fù)責(zé)數(shù)據(jù)的收發(fā)、鏈路的超時(shí)重連等。
傳輸層協(xié)議:TCP協(xié)議、UDP協(xié)議。
-
TCP協(xié)議(Transmission Control Protocol,傳輸控制協(xié)議)為應(yīng)用層提供可靠的、面向連接的和基于流(stream)的服務(wù)。TCP協(xié)議使用超時(shí)重傳、數(shù)據(jù)確認(rèn)等方式來(lái)確保數(shù)據(jù)包被正確地發(fā)送至目的端,因此TCP服務(wù)是可靠的。使用TCP協(xié)議通信的雙方必須先建立TCP連接,并在內(nèi)核中為該連接維持一些必要的數(shù)據(jù)結(jié)構(gòu),比如連接的狀態(tài)、讀寫緩沖區(qū),以及諸多定時(shí)器等。當(dāng)通信結(jié)束時(shí),雙方必須關(guān)閉連接以釋放這些內(nèi)核數(shù)據(jù)。TCP服務(wù)是基于流的?;诹鞯臄?shù)據(jù)沒(méi)有邊界(長(zhǎng)度)限制,它源源不斷地從通信的一端流入另一端。發(fā)送端可以逐個(gè)字節(jié)地向數(shù)據(jù)流中寫入數(shù)據(jù),接收端也可以逐個(gè)字節(jié)地將它們讀出。
-
UDP協(xié)議(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)則與TCP協(xié)議完全相反,它為應(yīng)用層提供不可靠、無(wú)連接和基于數(shù)據(jù)報(bào)的服務(wù)?!安豢煽俊币馕吨鳸DP協(xié)議無(wú)法保證數(shù)據(jù)從發(fā)送端正確地傳送到目的端。如果數(shù)據(jù)在中途丟失,或者目的端通過(guò)數(shù)據(jù)校驗(yàn)發(fā)現(xiàn)數(shù)據(jù)錯(cuò)誤而將其丟棄,則UDP協(xié)議只是單地通知應(yīng)用程序發(fā)送失敗。因此,使用UDP協(xié)議的應(yīng)用程序通常要自己處理數(shù)據(jù)確認(rèn)、超時(shí)重傳等邏輯。UDP協(xié)議是無(wú)連接的,即通信雙方不保持一個(gè)長(zhǎng)久的聯(lián)系,因此應(yīng)用程序每次發(fā)送數(shù)據(jù)都要明確指定接收端的地址(IP地址等信息)?;跀?shù)據(jù)報(bào)的服務(wù),是相對(duì)基于流的服務(wù)而言的。每個(gè)UDP數(shù)據(jù)報(bào)都有一個(gè)長(zhǎng)度,接收端必須以該長(zhǎng)度為最小單位將其所有內(nèi)容一次性讀出,否則數(shù)據(jù)將被截?cái)唷?/p>
應(yīng)用層
應(yīng)用層負(fù)責(zé)處理應(yīng)用程序的邏輯。
數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層負(fù)責(zé)處理網(wǎng)絡(luò)通信細(xì)節(jié),這部分必須既穩(wěn)定又高效,因此它們都在內(nèi)核空間中實(shí)現(xiàn)。而應(yīng)用層則在用戶空間實(shí)現(xiàn),因?yàn)樗?fù)責(zé)處理眾多邏輯,比如文件傳輸、名稱查詢和網(wǎng)絡(luò)管理等。如果應(yīng)用層也在內(nèi)核中實(shí)現(xiàn),則會(huì)使內(nèi)核變得非常龐大。當(dāng)然,也有少數(shù)服務(wù)器程序是在內(nèi)核中實(shí)現(xiàn)的,這樣代碼就無(wú)須在用戶空間和內(nèi)核空間來(lái)回切換(主要是數(shù)據(jù)的復(fù)制),極大地提高了工作效率。不過(guò)這種代碼實(shí)現(xiàn)起來(lái)較復(fù)雜,不夠靈活,且不便于移植。
ping是應(yīng)用程序,而不是協(xié)議,前面說(shuō)過(guò)它利用ICMP報(bào)文檢測(cè)網(wǎng)絡(luò)連接,是調(diào)試網(wǎng)絡(luò)環(huán)境的必備工具。
telnet協(xié)議是一種遠(yuǎn)程登錄協(xié)議,它使我們能在本地完成遠(yuǎn)程任務(wù)。
OSPF(Open Shortest Path First,開放最短路徑優(yōu)先)協(xié)議是一種動(dòng)態(tài)路由更新協(xié)議,用于路由器之間的通信,以告知對(duì)方各自的路由信息。
DNS(Domain Name Service,域名服務(wù))協(xié)議提供機(jī)器域名到IP地址的轉(zhuǎn)換。
應(yīng)用層協(xié)議(或程序)可能跳過(guò)傳輸層直接使用網(wǎng)絡(luò)層提供的服務(wù),比如ping程序和OSPF協(xié)議。應(yīng)用層協(xié)議(或程序)通常既可以使用TCP服務(wù),又可以使用UDP服務(wù),比如DNS協(xié)議。我們可以通過(guò)/etc/services文件查看所有知名的應(yīng)用層協(xié)議,以及它們都能使用哪些傳輸層服務(wù)。
五層協(xié)議背后的思想:上層屏蔽下層細(xì)節(jié),只使用其提供的服務(wù)。高內(nèi)聚低耦合,每一層專注于其功能,各層之間的關(guān)系依賴不大。
數(shù)據(jù)包在每層有不同的格式,從上到下依次叫段,數(shù)據(jù)報(bào),幀,數(shù)據(jù)從應(yīng)用層通過(guò)協(xié)議棧向下傳遞,每經(jīng)過(guò)一層加上對(duì)應(yīng)層協(xié)議的報(bào)頭,最后封裝成幀發(fā)送到傳輸介質(zhì)上,到達(dá)路由器或者目的主機(jī)剝掉頭部,交付給上層需要者。這一過(guò)程稱為封裝,傳輸,分離,分用。