TCP/IP與OSI參考模型原理
網絡是很重要同時也是很難理解的知識,這篇文章將會用自己容易理解的方式來記錄有關網絡的tcp與osi模型內容,不求專業深刻,但求通俗易懂也好。
OSI參考模型
OSI定義了網絡互連的七層框架(物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層),每一層都有自己相應的功能和協議,並且與相鄰層的接口通信。
各層的作用
關於各層的作用這裏做簡單的概述:OSI參考模型是從下往上以1-7排層級,但這裏根據圖片順序從上向下以1-7的次序簡述每一層作用。
- 應用層
OSI參考模型中最靠近用戶的一層,是為計算機用戶提供應用接口,也為用戶直接提供各種網絡服務。我們常見應用層的網絡服務協議有:HTTP,HTTPS,FTP,POP3、SMTP等。 - 表示層
表示層提供各種用於應用層數據的編碼和轉換功能,確保一個系統的應用層發送的數據能被另一個系統的應用層識別。如果必要,該層可提供一種標準表示形式,用於將計算機內部的多種數據格式轉換成通信中采用的標準表示形式。數據壓縮和加密也是表示層可提供的轉換功能之一。 - 會話層
會話層就是負責建立、管理和終止表示層實體之間的通信會話。該層的通信由不同設備中的應用程序之間的服務請求和響應組成。 - 傳輸層
傳輸層建立了主機端到端的鏈接,傳輸層的作用是為上層協議提供端到端的可靠和透明的數據傳輸服務,包括處理差錯控制和流量控制等問題。該層向高層屏蔽了下層數據通信的細節,使高層用戶看到的只是在兩個傳輸實體間的一條主機到主機的、可由用戶控制和設定的、可靠的數據通路。我們通常說的,TCP UDP就是在這一層。端口號既是這裏的“端”。 - 網絡層
本層通過IP尋址來建立兩個節點之間的連接,為源端的運輸層送來的分組,選擇合適的路由和交換節點,正確無誤地按照地址傳送給目的端的運輸層。就是通常說的IP層。這一層就是我們經常說的IP協議層。 - 數據鏈路層
將比特組合成字節,再將字節組合成幀,使用鏈路層地址 (以太網使用MAC地址)來訪問介質,並進行差錯檢測。
數據鏈路層又分為2個子層:邏輯鏈路控制子層(LLC)和媒體訪問控制子層(MAC)。
7.物理層
實際最終信號的傳輸是通過物理層實現的。通過物理介質傳輸比特流。規定了電平、速度和電纜針腳。常用設備有(各種物理設備)集線器、中繼器、調制解調器、網線、雙絞線、同軸電纜。這些都是物理層的傳輸介質。
在實際應用中,人們通常把OSI的七層模型對應層TCP/IP的五層模型
在每一層都工作著不同的設備,比如我們常用的交換機就工作在數據鏈路層的,一般的路由器是工作在網絡層的。
在每一層實現的協議也各不同,即每一層的服務也不同.下圖列出了每層主要的協議。
介紹完網絡的分層模型再看一下tcp/ip數據包的解封裝過程,我簡單的理解為:tcp/ip在數據收發的過程就是不斷的封包和解包的過程。
在用戶發出數據請求後,數據經過各層時都會被封裝一層頭部信息,當數據傳到目的主機時,對方接受數據時又層層解封裝。
tcp/ip的傳輸原理
tcp/ip在通信過程中通過數據包報文的方式進行通信。下圖是tcp的報文格式
tcp報文中比較重要的信息
- 序號:Seq序號,占32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
- 確認序號:Ack序號,占32位,只有ACK標誌位為1時,確認序號字段才有效,Ack=Seq+1。
- 標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
- URG:緊急指針(urgent pointer)有效。
- ACK:確認序號有效。
- PSH:接收方應該盡快將這個報文交給應用層。
- RST:重置連接。
- SYN:發起一個新連接。
- FIN:釋放一個連接。
需要註意的是:
(A)不要將確認序號Ack與標誌位中的ACK搞混。
(B)確認方Ack=發起方Req+1,兩端配對。
tcp的三次握手與四次揮手
三次握手
所謂三次握手即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發,整個流程如下圖所示:
最開始的時候客戶端和服務器都是處於CLOSED狀態。主動打開連接的為客戶端,被動打開連接的是服務器。
TCP服務器進程先創建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態;第一次握手
TCP客戶進程也是先創建傳輸控制塊TCB,然後向服務器發出連接請求報文:Client將標誌位SYN置為1,隨機產生一個值seq=x,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。第二次握手
Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置為1,ack=x+1,隨機產生一個值seq=y,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。第三次握手
Client收到確認後,檢查ack是否為x+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=y+1,並向服務端發出確認信息,Server檢查ack是否為y+1,ACK是否為1,序列號seq=x+1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。
四次揮手
所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:
由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。
第一次揮手
客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。第二次揮手
服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。
客戶端進入FIN-WAIT-2
客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最後的數據)。第三次揮手
服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。第四次揮手
客戶端收到服務器的連接釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。(註意此時TCP連接還沒有釋放,必須經過2?MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
)
服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。
結合上面的分解過程,再看一下整個握手揮手的過程
TCP/IP與OSI參考模型原理