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