深刻理解TCP/IP協議

若是咱們想了解TCP/IP的參考模型,首先咱們要對開放系統互連參考模型(Open System Interconnect 簡稱OSI)有必定的瞭解,這樣有助於加深對TCP/IP的理解。git

1、開放系統互連參考模型(Open System Interconnect 簡稱OSI)

開放系統互連參考模型 (Open System Interconnect 簡稱OSI)是國際標準化組織(ISO)和國際電報電話諮詢委員會(CCITT)聯合制定的開放系統互連參考模型,爲開放式互連信息系統提供了一種功能結構的框架。它從低到高分別是:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。github

概述

開放系統互連參考模型爲實現開放系統互連所創建的通訊功能分層模型,簡稱OSI參考模型。其目的是爲異種計算機互連提供一個共同的基礎和標準框架,併爲保持相關標準的一致性和兼容性提供共同的參考。這裏所說的開放系統,實質上指的是遵循OSI參考模型和相關協議可以實現互連的具備各類應用目的的計算機系統。 緩存

OSI參考模型是計算機網路體系結構發展的產物。它的基本內容是開放系統通訊功能的分層結構。這個模型把開放系統的通訊功能劃分爲七個層次,從鄰接物理媒體的層次開始,分別賦於1,2,……7層的順序編號,相應地稱之爲物理層、數據鏈路層、網絡層、運輸層、會話層、表示層和應用層。每一層的功能是獨立的。它利用其下一層提供的服務併爲其上一層提供服務,而與其餘層的具體實現無關。這裏所謂的「服務」就是下一層向上一層提供的通訊功能和層之間的會話規定,通常用通訊原語實現。兩個開放系統中的同等層之間的通訊規則和約定稱之爲協議。一般把1~4層協議稱爲下層協議,5~7層協議稱爲上層協議。

OSI七層模型每層的功能簡介

  1. 應用層(Application) 提供網絡與用戶應用軟件之間的接口服務
  2. 表示層(Presentation) 提供格式化的表示和轉換數據服務,如加密和壓縮
  3. 會話層(Session) 提供包括訪問驗證和會話管理在內的創建和維護應用之間通訊的機制
  4. 傳輸層(Transimission) 提供創建、維護和取消傳輸鏈接功能,負責可靠地傳輸數據(PC)
  5. 網絡層(Network) 處理網絡間路由,確保數據及時傳送(路由器)
  6. 數據鏈路層(DataLink) 負責無錯傳輸數據,確認幀、發錯重傳等(交換機)
  7. 物理層(Physics) 提供機械、電氣、功能和過程特性(網卡、網線、雙絞線、同軸電纜、中繼器)

2、TCP/IP參考模型

TCP/IP是傳輸控制協議/網絡互聯協議的簡稱 早期的TCP/IP模型是一個四層結構,從下往上依次是網絡接口層、互聯網層、傳輸層和應用層 後來在使用過程當中,借鑑OSI七層參考模型,將網絡接口層劃分爲了物理層和數據鏈路層,造成五層結構安全

經常使用協議

TCP/IP協議被稱爲傳輸控制協議/互聯網協議,又稱網絡通信協議 是由網絡層的IP協議和傳輸層的TCP協議組成,是一個很大的協議集合 物理層和數據鏈路層沒有定義任何特定協議,支持全部的標準和專用的協議服務器

網絡層定義了網絡互聯也就是IP協議
  1. 網際協議IP(Internet Protocal) 負責主機和網絡之間尋址和路由數據包
  2. 地址解析協議ARP(Address Resolution Protocol) 得到同一物理網絡中的硬件主機MAC地址
  3. 反向地址轉換協議(Reverse Address Resolution Protocol) 容許局域網的物理機器從網關服務器的ARP表或者緩存上請求其IP地址
  4. 網際控制消息協議ICMP(Internet Control Message Protocol) 發送消息,並報告有關數據包的傳送錯誤
  5. 互聯組管理協議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協議格式

如圖: 框架

每一個部分的功能
  1. Source Port和Destination Port:分別佔用16位,表示源端口號和目的端口號;用於區別主機中的不一樣進程,而IP地址是用來區分不一樣的主機的,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能惟一的肯定一個TCP鏈接;
  2. Sequence Number:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據字節在數據流中的序號;主要用來解決網絡報亂序的問題;
  3. Acknowledgment Number:32位確認序列號包含發送確認的一端所指望收到的下一個序號,所以,確認序號應當是上次已成功收到數據字節序號加1。不過,只有當標誌位中的ACK標誌(下面介紹)爲1時該確認序列號的字段纔有效。主要用來解決不丟包的問題;
  4. Offset:給出首部中32 bit字的數目,須要這個值是由於任選字段的長度是可變的。這個字段佔4bit(最多能表示15個32bit的的字,即4*15=60個字節的首部長度),所以TCP最多有60字節的首部。然而,沒有任選字段,正常的長度是20字節;
  5. Window:窗口大小,也就是有名的滑動窗口,用來進行流量控制;這是一個複雜的問題,這篇博文中並不會進行總結的;
  6. 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數據包後,鏈接將被斷開。這個標誌的數據包也常常被用於進行端口掃描。

三次握手和四次揮手

三次握手
  1. 第一次握手:創建鏈接。客戶端發送鏈接請求報文段,將SYN位置爲1,Sequence Number爲x;而後,客戶端進入SYN_SEND狀態,等待服務器的確認;
  2. 第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,須要對這個SYN報文段進行確認,設置Acknowledgment Number爲x+1(Sequence Number+1);同時,本身本身還要發送SYN請求信息,將SYN位置爲1,Sequence Number爲y;服務器端將上述全部信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態;
  3. 第三次握手:客戶端收到服務器的SYN+ACK報文段。而後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。

完成了三次握手,客戶端和服務器端就能夠開始傳送數據。以上就是TCP三次握手的整體介紹。

四次分手

當客戶端和服務器經過三次握手創建了TCP鏈接之後,當數據傳送完畢,確定是要斷開TCP鏈接的啊。那對於TCP的斷開鏈接,這裏就有了神祕的「四次分手」。

  1. 第一次分手:主機1(可使客戶端,也能夠是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了;
  2. 第二次分手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number爲Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我「贊成」你的關閉請求;
  3. 第三次分手:主機2向主機1發送FIN報文段,請求關閉鏈接,同時主機2進入LAST_ACK狀態;
  4. 第四次分手:主機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功能

  1. 將數據進行分段打包傳輸
  2. 對每一個數據包編號控制順序
  3. 運輸中丟失、重發和丟棄處理
  4. 流量控制避免擁塞

推薦文章

相關文章
相關標籤/搜索