如果我們想了解TCP/IP的參考模型,首先我們要對開放系統互連參考模型(Open System Interconnect 簡稱OSI)有一定的瞭解,這樣有助於加深對TCP/IP的理解。
一、開放系統互連參考模型(Open System Interconnect 簡稱OSI)
開放系統互連參考模型 (Open System Interconnect 簡稱OSI)是國際標準化組織(ISO)和國際電報電話諮詢委員會(CCITT)聯合制定的開放系統互連參考模型,為開放式互連資訊系統提供了一種功能結構的框架。它從低到高分別是:物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。
概述
開放系統互連參考模型為實現開放系統互連所建立的通訊功能分層模型,簡稱OSI參考模型。其目的是為異種計算機互連提供一個共同的基礎和標準框架,併為保持相關標準的一致性和相容性提供共同的參考。這裡所說的開放系統,實質上指的是遵循OSI參考模型和相關協議能夠實現互連的具有各種應用目的的計算機系統。
OSI參考模型是計算機網路體系結構發展的產物。它的基本內容是開放系統通訊功能的分層結構。這個模型把開放系統的通訊功能劃分為七個層次,從鄰接物理媒體的層次開始,分別賦於1,2,……7層的順序編號,相應地稱之為物理層、資料鏈路層、網路層、運輸層、會話層、表示層和應用層。每一層的功能是獨立的。它利用其下一層提供的服務併為其上一層提供服務,而與其他層的具體實現無關。這裡所謂的“服務”就是下一層向上一層提供的通訊功能和層之間的會話規定,一般用通訊原語實現。兩個開放系統中的同等層之間的通訊規則和約定稱之為協議。通常把1~4層協議稱為下層協議,5~7層協議稱為上層協議。OSI七層模型每層的功能簡介
- 應用層(Application) 提供網路與使用者應用軟體之間的介面服務
- 表示層(Presentation) 提供格式化的表示和轉換資料服務,如加密和壓縮
- 會話層(Session) 提供包括訪問驗證和會話管理在內的建立和維護應用之間通訊的機制
- 傳輸層(Transimission) 提供建立、維護和取消傳輸連線功能,負責可靠地傳輸資料(PC)
- 網路層(Network) 處理網路間路由,確保資料及時傳送(路由器)
- 資料鏈路層(DataLink) 負責無錯傳輸資料,確認幀、發錯重傳等(交換機)
- 物理層(Physics) 提供機械、電氣、功能和過程特性(網路卡、網線、雙絞線、同軸電纜、中繼器)
二、TCP/IP參考模型
TCP/IP是傳輸控制協議/網路互聯協議的簡稱 早期的TCP/IP模型是一個四層結構,從下往上依次是網路介面層、網際網路層、傳輸層和應用層 後來在使用過程中,借鑑OSI七層參考模型,將網路介面層劃分為了物理層和資料鏈路層,形成五層結構
常用協議
TCP/IP協議被稱為傳輸控制協議/網際網路協議,又稱網路通訊協議 是由網路層的IP協議和傳輸層的TCP協議組成,是一個很大的協議集合 物理層和資料鏈路層沒有定義任何特定協議,支援所有的標準和專用的協議
網路層定義了網路互聯也就是IP協議
- 網際協議IP(Internet Protocal) 負責主機和網路之間定址和路由資料包
- 地址解析協議ARP(Address Resolution Protocol) 獲得同一物理網路中的硬體主機MAC地址
- 反向地址轉換協議(Reverse Address Resolution Protocol) 允許區域網的物理機器從閘道器伺服器的ARP表或者快取上請求其IP地址
- 網際控制訊息協議ICMP(Internet Control Message Protocol) 傳送訊息,並報告有關資料包的傳送錯誤
- 互聯組管理協議IGMP(Internet Group Management Protocol) IP主機向本地多路廣播路由器報告主機組成員
傳輸層定義了TCP(傳輸控制協議)和UDP(使用者資料包)協議 應用層定義了HTTP(超文字傳輸協議)、FTP(檔案傳輸協議)、DNS(域名系統)等協議
TCP/IP參考模型個別層上的協議名和資料名稱
X層 | 協議名稱 | 資料名稱 |
---|---|---|
傳輸層(Transport) | TCP | 塊(Segment) |
網路層(Network) | IP | 包(Packet) |
資料鏈路層(Data Link) | ARP | 幀(Frame) |
資料從應用層發下來,會在每一層都會加上頭部資訊,進行封裝,然後再傳送到資料接收端。這個基本的流程你需要知道,就是每個資料都會經過資料的封裝和解封裝的過程。
TCP協議格式
如圖:
每個部分的功能
- Source Port和Destination Port:分別佔用16位,表示源埠號和目的埠號;用於區別主機中的不同程式,而IP地址是用來區分不同的主機的,源埠號和目的埠號配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個TCP連線;
- Sequence Number:用來標識從TCP發端向TCP收端傳送的資料位元組流,它表示在這個報文段中的的第一個資料位元組在資料流中的序號;主要用來解決網路報亂序的問題;
- Acknowledgment Number:32位確認序列號包含傳送確認的一端所期望收到的下一個序號,因此,確認序號應當是上次已成功收到資料位元組序號加1。不過,只有當標誌位中的ACK標誌(下面介紹)為1時該確認序列號的欄位才有效。主要用來解決不丟包的問題;
- Offset:給出首部中32 bit字的數目,需要這個值是因為任選欄位的長度是可變的。這個欄位佔4bit(最多能表示15個32bit的的字,即4*15=60個位元組的首部長度),因此TCP最多有60位元組的首部。然而,沒有任選欄位,正常的長度是20位元組;
- Window:視窗大小,也就是有名的滑動視窗,用來進行流量控制;這是一個複雜的問題,這篇博文中並不會進行總結的;
- TCP Flags:TCP首部中有6個標誌位元,它們中的多個可同時被設定為1,主要是用於操控TCP的狀態機的,依次為URG,ACK,PSH,RST,SYN,FIN。每個標誌位的意思如下:
URG:此標誌表示TCP包的緊急指標域(後面馬上就要說到)有效,用來保證TCP連線不被中斷,並且督促中間層裝置要儘快處理這些資料;
ACK:此標誌表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP資料包中;有兩個取值:0和1,為1的時候表示應答域有效,反之為0;
PSH:這個標誌位表示Push操作。所謂Push操作就是指在資料包到達接收端以後,立即傳送給應用程式,而不是在緩衝區中排隊;
RST:這個標誌表示連線復位請求。用來複位那些產生錯誤的連線,也被用來拒絕錯誤和非法的資料包;
SYN:表示同步序號,用來建立連線。SYN標誌位和ACK標誌位搭配使用,當連線請求的時候,SYN=1,ACK=0;連線被響應的時候,SYN=1,ACK=1;這個標誌的資料包經常被用來進行埠掃描。掃描者傳送一個只有SYN的資料包,如果對方主機響應了一個資料包回來 ,就表明這臺主機存在這個埠;但是由於這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全的主機將會強制要求一個連線嚴格的進行TCP的三次握手;
FIN: 表示傳送端已經達到資料末尾,也就是說雙方的資料傳送完成,沒有資料可以傳送了,傳送FIN標誌位的TCP資料包後,連線將被斷開。這個標誌的資料包也經常被用於進行埠掃描。
三次握手和四次揮手
三次握手
- 第一次握手:建立連線。客戶端傳送連線請求報文段,將SYN位置為1,Sequence Number為x;然後,客戶端進入SYN_SEND狀態,等待伺服器的確認;
- 第二次握手:伺服器收到SYN報文段。伺服器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設定Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要傳送SYN請求資訊,將SYN位置為1,Sequence Number為y;伺服器端將上述所有資訊放到一個報文段(即SYN+ACK報文段)中,一併傳送給客戶端,此時伺服器進入SYN_RECV狀態;
- 第三次握手:客戶端收到伺服器的SYN+ACK報文段。然後將Acknowledgment Number設定為y+1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。
完成了三次握手,客戶端和伺服器端就可以開始傳送資料。以上就是TCP三次握手的總體介紹。
四次分手
當客戶端和伺服器通過三次握手建立了TCP連線以後,當資料傳送完畢,肯定是要斷開TCP連線的啊。那對於TCP的斷開連線,這裡就有了神祕的“四次分手”。
- 第一次分手:主機1(可以使客戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機2傳送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了;
- 第二次分手:主機2收到了主機1傳送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我“同意”你的關閉請求;
- 第三次分手:主機2向主機1傳送FIN報文段,請求關閉連線,同時主機2進入LAST_ACK狀態;
- 第四次分手:主機1收到主機2傳送的FIN報文段,向主機2傳送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連線;此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連線了。
到這裡我們是不是非常疑惑,為什麼要三次握手、四次分手呢?
先來回答為什麼要三次握手?
在謝希仁著《計算機網路》第四版中講“三次握手”的目的是“為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤”。在另一部經典的《計算機網路》一書中講“三次握手”的目的是為了解決“網路中存在延遲的重複分組”的問題。
在謝希仁著《計算機網路》書中同時舉了一個例子,如下:
“已失效的連線請求報文段”的產生在這樣一種情況下:client發出的第一個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的一個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用“三次握手”,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。”
總結:三次握手是為了防止了伺服器端的一直等待而浪費資源。
為什麼要四次分手?
那四次分手又是為何呢?TCP協議是一種面向連線的、可靠的、基於位元組流的運輸層通訊協議。TCP是全雙工模式,這就意味著,當主機1發出FIN報文段時,只是表示主機1已經沒有資料要傳送了,主機1告訴主機2,它的資料已經全部傳送完畢了;但是,這個時候主機1還是可以接受來自主機2的資料;當主機2返回ACK報文段時,表示它已經知道主機1沒有資料傳送了,但是主機2還是可以傳送資料到主機1的;當主機2也傳送了FIN報文段時,這個時候就表示主機2也沒有資料要傳送了,就會告訴主機1,我也沒有資料要傳送了,之後彼此就會愉快的中斷這次TCP連線。
TCP功能
- 將資料進行分段打包傳輸
- 對每個資料包編號控制順序
- 運輸中丟失、重發和丟棄處理
- 流量控制避免擁塞
推薦文章