
TCP/IP模型中沒有表示層和會話層,在TCP/IP模型中,通常認為應(yīng)用層是OSI模型的最高三層(應(yīng)用層、表示層和會話層)的合并
OSI:Open System Interconnection 開放系統(tǒng)互聯(lián)
TCP/IP:Transmission Control Protocol/Internet Protocol 傳輸控制協(xié)議/網(wǎng)際協(xié)議
TCP/IP模型各層的結(jié)構(gòu)、功能和協(xié)議
1 網(wǎng)絡(luò)接口層
網(wǎng)絡(luò)接口層即數(shù)據(jù)鏈路層。
TCP/IP沒有為數(shù)據(jù)鏈路層定義任何特定的協(xié)議。
計算機之間傳輸?shù)氖?和1的電信號數(shù)據(jù),但是單純的0和1沒有任何意義,所以必須規(guī)定解讀方式:多少個電信號算一組,每個信號位有何意義。
以太網(wǎng)規(guī)定,一組電信號構(gòu)成一個數(shù)據(jù)包(以太網(wǎng)數(shù)據(jù)包),叫做“幀”,每一幀分成兩個部分:標(biāo)頭(Head)和數(shù)據(jù)(Data)?!皹?biāo)頭”包含數(shù)據(jù)包的一些說明項,比如發(fā)送者、接收者、數(shù)據(jù)類型等等;“數(shù)據(jù)”則是數(shù)據(jù)包的具體內(nèi)容。
數(shù)據(jù)鏈路層的作用就是確定0和1的分組方式,將0和1劃分為數(shù)據(jù)幀,并從一個節(jié)點傳輸?shù)脚R近的另一個節(jié)點,這些節(jié)點是通過MAC地址來唯一標(biāo)識的。
MAC地址:以太網(wǎng)規(guī)定,連入網(wǎng)絡(luò)的所有設(shè)備,都必須具有“網(wǎng)卡”接口。數(shù)據(jù)包必須是從一塊網(wǎng)卡傳送到另一塊網(wǎng)卡。網(wǎng)卡的地址,就是數(shù)據(jù)包的發(fā)送地址和接收地址,這叫做MAC地址。

每塊網(wǎng)卡出廠的時候,都有一個全世界獨一無二的MAC地址,長度是48個二進制位,通常用12個十六進制數(shù)來表示,比如:00-B0-D0-86-BB-F7
廣播:一塊網(wǎng)卡怎么會知道另一塊網(wǎng)卡的MAC地址呢。這是因為有一種ARP協(xié)議(后面會介紹)。以太網(wǎng)采用了一種很原始的方式,它不是把數(shù)據(jù)包準(zhǔn)確的送到接收方,而是向本網(wǎng)絡(luò)內(nèi)所有計算機發(fā)送,讓每臺計算機自己判斷,是否為接收方。接收方讀取數(shù)據(jù)包的標(biāo)頭,找到接收方的MAC地址,然后與自身MAC地址對比,如果兩者相同,則接收這個這個包并做進一步處理,否則丟棄這個包。這種發(fā)送方式就叫做“廣播”。
總結(jié):在數(shù)據(jù)鏈路層中我們通過MAC地址來識別不同的節(jié)點(節(jié)點是通過MAC地址來唯一標(biāo)識的)
2 網(wǎng)絡(luò)層
理論上,僅依靠MAC地址,上海的網(wǎng)卡就可以找到洛杉磯的網(wǎng)卡,這在技術(shù)上是可以實現(xiàn)的。但是,這樣做有一個重大的缺點。以太網(wǎng)采用廣播方式發(fā)送數(shù)據(jù)包,所有成員人都會受到這個數(shù)據(jù)包,不僅效率低,而且局限在發(fā)送者所在的子網(wǎng)絡(luò)。也就是說,如果兩臺計算機不在同一個子網(wǎng)絡(luò),廣播是傳不進去的。這種設(shè)計也是合理的,否則互聯(lián)網(wǎng)上每一臺計算機都會收到所有包,那會引起災(zāi)難。
因此,必須找到一種方法,能夠區(qū)分哪些MAC地址屬于同一個子網(wǎng)絡(luò),哪些不是。如果是同一個子網(wǎng)絡(luò),就采用廣播方式發(fā)送,否則采用“路由”方式發(fā)送(路由的意思,就是指如何向不同的子網(wǎng)絡(luò)分發(fā)數(shù)據(jù)包)。遺憾的是,MAC地址本身無法做到這一點。它只與廠商有關(guān),與所處網(wǎng)絡(luò)無關(guān)。
這就導(dǎo)致了網(wǎng)絡(luò)層的誕生。它的作用是引進一套新的地址,使得我們能夠區(qū)分不同的計算機是否屬于同一個子網(wǎng)絡(luò)。這套地址就叫做“網(wǎng)絡(luò)地址”,簡稱“網(wǎng)址”。
于是,“網(wǎng)絡(luò)層”出現(xiàn)后,每臺計算機有了兩種地址:MAC地址和網(wǎng)絡(luò)地址。兩種地址之間沒有任何聯(lián)系,MAC地址是綁定在網(wǎng)卡上的,網(wǎng)絡(luò)地址則是管理員分配的,他們只是隨機組合在一起。
網(wǎng)絡(luò)地址幫助我們確定計算機所在的子網(wǎng)絡(luò),MAC地址則將數(shù)據(jù)包送到該子網(wǎng)絡(luò)中的目標(biāo)網(wǎng)卡。因此,從邏輯上判斷,必定是先處理網(wǎng)絡(luò)地址,然后再處理MAC地址。
規(guī)定網(wǎng)絡(luò)地址的協(xié)議叫做IP協(xié)議。它所定義的地址叫做IP地址
目前廣泛采用的是IP協(xié)議第四版,簡稱IPv4。這個版本規(guī)定,網(wǎng)絡(luò)地址有32個二進制位組成。習(xí)慣上,我們用分成四段的十進制數(shù)表示IP地址,從0.0.0.0~255.255.255.255
互聯(lián)網(wǎng)上的每一臺計算機,都會分配到一個IP地址。這個地址分成兩個部分,前一部分代表網(wǎng)絡(luò),后一部分代表主機,如果兩臺計算機的前一部分如果相同,則表示它們處于同一個子網(wǎng)絡(luò)。(后面會介紹IP地址的分類)。
2.1 IP協(xié)議
IP協(xié)議的主要作用有兩個,一是為每臺計算機分配IP地址;另一個是確定哪些地址在同一個子網(wǎng)絡(luò)。
IP數(shù)據(jù)包:根據(jù)IP協(xié)議發(fā)送的數(shù)據(jù),就叫做IP數(shù)據(jù)包。IP數(shù)據(jù)包也包含“標(biāo)頭”和“數(shù)據(jù)”兩部分,“標(biāo)頭”部分主要包括版本、長度、IP地址等信息;“數(shù)據(jù)部分”則是IP數(shù)據(jù)包的具體內(nèi)容。
2.2 ARP協(xié)議
ARP協(xié)議是根據(jù)IP地址獲取MAC地址的協(xié)議。
ARP:Address Resolution Protocol 地址解析協(xié)議
因為IP數(shù)據(jù)是放在以太網(wǎng)數(shù)據(jù)包里發(fā)送的,所以我們必須同時知道兩個地址,一個是對方的MAC地址,另一個是對方的IP地址。通常情況下,對方的IP地址是已知的,但是對方的MAC地址是未知的。
所以我們需要一種機制,能夠從IP地址得到MAC地址。
這里又可以分為兩種情況:
如果兩臺主機不在同一個子網(wǎng)絡(luò),那么事實上沒有辦法得到對方的MAC地址,只能把數(shù)據(jù)包傳送到兩個子網(wǎng)絡(luò)連接處的“網(wǎng)關(guān)”,讓網(wǎng)關(guān)去處理。
如果兩臺主機在同一個子網(wǎng)絡(luò),那么可以用ARP協(xié)議得到對方的MAC地址。使用ARP協(xié)議時,會首先檢查ARP高速緩存(IP-MAC地址對應(yīng)表緩存),如果查詢的IP-MAC對不存在,那么就發(fā)送一個ARP協(xié)議廣播包。ARP協(xié)議也是發(fā)出一個數(shù)據(jù)包(包含在以太網(wǎng)數(shù)據(jù)包中),其中包含它所要查詢主機的IP地址,而在對方的MAC地址一欄,填的是FF:FF:FF:FF:FF:FF,表示這是一個廣播地址。它所在的子網(wǎng)絡(luò)的每一臺主機,都會收到這個數(shù)據(jù)包,從中取出IP地址,與自身IP地址進行比較。如果兩者相同,就做出回復(fù),向發(fā)送方報告自己的MAC地址,否則丟棄這個包。發(fā)送方收到MAC地址后會更新ARP緩存。
2.3 ICMP協(xié)議
ICMP:Internet Control Message Protocol Internet控制報文協(xié)議
IP協(xié)議并不是一個可靠的協(xié)議,它不能保證數(shù)據(jù)被送達。當(dāng)傳送IP數(shù)據(jù)包發(fā)生錯誤,比如主機不可達、路由器不可達等等。ICMP協(xié)議會把錯誤信息封包,然后傳回給發(fā)送方,通過這些信息,發(fā)送方可以對所發(fā)生的問題作出診斷,然后采取適當(dāng)?shù)拇胧┙鉀Q。它與傳輸協(xié)議最大的不同:它一般不用于在兩點間傳輸數(shù)據(jù),而常常用于返回的錯誤信息或是分析路由。
總結(jié):網(wǎng)絡(luò)層的功能是建立“主機到主機”的通信
3 傳輸層
有了MAC地址和IP地址,我們已經(jīng)可以在互聯(lián)網(wǎng)上任意兩臺主機之間進行通信。接下來的問題是,同一臺主機上有許多程序都需要用到網(wǎng)絡(luò),比如你一邊瀏覽網(wǎng)頁,一邊與朋友在線聊天。當(dāng)一個數(shù)據(jù)包從互聯(lián)網(wǎng)上發(fā)來的時候,該如何區(qū)分是網(wǎng)頁內(nèi)容還是在線聊天內(nèi)容?
也就是說,我們還需要一個參數(shù),表示這個包到底供哪個程序使用。這個參數(shù)就叫做“端口”,它其實是每一個使用網(wǎng)卡程序的編號。每個數(shù)據(jù)包都發(fā)送到主機的特定端口,所以不同的程序就能取到自己所需要的數(shù)據(jù)。
端口:065535之間的一個整數(shù),正好16個二進制位。其中01023端口被系統(tǒng)占用。
傳輸層的作用是建立“端口到端口”的通信。
3.1 UDP協(xié)議
UDP:User Datagram Protocol 用戶數(shù)據(jù)報協(xié)議
要在數(shù)據(jù)包中加入端口信息,就需要新的協(xié)議。最簡單的實現(xiàn)叫做UDP協(xié)議,它的格式幾乎就是在數(shù)據(jù)報前面加上端口號。
UDP數(shù)據(jù)包,也是由“標(biāo)頭”和“數(shù)據(jù)”兩部分組成。
“標(biāo)頭”部分主要定義了發(fā)送端口和接收端口,“數(shù)據(jù)”部分就是具體的內(nèi)容。
3.2 TCP協(xié)議
TCP:Transmission Control Protocol 傳輸控制協(xié)議
UDP協(xié)議的優(yōu)點是簡單、容易實現(xiàn),缺點是可靠性差,一旦數(shù)據(jù)包發(fā)出,無法知道對方是否已收到。
為了提高網(wǎng)絡(luò)可靠性,TCP協(xié)議就誕生了。TCP協(xié)議非常復(fù)雜,但可以近似的認為,它就是有確認機制的UDP協(xié)議,每發(fā)出一個數(shù)據(jù)包都要求確認。如果有一個數(shù)據(jù)包丟失,就收不到確認,發(fā)送方就知道有必要重發(fā)這個數(shù)據(jù)包。
TCP協(xié)議能夠確保數(shù)據(jù)不被丟失,缺點是過程復(fù)雜、實現(xiàn)困難、消耗較多資源。
4 應(yīng)用層
TCP協(xié)議可以為各式各樣的程序傳遞數(shù)據(jù),比如Email、www、FTP等等。那么必須有不同的協(xié)議規(guī)定電子郵件、網(wǎng)頁、FTP數(shù)據(jù)的格式,這些應(yīng)用程序協(xié)議就構(gòu)成了應(yīng)用層。
應(yīng)用層是最高層,直接面對用戶。
應(yīng)用層的協(xié)議有:SMTP(電子郵件)、HTTP(萬維網(wǎng))、TELNET(遠程終端連接)、FTP(文件傳輸)、DNS(域名轉(zhuǎn)換)等等。
以上內(nèi)容參考自:
阮一峰的博客:《互聯(lián)網(wǎng)協(xié)議入門》http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
https://github.com/LRH1993/android_interview/blob/master/computer-networks/tcpip.md
《TCP/IP協(xié)議族》第四版