1. 程式人生 > >OSI七層模型和TCP/IP四層模型(二)

OSI七層模型和TCP/IP四層模型(二)

今年企業對Java開發的市場需求,你看懂了嗎? >>>   

二、自下而上的網路分層

1.物理層

電腦要組網,第一件事要幹什麼?當然是先把電腦連起來,可以用光纜、電纜、雙絞線、無線電波(WiFi)等方式。物理層的作用就是通過物理手段把電腦連線起來,它主要規定了網路的一些電氣特性,作用是負責傳送0和1的電訊號。

這裡說一下,通過物理手段將裝置連線起來組網,物理手段就是光纜、電纜、雙絞線、無線電波(WiFi)等,比如中美之間的網路通訊是通過海底光纜;兩個不同的區域網(電信的網路和移動的網路)通訊,嗯,稍微麻煩點,我的電信手機先連上電信的伺服器,你的移動手機連移動伺服器,他們兩個ISP(Internet Service Provider 網際網路服務提供商)之間是通過物理手段連結的,這樣我們就能夠間接的實現通訊了。

網際網路可以說就是用物理裝置將各個“區域網”相連組成的更大的“區域網“,更大區域網層層相連,最終就組成了”網際網路“,比如小的網際網路就是你家和我家的WiFi,一個省的每戶家庭的WiFi組成這個省的區域網,各個省的區域網組成中國的區域網,各個國家之間的區域網通過物理手段互聯就組成了橫跨世界的”網際網路“(當然天朝還有一堵牆)。

2.資料鏈路層

1)定義

物理層就是傳輸電路的0和1訊號的,但是單純的0和1沒有意義,必須規定解讀方式:多少個0和1算一組?每個訊號有什麼意義?——這就是鏈路層的意義,它在物理層的上方,確定了0和1的分組方式。

2)乙太網協議

早些時候,各個公司都有自己的電訊號分組方式,後來出現了“乙太網”這種協議逐漸佔據了主導的地位。“乙太網”規定,一組電訊號構成一個數據包,叫做“幀(Frame)”;每一幀分成兩個個部分:標頭(Head)和資料(Data)。

因此,資料鏈路層鏈路層的資料包就叫“乙太網資料包”,他由“標頭”和“資料”兩部分組成——其中,“標頭”包含資料包的一些說明項,比如傳送者、接受者、資料型別等等。

3)MAC地址

上面我們提到,乙太網資料包的“標頭”包含了傳送者和接受者的資訊,那麼,傳送者和接受者是如何標識的呢?

  • 乙太網規定,連入網路的所有裝置,都必須具有“網絡卡”介面。資料包必須是從一塊網絡卡,傳送到另一塊網絡卡,網絡卡的地址,就是資料包的傳送地址和接受地址,也叫MAC地址。

  • 每塊網絡卡出廠的時候,都有全世界獨一無二的MAC地址,長度是48位的二進位制,通常用12個十六進位制數表示。

  • 前6個十六進位制是廠商編號,後6個是該廠商的網絡卡流水號,有了MAC地址,就可以定位網絡卡和資料包的路徑了。

4)廣播

定義地址只是第一步,後面還有更多步驟—首先,一塊網絡卡怎麼只帶另一塊網絡卡的MAC地址?回答是有一種ARP協議,可以解決這個問題。這個留到後面介紹,這裡只需要知道,乙太網資料包必須知道接收方的MAC地址,然後才能傳送

其次,就算有了MAC地址,系統怎樣才能把資料包準確送到接收方?回答是乙太網採用了一種很"原始"的廣播式的方式,它不是把資料包準確送到接收方,而是向本網路(區域網)內所有計算機發送,讓每臺計算機自己判斷,是否為接收方。

一臺計算機向本區域網內的所有電腦均傳送相同的資料包,其他計算機收到這個資料包之後,會讀取這個資料包的“標頭”,找到其中接收方(目標方)的MAC地址,然後與自身的MAC地址進行比對,如果兩者相同,說明就是要發給自己的,然後接受這個包並做出進一步的處理,否則丟棄這個包。這種傳送方式就叫“廣播”,主要通過分組交換機或者網路交換機進行。

3.網路層

根據上面的講解,理論上依靠MAC地址和廣播技術,上海的網絡卡發出的資料包就可以找到洛杉磯網絡卡了——但是如果全世界的計算機都這麼幹,那麼每一臺計算機發出的資料包都同步廣播到全世界其他電腦,再一一比對判斷,這樣顯然是低效、不現實的。

因此,上面我們強調,廣播是在傳送者所在的區域網內廣播的,不同也就是說,如果兩臺計算機沒有在同一個子網(區域網)內,是無法通過廣播直接傳過去的。前面我們說過,網際網路是由一個個子網組成的更大的子網,一級一級組網,最終構成的網際網路。

因此我們必須找到一種方法,區分哪些MAC地址屬於同一個子網。如果是同一個子網就採用廣播的形式,如果不是,則採用“路由”的方式(後面會講)傳送——這就導致了網路層的出現,他的作用是引入一套新的地址,使我們能夠區分哪些計算機屬於同一個子網,這套機制就叫做“網路地址”,也就是“IP地址”。

1)IP協議

規定網路地址的協議,叫IP協議。他定義的地址,就叫做“IP地址”。IP地址目前有IPV4(Internet Protocol version 4,IPv4)和IPV6(Internet Protocol version 4,IPv6)兩版,又稱“網際網路通訊協議第四/六版”。2011年,IANA IPv4 pool地址完全用盡時,IPv6仍處在部署的初期,因此IPV4地址也是目前最為廣泛的IP地址——這個版本規定,網路地址由32個二進位制位組成,習慣上,我們分成四段十進位制數表示IPV4地址,從0.0.0.0到255.255.255.255。

網際網路的每一臺計算機,都會被分配到一個IP地址,這個地址由兩部分組成,前一部分代表網路,後一部分代表主機(又稱終端系統,end system)。 比如,IP地址172.16.254.1,這是一個32位的地址,假定它的網路部分是前24位(172.16.254),那麼主機部分就是後8位(最後的那個1)。處於同一個子網路的電腦,它們IP地址的網路部分必定是相同的,也就是說172.16.254.2應該與172.16.254.1處在同一個子網路,而後面的“2”與“1”則是同一子網內兩臺不同電腦(主機)的編號。

2)子網掩碼

問題在於單單從IP地址,我們無法判斷網路部分。還是以172.16.254.1為例,它的網路部分,到底是前24位,還是前16位,甚至前28位,從IP地址上是看不出來的。那麼,怎樣才能從IP地址,判斷兩臺計算機是否屬於同一個子網路呢?這就要用到另一個引數**"子網掩碼"**(subnet mask)。

** 所謂"子網掩碼",就是表示子網路特徵的一個引數。它在形式上等同於IP地址,也是一個32位二進位制數字,它的網路部分全部為1,主機部分全部為0。**比如,IP地址172.16.254.1,如果已知網路部分是前24位,主機部分是後8位,那麼子網路掩碼就是11111111.11111111.11111111.00000000,寫成十進位制就是255.255.255.0。

知道"子網掩碼",我們就能判斷,任意兩個IP地址是否處在同一個子網路。方法是將兩個IP地址與子網掩碼分別進行AND運算(兩個數位都為1,運算結果為1,否則為0),然後比較結果是否相同,如果是的話,就表明它們在同一個子網路中,否則就不是。

3)路由/路由器/閘道器/交換機

上面我們已經確定了兩臺計算機是否在同一個子網中,如果在,則採用廣播+MAC定址的的方式傳送資料包,如果不是,則要採用“路由”的方式了,那麼什麼是“路由”呢?

路由(routing)

就是通過互聯的網路把資訊從源地址傳輸到目的地址的活動。路由引導分組轉送,經過中間的一些節點,到它們最後的目的地。

從“路由”的定義中可以看到,“路由”是一種活動,一種動作,一種行為,作用是是將資訊從原地址傳輸到目的地址,比較特殊的是,原地址和目標地址是在兩個不同的子網中的。 那麼如何傳輸呢?路由定義一條路徑,經過因特網傳送包到另一網路上的地址,但路由不定義完全路徑,只定義從主機到可以將包轉發到目的地的閘道器(子網)間的路徑段(或從一個子網到另一個子網)。

路由器(Router)

簡單理解就是實現路由功能的機器。路由器連線兩個或多個網路並提供路由功能。

前面我們說過,網絡卡是計算機的一個硬體,它在接收到網路資訊之後,將資訊交給計算機。當計算機需要傳送資訊的時候,也要通過網絡卡傳送。一臺計算機可以有不只一個網絡卡,比如筆記本就有一個乙太網卡和一個WiFi網絡卡。計算機在接收或者傳送資訊的時候,要先決定想要通過哪個網絡卡。路由器(router)可以通俗理解為一臺配備有多個網絡卡的專用電腦,它讓網絡卡接入到不同的網路中。

閘道器(Gateway)

是路由器的一種,通常我們把網路層使用的路由器稱為閘道器,路由器可以在網路介面級或物理級路由;閘道器是在網路層上路由(個人感覺應該是一種概念,即在網路層連線兩個子網的概念,並不存在實體,真正實現路由功能還是得靠路由器)。

說的再通俗一點,路由器上面有MAC地址和MAC地址對應的IP,而閘道器由於是網路層的概念因此只有IP地址。在今天很多區域網採用都是路由來接入網路,因此現在通常指的閘道器就是路由器的IP。

另外,需要強調一點,雖然路由器上面有MAC地址和IP地址,但它並不能通過MAC地址工作,必須通過IP定址。因此它是工作在網路層的裝置。

網路交換機(Network Switch)

是一個擴大網路的器材,能為子網中提供更多的連線埠,以便連線更多的電腦。交換機與路由器的區別:

  • 工作層次不同
    • 交換機主要工作在資料鏈路層(第二層)
    • 路由器工作在網路層(第三層)。
  • 轉發依據不同
    • 交換機轉發所依據的物件是:MAC地址。(實體地址)
    • 路由轉發所依據的物件是:IP地址。(網路地址)
  • 主要功能不同
    • 交換機主要用於組建區域網,連線同屬於一個(廣播域)子網的所有裝置,負責子網內部通訊(廣播)。
    • 路由主要功能是將由交換機組好的區域網相互連線起來,或者將他們接入Internet。
    • 交換機能做的,路由都能做。
    • 交換機不能分割廣播域(子網),路由可以。
    • 路由還可以提供防火牆的功能。
    • 路由配置比交換機複雜。

交換機雖然主要依靠MAC地址查詢工作在資料鏈路層,但是他也可以有IP地址,這樣就可以進行遠端登入等操作了。

  • LAN,全稱Local Area Network,中文名叫做區域網;
  • WAN,全稱Wide Area Network,中文名叫做廣域網。
  • WLAN,全稱Wireless LAN, 無線區域網,通俗點講就是WiFi。

WAN是一種跨越大的、地域性的計算機網路的集合。通常跨越省、市,甚至一個國家。廣域網包括大大小小不同的子網,子網可以是區域網,也可以是小型的廣域網。

家用的路由器,一般包括了交換機和路由器,因此他有兩個介面——WAN埠用於連線至Internet;LAN埠用於連線至區域網裝置。

家用路由器

PASS:舉例

4)ARP協議

在上面的過程中,我們實際上假設了,每一臺主機和路由都能瞭解區域網內的IP地址和MAC地址的對應關係,這是實現IP包封裝(encapsulation)到幀的基本條件。 IP地址與MAC地址的對應是通過ARP協議傳播到區域網的每個主機和路由。每一臺主機或路由中都有一個ARP cache,用以儲存區域網內IP地址和MAC地址如何對應。

ARP協議(ARP介於資料鏈路層和網路層之間,ARP包需要包裹在一個幀中)的工作方式如下:主機發出一個ARP包,該ARP包中包含有自己的IP地址和MAC地址。通過ARP包,主機以廣播的形式詢問區域網上所有的主機和路由:我是IP地址xxxx,我的MAC地址是xxxx,有人知道199.165.146.4的MAC地址嗎?擁有該IP地址的主機會回覆發出請求的主機:哦,我知道,這個IP地址屬於我的一個NIC(網絡卡),它的MAC地址是xxxxxx。由於傳送ARP請求的主機採取的是廣播形式,並附帶有自己的IP地址和MAC地址,其他的主機和路由會同時檢查自己的ARP cache,如果不符合,則更新自己的ARP cache。

這樣,經過幾次ARP請求之後,ARP cache會達到穩定。如果區域網上裝置發生變動,ARP重複上面過程。ARP協議只用於IPv4。IPv6使用Neighbor Discovery Protocol來替代ARP的功能。

4.傳輸層

1)埠號

有了MAC地址和IP地址,我們已經可以在網際網路上的任意兩臺電腦之間建立通訊了。接下來的問題是,同一臺主機上許多程式(程序)都需要用到網路,比如你一遍瀏覽網頁一遍聊天。當一個數據包從網上傳送過來的時候,我們需要一個引數來區分,他到底是提供哪個程序使用的——這個引數就叫做“埠號”,他其實就是每一個使用網絡卡的程式的編號。 每個資料包傳送到主機特定的埠,所以不同的程式就能取到自己想要的資料包。

埠是0到65535之間的一個整數,正好16個二進位制。0~1023的埠被系統佔用,使用者只能使用大於1023的埠。 不管是瀏覽網頁還是聊天,應用程式都會隨機選用一個埠,然後與伺服器建立相應的埠關係。這裡需要補充一點,HTTP協議預設使用80埠,8080是用來訪問代理服務的。

“傳輸層”的功能,就是建立“埠到埠”之間的通訊。相比之下,“網路層”的功能是建立“主機到主機"的通訊。 只要確定主機和埠號,我們就能實現程式之間的交流。

2)Socket

上面我們已經說了,傳輸層是建立“埠到埠”之間的通訊,更具體一點,也就是程式和程式之間的通訊,或者“程序間通訊”。 嗯,挺唬人的一個概念。

程序間通訊分為兩種——一種是主機內部(或終端內部)程序間通訊 ,這個由終端或主機上的作業系統決定,比如在Android系統上面程序間通訊就是AIDL;另一種是跨主機程序間通訊或者網路程序間通訊,也叫 “socket通訊” 。我們可以先籠統的理解——Unix系統把主機+埠,叫做"套接字"(socket),當然,這樣說是有失偏頗的。

那麼,Socket是什麼?

  • 從程式語言的角度,socket是一個無符號整型變數,用來標識一個通訊程序。 兩個程序通訊,總要知道這幾個資訊:雙方的ip地址和埠號,通訊所採用的協議棧。socket就是和這些東西繫結的,實現socket可以使用unix提供的介面,也可以使用Windows提供的winSock。

  • socket本質是程式設計介面(API),對TCP/IP的封裝。TCP/IP只是一個協議棧,必須要具體實現,同時還要提供對外的操作介面(API),這就是Socket介面。 通過Socket,我們才能使用TCP/IP協議,因此有了一系列我們知道的函式介面——connect、accept、send、read、write等。

JDK的java.net包下有兩個類:Socket和ServerSocket,在Client和Server建立連線成功後,兩端都會產生一個Socket例項,操作這個例項,完成所需的會話,而程式設計師就通過這些API進行網路程式設計。 Socket連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。

3)UDP/TCP協議

UDP和TCP協議都是傳輸層的協議,他們的主要作用就是在應用層的資料包標頭加上埠號(或者在IP協議的資料包中插入埠號)。

  • UDP協議的優點是比較簡單,容易實現,但是缺點是可靠性較差,一旦資料包發出,無法知道對方是否收到。
  • TCP協議可以近似認為是有確認機制的UDP協議。每發出一個數據包都要求確認。如果有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個資料包了。

TCP協議主要的確認機制是"三次握手,四次揮手",由於這個協議非常複雜,我們會另起一篇文章詳細講解。

5.應用層

應用程式收到"傳輸層"的資料,接下來就要進行解讀。由於網際網路是開放架構,資料來源五花八門,必須事先規定好格式,否則根本無法解讀。。"應用層"的作用,就是規定應用程式的資料格式。 舉例來說,TCP協議可以為各種各樣的程式傳遞資料,比如Email、WWW、FTP等等。那麼,必須有不同協議規定電子郵件、網頁、FTP資料的格式,這些應用程式協議就構成了"應用層"。這是最高的一層,直接面對使用者。

這裡的應用層是文章開頭的OSI七層模型的最上面三層的綜合,因為是直接面向用戶,因此它的主要作用是“消除裝置固有資料格式和網路標準資料格式直接的差異”,因為在網路流中,資料的格式是標準化的,但是具體到不同得裝置,不同的作業系統上,他的要求資料呈現格式是不同的,因此需要轉化成統一的、使用者能夠感知的聲音、圖片、文字等資訊,這就是應用層做的事情。

1)使用者上網設定

  • 本機的IP地址
  • 子網掩碼
  • 閘道器的IP地址
  • DNS的IP地址

2)DNS解析

網域名稱系統(英文:Domain Name System,縮寫:DNS),埠53,是網際網路的一項服務。它作為將域名和IP地址相互對映的一個分散式資料庫,能夠使人更方便地訪問網際網路。

什麼意思?我們上面已經說了,網路中的資料包,是通過“埠號+IP地址+MAC地址”來識別目的地址的,也就是說定位一個主機的時候,我們是定位的是他的IP地址,然後我們通過瀏覽器訪問的時候呢?比如我們要訪問谷歌,就在瀏覽器中輸入他的"域名":www.google.com ,卻不是谷歌伺服器的IP地址——這個時候,DNS協議就起作用了:

我們輸入www.google.com 並按下回車的時候,本機伺服器先是請求DNS伺服器,DNS伺服器根據我們傳送的域名,根據DNS協議,解析成該域名對應的IP地址並返回給本機,這樣,我們就可以進行下面幾層