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