tcp/ip協(xié)議運行在各種操作系統(tǒng)上的一種網(wǎng)絡(luò)通信協(xié)議,各個系統(tǒng)通過實現(xiàn)tcp/ip的相關(guān)協(xié)議,來達(dá)到相互之間通信的目的。
網(wǎng)絡(luò)協(xié)議通常都是分層開發(fā),各個層負(fù)責(zé)其相對應(yīng)的任務(wù),TCP/IP協(xié)議也不例外。例如,TCP/IP協(xié)議的鏈路層負(fù)責(zé)保證局域網(wǎng)內(nèi)的通信,網(wǎng)絡(luò)層負(fù)責(zé)保證跨局域網(wǎng)之間的通信。
具體的分層細(xì)節(jié)如下:
鏈路層:有時也稱作數(shù)據(jù)鏈路層或網(wǎng)絡(luò)接口層,通常包括操作系統(tǒng)中的設(shè)備驅(qū)動程序和計算機中對應(yīng)的網(wǎng)絡(luò)接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細(xì)節(jié)。
網(wǎng)絡(luò)層:有時也稱作互聯(lián)網(wǎng)層,處理分組在網(wǎng)絡(luò)中的活動,例如分組(分組可以理解為一條在網(wǎng)絡(luò)中傳輸?shù)膱笪模┑倪x路。在TCP/IP協(xié)議族中,網(wǎng)絡(luò)層協(xié)議包括IP協(xié)議(網(wǎng)際協(xié)議),ICMP協(xié)議(常用的ping程序便是通過這個協(xié)議實現(xiàn)),以及IGMP協(xié)議(負(fù)責(zé)組播選路轉(zhuǎn)發(fā)的相關(guān)協(xié)議)。
傳輸層:有時也稱作運輸層,運輸層主要為兩臺主機上的應(yīng)用程序提供端到端的通信(注意運輸層負(fù)責(zé)的是應(yīng)用程序之間的通信,而主機到主機之間的通信由鏈路層與網(wǎng)絡(luò)層負(fù)責(zé))。
在TCP/IP協(xié)議族中,有兩個互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。
TCP為兩臺主機提供高可靠性的數(shù)據(jù)通信(TCP提供的服務(wù)是可靠的,即只要是TCP承載的協(xié)議報文,除非網(wǎng)絡(luò)不通,否則網(wǎng)絡(luò)報文必定能正常送達(dá)目的主機,這是由于網(wǎng)絡(luò)層的IP服務(wù)時不可靠的)。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時時鐘等。由于運輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而另一方面,UDP則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報的分組從一臺主機發(fā)送到另一臺主機,但并不保證該數(shù)據(jù)報能到達(dá)另一端(不具備可靠性,需要通過上層協(xié)議來保證)。任何必需的可靠性必須由應(yīng)用層來提供。這兩種運輸層協(xié)議分別在不同的應(yīng)用程序中有不同的用途,這一點將在后面看到。
應(yīng)用層:應(yīng)用層負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)。幾乎各種不同的TCP/IP實現(xiàn)都會提供下面這些通用的應(yīng)用程序:
· Telnet 遠(yuǎn)程登錄。
· FTP 文件傳輸協(xié)議。
· SMTP 簡單郵件傳送協(xié)議。
· SNMP 簡單網(wǎng)絡(luò)管理協(xié)議。
我們可以簡單地將鏈路層、網(wǎng)絡(luò)層與傳輸層這三層的協(xié)議的作用,統(tǒng)一理解成為了將報文成功送達(dá)目標(biāo)主機對應(yīng)的目的程序。而應(yīng)用層的數(shù)據(jù)才是報文中真正承載的用戶數(shù)據(jù),即我們應(yīng)用程序之間通信的真正數(shù)據(jù)。例如我們微信、QQ這些聊天軟件發(fā)出去的聊天信息就是承載在應(yīng)用層的數(shù)據(jù)包中。
1-1
TCP與UDP是最為著名的運輸層協(xié)議,這兩種協(xié)議都以IP協(xié)議作為其網(wǎng)絡(luò)層協(xié)議。當(dāng)前互聯(lián)網(wǎng)中的絕大多數(shù)應(yīng)用層協(xié)議都是承載在這兩種運輸層協(xié)議之上。
TCP協(xié)議是可靠的,雖然使用的是不可靠的IP服務(wù),但其特殊的機制使得其提供的服務(wù)時可靠的,如報文確認(rèn)機制、超時重傳機制等。TELNET、FTP、SMTP等著名協(xié)議所使用的運輸層協(xié)議就是TCP協(xié)議。
UDP協(xié)議是不可靠的,僅為應(yīng)用程序提供發(fā)送和接收數(shù)據(jù)包的服務(wù)。其可靠性需要通過應(yīng)用層協(xié)議來保證。DNS、TFTP、SNMP等著名協(xié)議所使用的的運輸層協(xié)議就是UDP協(xié)議。
IP 是網(wǎng)絡(luò)層上的主要協(xié)議,也是為TCP、UDP協(xié)議提供網(wǎng)絡(luò)層服務(wù)的協(xié)議。在數(shù)據(jù)包到達(dá)目的主機之前,跨局域網(wǎng)之間的網(wǎng)絡(luò)選路都由IP協(xié)議來提供。
ICMP是IP 協(xié)議的附屬協(xié)議,其也是屬于網(wǎng)絡(luò)層協(xié)議。從報文上觀察時,很容易將其誤認(rèn)為是運輸層協(xié)議,但實際上是屬于網(wǎng)絡(luò)層協(xié)議。主要作用是在各個網(wǎng)絡(luò)主機與路由器之間交換網(wǎng)絡(luò)錯誤消息和其他的一些狀態(tài)信息。
IGMP是負(fù)責(zé)組播轉(zhuǎn)發(fā)的網(wǎng)絡(luò)層協(xié)議。主要負(fù)責(zé)組播報文(報文有單播、組播與廣播三種)在路由器上的選路轉(zhuǎn)發(fā)。
ARP與RARP是屬于鏈路層協(xié)議,有時也認(rèn)為是2.5層協(xié)議。其主要負(fù)責(zé)的是鏈路層的地址(以太網(wǎng)即MAC地址)與網(wǎng)絡(luò)層地址(TCP/IP協(xié)議即IP地址)之間的相互轉(zhuǎn)換。
互聯(lián)網(wǎng)上每個接口都具備一個或多個ip地址來標(biāo)識該網(wǎng)絡(luò)接口。IP地址具有一定的結(jié)構(gòu),5類不同的ip地址格式如圖1-2:
1-2
如上所述,有3類報文,分別是單播報文、組播報文與廣播報文,對應(yīng)的有3類ip地址,即單播地址,組播地址和廣播地址。這32位地址通常用點分十進(jìn)制的格式來描述,如C類地址 192.168.225.2。各類地址的IP范圍如圖1-3:
1-3
雖然通過IP地址唯一標(biāo)識一個接口可以順利的找到該網(wǎng)絡(luò)接口,進(jìn)而訪問該主機,但是網(wǎng)絡(luò)接口的32位ip地址(甚至ipv6的128位地址)實在不好記。我們更希望一個主機能直接用一個主機名來描述,這樣才能讓使用者更加方便。因此,在TCP/IP領(lǐng)域中,存在一個域名系統(tǒng),提供主機名與ip地址之間的相互查詢服務(wù),即大名鼎鼎的DNS。
當(dāng)我們數(shù)據(jù)要通過TCP協(xié)議來傳輸時,系統(tǒng)會將我們的數(shù)據(jù)做一層層的封裝,先加上運輸層TCP/UDP協(xié)議的頭部信息,再加上網(wǎng)絡(luò)層IP協(xié)議的頭部,接著加上鏈路層協(xié)議的頭部,最后從指定的端口發(fā)出。其中TCP傳給IP的數(shù)據(jù)單元稱作TCP報文段或簡稱為TCP段(TCP segment)。IP傳給網(wǎng)絡(luò)接口層的數(shù)據(jù)單元稱作IP數(shù)據(jù)報(IP datagram)。通過以太網(wǎng)傳輸?shù)谋忍亓鞣Q作幀(Frame)。
報文若是通過以太網(wǎng)數(shù)據(jù)幀傳輸,那么其數(shù)據(jù)幀大小是有限制的,即其幀長必須在46-1500字節(jié)(數(shù)據(jù)由相關(guān)計算得來,主要與傳輸延時相關(guān))之間。
TCP報文封裝示意圖如圖1-4,UDP報文封裝與TCP報文封裝幾乎一致,UDP報文封裝將TCP首部換成UDP首部即可,且UDP首部長為8字節(jié):
1-4
各個層的協(xié)議都有多種,因此承載各個協(xié)議的分層負(fù)責(zé)標(biāo)識下一層所承載的相關(guān)協(xié)議。具體來說,以太網(wǎng)首部后面可能跟ARP/RARP/VXLAN/MPLS/IP等協(xié)議,因此以太網(wǎng)首部包含一個16位的幀類型字段,用來標(biāo)識后面分層所承載的協(xié)議;相似的有IP層包含一個8位的協(xié)議域字段,用來標(biāo)識后面分層所承載的是ICMP/IGMP/TCP/UDP等協(xié)議;相似的還有TCP/UDP首部包含16位端口號,來標(biāo)識該報文所屬的應(yīng)用程序。
當(dāng)目的主機收到一個報文時,程序就開始一層層的解析,一層層地剝?nèi)ジ鱾€首部,然后找到最終的應(yīng)用程序,將真正的用戶數(shù)據(jù)傳給相對應(yīng)的程序處理。具體如圖1-5:
1-5
從這個架構(gòu)圖上觀察,會發(fā)現(xiàn)ICMP與IGMP協(xié)議是在IP層上,貌似與TCP/UDP屬于同一層,但實際上如上文所述,其實是屬于IP協(xié)議的附屬協(xié)議。ARP與RARP有同樣的問題存在。這只能歸結(jié)為一個問題,即分層協(xié)議設(shè)計的并不完美。
絕大部分的應(yīng)用程序所使用的網(wǎng)絡(luò)模型都是客戶服務(wù)器模型,客戶通過向服務(wù)器發(fā)送請求,接著服務(wù)器應(yīng)答客戶請求的方式,來完成客戶與服務(wù)器之間的交互。
這種交互模型實現(xiàn)又分為兩類,重復(fù)型與并發(fā)型。
重復(fù)型通過以下步驟提供服務(wù):
并發(fā)型通過以下步驟提供服務(wù):
并發(fā)服務(wù)器相比于重復(fù)型服務(wù)器的優(yōu)勢在于,多任務(wù)系統(tǒng)上時可以支持同時處理多個用戶請求。
若想知道哪些服務(wù)是使用tcp/udp承載實現(xiàn)的,那么可以在linux系統(tǒng)下,運行g(shù)rep tcp/udp /etc/services,正常情況下就會羅列出相應(yīng)的服務(wù),可以發(fā)現(xiàn)有些服務(wù)在tcp和udp上都有實現(xiàn),但其對應(yīng)的端口號是不同的。
圖1-6是我在linux系統(tǒng)下運行查詢到的部分截圖:
1-6
可以看到snmp協(xié)議也有承載在tcp協(xié)議上的實現(xiàn),而上文曾提到snmp協(xié)議是屬于udp協(xié)議上的實現(xiàn),因此snmp協(xié)議在udp和tcp協(xié)議上都有實現(xiàn),可通過grep snmp /etc/services命令驗證,如圖1-7:
1-7
可以發(fā)現(xiàn)二者的端口號不同。
使用TCP/IP協(xié)議的應(yīng)用程序通常采用兩種網(wǎng)絡(luò)編程接口,分別是socket和TLI。目前我們更常用的接口是socket接口。網(wǎng)絡(luò)編程的socket接口,后續(xù)會另開章節(jié)補充。
聯(lián)系客服