OSI七層模型與Linux內核態、用戶態之間關係梳理

場景:關於Java應用跨主機網絡請求的流轉情況,涉及的知識點總結如下:

 

一、什麼是OSI七層模型

 

七層模型,亦稱OSI(Open System Interconnection)參考模型,是參考模型是國際標準化組織(ISO)制定的一個用於計算機或通信系統間互聯的標準體系。它是一個七層的、抽象的模型體,不僅包括一系列抽象的術語或概念,也包括具體的協議。

 

七層模型從上到下依次是:

 

場景:關於Java應用跨主機網絡請求的流轉情況,涉及的知識點總結如下:

 

一、什麼是OSI七層模型

 

七層模型,亦稱OSI(Open System Interconnection)參考模型,是參考模型是國際標準化組織(ISO)制定的一個用於計算機或通信系統間互聯的標準體系。它是一個七層的、抽象的模型體,不僅包括一系列抽象的術語或概念,也包括具體的協議。

 

七層模型從上到下依次是:

 

 

  • 應用層:網絡服務的接口,協議有:HTTP 、FTP 、TFTP、 SMTP 、SNMP 、DNS、 TELNET 、HTTPS 、POP3 、DHCP
  • 表示層:提供數據格式轉換服務,包括數據的表示、安全、壓縮。格式有JPEG、ASCll、DECOIC、加密格式等

備註:它的主要作用之一是爲異種機通信提供一種公共語言,以便能進行互操作。這種類型的服務之所以需要,是因爲不同的計算機體系結構使用的數據表示法不同。與第五層提供透明的數據運輸不同,表示層是處理所有與數據表示及運輸有關的問題,包括轉換、加密和壓縮。每臺計算機可能有它自己的表示數據的內部方法,例如,ASCII碼與EBCDIC碼,所以需要表示層協定來保證不同的計算機可以彼此理解。

 

  • 會話層:建立、管理、終止會話。對應主機進程,指本地主機與遠程主機正在進行的會話
  • 傳輸層:提供應用進程間的邏輯通訊,定義傳輸數據的協議端口號,以及流控和差錯校驗。協議有:TCP UDP,數據包一旦離開網卡即進入網絡傳輸層
  • 網絡層:進行邏輯地址尋址,實現不同網絡之間的路徑選擇。協議有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
  • 數據鏈路層:建立邏輯連接、進行硬件地址尋址、差錯校驗等功能。將比特組合成字節進而組合成幀,用MAC地址訪問介質,錯誤發現但不能糾正。
  • 物理層:建立、維護、斷開物理連接。

 

二、OSI七層模型與TCP/IP模型之間的關係

 

 

 

三、跨主機應用之間的請求流轉與七層模型的關係

 

 

四、系統內核中用戶態與內核態關係

 

1.用戶態和內核態的概念區別

 

從特權級的調度來理解用戶態和內核態就比較好理解,當程序運行在3級特權級上時,就可以稱之爲運行在用戶態,因爲這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;反之,當程序運行在0級特權級上時,就可以稱之爲運行在內核態。

 

2.用戶態和內核態的轉換

 

1)用戶態切換到內核態的3種方式

 

a. 系統調用

這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使 用操作系統提供的服務程序完成工作,比如前例中fork()實際上就是執行了一個創建新進程的系統調用。而系統調用的機制其核心還是使用了操作系統爲用戶 特別開放的一箇中斷來實現,例如Linux的int 80h中斷。

 

b. 異常

當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。

 

c. 外圍設備的中斷

當外圍設備完成用戶請求的操作後,會向CPU發出相應的中斷信號,這時CPU會 暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了由用戶態到 內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。

 

這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認爲是用戶進程主動發起的,異常和外圍設備中斷則是被動的。

 

2)具體的切換操作

 

從出發方式看,可以在認爲存在前述3種不同的類型,但是從最終實際完成由用戶態到內核態的切換操作上來說,涉及的關鍵步驟是完全一樣的,沒有任何區別,都相當於執行了一箇中斷響應的過程,因爲系統調用實際上最終是中斷機制實現的,而異常和中斷處理機制基本上是一樣的,用戶態切換到內核態的步驟主要包括:

a.從當前進程的描述符中提取其內核棧的ss0及esp0信息。

b.使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,這個過程也完成了由用

戶棧找到內核棧的切換過程,同時保存了被暫停執行的程序的下一條指令。

c.將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器,開始執行中斷處理程序,這

時就轉到了內核態的程序執行了。

 

3)用戶態、內核態直接涉及的網絡IO

 

主要關鍵詞:IO同步、IO異步、阻塞、非阻塞

正文名詞解釋: send、recv 、flags

send 和recv:

每個TCP socket在內核中都有一個發送緩衝區和一個接收緩衝區,TCP的全雙工的工作模式以及TCP的流量(擁塞)控制便是依賴於這兩個獨立的buffer以及buffer的填充狀態。接收緩衝區把數據緩存入內核,應用進程一直沒有調用recv()進行讀取的話,此數據會一直緩存在相應socket的接收緩衝區內。再囉嗦一點,不管進程是否調用recv()讀取socket,對端發來的數據都會經由內核接收並且緩存到socket的內核接收緩衝區之中。recv()所做的工作,就是把內核緩衝區中的數據拷貝到應用層用戶的buffer裏面,並返回,僅此而已。進程調用send()發送的數據的時候,最簡單情況(也是一般情況),將數據拷貝進入socket的內核發送緩衝區之中,然後send便會在上層返回。換句話說,send()返回之時,數據不一定會發送到對端去(和write寫文件有點類似),send()僅僅是把應用層buffer的數據拷貝進socket的內核發送buffer中,發送是TCP的事情,和send其實沒有太大關係。接收緩衝區被TCP用來緩存網絡上來的數據,一直保存到應用進程讀走爲止。對於TCP,如果應用進程一直沒有讀取,接收緩衝區滿了之後,發生的動作是:收端通知發端,接收窗口關閉(win=0)。這個便是滑動窗口的實現。保證TCP套接口接收緩衝區不會溢出,從而保證了TCP是可靠傳輸。因爲對方不允許發出超過所通告窗口大小的數據。 這就是TCP的流量控制,如果對方無視窗口大小而發出了超過窗口大小的數據,則接收方TCP將丟棄它。

 

flags:

參考文章:https://www.cnblogs.com/fanweisheng/p/11142059.html

 

 

POSIX(可移植操作系統接口)把同步IO操作定義爲導致進程阻塞直到IO完成的操作,反之則是異步IO

IO同步可分爲(阻塞和非阻塞類型)

 

a.阻塞IO模型(進程在內核狀態下等待)

使用recv的默認參數一直等數據直到拷貝到用戶空間,這段時間內進程始終阻塞。A同學用杯子裝水,打開水龍頭裝滿水然後離開。這一過程就可以看成是使用了阻塞IO模型,因爲如果水龍頭沒有水,他也要等到有水並裝滿杯子才能離開去做別的事情。很顯然,這種IO模型是同步的。

 

b.非阻塞IO模型

改變flags,讓recv不管有沒有獲取到數據都返回,如果沒有數據那麼一段時間後再調用recv看看,如此循環。B同學也用杯子裝水,打開水龍頭後發現沒有水,它離開了,過一會他又拿着杯子來看看……在中間離開的這些時間裏,B同學離開了裝水現場(回到用戶進程空間),可以做他自己的事情。這就是非阻塞IO模型。但是它只有是檢查無數據的時候是非阻塞的,在數據到達的時候依然要等待複製數據到用戶空間(等着水將水杯裝滿),因此它還是同步IO。

 

注:紅色字體是與異步IO的最大區別

 

c.IO複用模型

這裏在調用recv前先調用select或者poll,這2個系統調用都可以在內核準備好數據(網絡數據到達內核)時告知用戶進程,這個時候再調用recv一定是有數據的。因此這一過程中它是阻塞於select或poll,而沒有阻塞於recv,有人將非阻塞IO定義成在讀寫操作時沒有阻塞於系統調用的IO操作(不包括數據從內核複製到用戶空間時的阻塞,因爲這相對於網絡IO來說確實很短暫),如果按這樣理解,這種IO模型也能稱之爲非阻塞IO模型,但是按POSIX來看,它也是同步IO,也和樓上一樣稱之爲同步非阻塞IO。

 

這種IO模型比較特別,分個段。因爲它能同時監聽多個文件描述符(fd)。這個時候C同學來裝水,發現有一排水龍頭,舍管阿姨告訴他這些水龍頭都還沒有水,等有水了告訴他。於是等啊等(select調用中),過了一會阿姨告訴他有水了,但不知道是哪個水龍頭有水,自己看吧。於是C同學一個個打開,往杯子裏裝水(recv)。這裏再順便說說鼎鼎大名的epoll(高性能的代名詞啊),epoll也屬於IO複用模型,主要區別在於舍管阿姨會告訴C同學哪幾個水龍頭有水了,不需要一個個打開看。

 

d.信號驅動IO模型

通過調用sigaction註冊信號函數,等內核數據準備好的時候系統中斷當前程序,執行信號函數(在這裏面調用recv)。D同學讓舍管阿姨等有水的時候通知他(註冊信號函數),沒多久D同學得知有水了,跑去裝水。是不是很像異步IO?很遺憾,它還是同步IO(省不了裝水的時間啊)。

 

e.異步IO模型

調用aio_read,讓內核等數據準備好,並且複製到用戶進程空間後執行事先指定好的函數。E同學讓舍管阿姨將杯子裝滿水後通知他。整個過程E同學都可以做別的事情(沒有recv),這纔是真正的異步

 

總結 :

IO分兩階段:

1.數據準備階段 2.內核空間複製回用戶進程緩衝區階段 一般來講:阻塞IO模型、非阻塞IO模型、IO複用模型(select/poll/epoll)、信號驅動IO模型都屬於同步IO,因爲階段2是阻塞的(儘管時間很短)。只有異步IO模型是符合POSIX異步IO操作含義,不管在階段1還是階段2都可以幹別的事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章