互聯網相隔n千米路的兩臺計算機,是如何進行數據的傳送的呢?在成千上萬臺的計算機中,一臺計算機是如何正確着找到另一個計算機,並把數據傳給它的呢? html
學過計算機網絡的同窗可能知道,在這互聯網中,計算機與計算機之間的數據傳送,主要是基於各類「協議」串聯起來的。不過今天要講的,並不會詳細去講各類協議,而是經過各類簡化以後,讓你大概知道數據之間傳送的原理。vue
互聯網中數據的傳送,其實分爲好幾層來處理數據的,每一層有它本身明確的功能。例如就像流水線生產同樣,一部分人負責這部分的工做,處理完以後就把剩餘的工做扔給另一部分人來處理……數組
對於互聯網數據傳送的分層模型,有分紅七層的,有分紅5層的,還有分紅4層的。例如分紅七層模型的以下(從上到下):安全
物理層服務器
七層中,越往下越靠近計算機底層,越往上越靠近用戶。 網絡
不過,咱們今天要講的,是以分紅五層的模型來說。其分層以下圖:post
至關於把應用層、表示層、會話層當作是一層的。接下來咱們從下往上來一步一步講,看看如何從一臺計算機準確着傳給另外一臺計算機的。 網站
一臺計算機與另外一臺計算機要進行通訊,第一件要作的事是什麼?固然是要把這臺計算機與另外的其餘計算機連起來啊,例如能夠經過光纖啊,電纜啊,雙絞線啊等物體把他們聯起來。而後才能進行通訊,也就是說,,物理層負責把兩臺計算機連起來,而後在計算機之間傳送0,1這樣的電信號。ui
前面說了,物理層它只是單純着負責在計算機之間傳輸0,1這樣的電信號。假如這些0,1組合的傳送毫無規則,計算機是解讀不了的。所以,咱們須要制定一套規則來進行0,1的傳送。例如多少個電信號爲一組啊,每一組信號應該如何標識才能讓計算機讀懂啊等。 lua
數據鏈路層工做在物理層之上,負責給這些0,1制定傳送的規則,而後另外一方再按照相應的規則來進行解讀。
以太網協議規定,一組電信號構成一個數據包,把這個數據包稱之爲「楨」。每個楨由標頭(Head)和數據(Data)兩部分組成。以下:
這個楨的最大長度是1518個字節,最小長度爲64字節。假如須要傳送的數據很大的話,就分紅多個楨來進行傳送。
對於表頭和數據這兩個部分,他們存放的都是一些什麼數據呢?我猜你眯着眼睛都能想到他們應該放什麼數據。 毫無疑問,咱們至少得知道這個楨是誰發送,發送給誰的等這些信息吧?因此標頭部分主要是一些說明數據,例如發送者,接收者等信息。而數據部分則是這個數據包具體的,想給接受的內容。
你們想一個問題,一個楨的長度是64~1518個字節,也就是說楨的長度不是固定的,那你以爲標頭部分的字節長度是固定的嗎?它固然是固定的啊,假如不是固定的,每一個楨都是單獨發的,那計算機怎麼知道標頭是幾個字節,數據是幾個字節。因此標頭部分的字節是固定的,而且固定爲18個字節。
把一臺計算的的數據經過物理層和鏈路層發送給另外一臺計算機,到底是誰發給誰的,計算機與計算機之間如何區分,,你總得給他們一個惟一的標識吧?
這就是MAC地址,連入網絡的每個計算機都會有網卡接口,每個網卡都會一個地址,這個地址就叫作MAC地址。計算機之間的數據傳送,就是經過MAC地址來惟一尋找、傳送的。MAC地址在網卡生產是就被惟一標識了。
如圖,假如計算機A知道了計算機B的MAC地址,而後計算機A想要給計算機B傳送數據,雖然計算機A知道了計算機B的MAC地址,但是它要怎麼給它傳送數據呢?計算機A不只連着計算機B,並且計算機A也還連着其餘的計算機。 雖然計算機A知道計算機B的MAC地址,但是計算機A是沒法知道計算機B是分佈在哪邊路線上的。實際上,計算機A是經過廣播的方式把數據發送給計算機B。在同一個子網中,計算機A要向計算機B發送一個數據包,這個數據包包含接收者的MAC地址。這個時候同一個子網中的計算機C,D也會收到這個數據包的,而後收到這個數據包的計算機,會把數據包的MAC地址取出來,與自身的MAC地址對比,若是二者相同,則接受這個數據包,不然就丟棄這個數據包。這種發送方式咱們稱之爲廣播,就像咱們平時在廣場上經過廣播的形式呼叫某我的同樣。
那麼問題來了,計算機A是如何知道計算機B的MAC地址的呢?這個時候就得由ARP協議這個傢伙來解決了,不過ARP協議會涉及到IP地址,不過咱們下面纔會扯到IP地址。所以咱們先放着,就看成是有這麼一個ARP協議,經過它咱們能夠知道子網中其餘計算機的MAC地址。
上面咱們有說到子網這個關鍵詞,實際上咱們所處的網絡,是由無數個子網絡構成的。廣播的時候,也只有同一個子網裏面的計算機可以收到。 假如沒有子網這種劃分的話,計算機A發一個數據包給計算機B,其餘全部計算機也都能收到這個數據包,而後進行對比再捨棄。世界上有那麼多它計算機,每一臺計算機都能收到其餘全部計算機的數據包,那就不得了了。那還不得奔潰。 所以產生了子網這麼一個東西。
那麼問題來了,咱們如何區分哪些MAC地址是屬於同一個子網的呢?假如是同一個子網,那咱們就用廣播的形式把數據傳送給對方,若是不是同一個子網的,咱們就會把數據發給網關,讓網關進行轉發。
爲了解決這個問題咱們引入了一套新的地址協議,這個地址協議可以幫助咱們區分MAC地址是否處於同一個子網中。這也是網絡層負責解決的問題。
這個協議就是IP協議,它所定義的地址,咱們稱之爲IP地址。IP協議有兩種版本,一種是IPv4,另外一種是IPv6。不過咱們目前大多數用的仍是IPv4,咱們如今也只討論IPv4這個版本的協議。
這個IP地址由32爲的二進制數組成,咱們通常把它分紅4段的十進制表示,地址範圍爲0.0.0.0~255.255.255.255
每一臺想要聯網的計算機都會有一個IP地址。這個IP地址被分爲兩部分,前面一部分表明網絡部分,後面一部分表明主機部分。而且網絡部分和主機部分的二進制位數是不固定的。
假如兩臺計算機的網絡部分是如出一轍的,咱們就說這兩臺計算機是處於同一個子網中。例如192.168.43.1和192.168.43.2,假如這兩個IP地址的網絡部分爲24爲,主機部分爲8位。那麼他們的網絡部分都爲192.168.43,因此他們處於同一個子網中。
但是問題來了,你怎麼知道網絡部分是佔幾位。也就是說,單單從兩臺計算機的IP地址,咱們是沒法判斷他們的是否處於同一個子網中的。
這就引伸出了另外一個關鍵詞————子碼掩碼。子碼掩碼和IP地址同樣也是32位二進制數,不過它的網絡部分規定所有爲1,主機部分規定所有爲0.也就是說,假如上面那兩個IP地址的網絡部分爲24爲,主機部分爲8爲的話,那他們的子碼掩碼都爲11111111.11111111.11111111.00000000,即255.255.255.0。
那有了子字碼掩碼,如何來判端IP地址是否處於同一個子網中呢。顯然,知道了子碼掩碼,至關於咱們知道了網絡部分是幾位,主機部分是幾位。咱們只須要把IP地址與它的子碼掩碼作與(and)運算,而後把各自的結果進行比較就好了,若是比較的結果相同,則表明是同一個子網,不然不是同一個子網。
例如,192.168.43.1和192.168.43.2的子碼掩碼都爲255.255.255.0,把IP與子碼掩碼相與,能夠獲得他們都爲192.168.43.0,進而他們處於同一個子網中。
有了上面IP協議的知識,咱們回來說一下ARP協議。
有了兩臺計算機的IP地址,咱們就能夠判斷出它們是否處於同一個子網之中。 假如他們處於同一個子網之中,計算機A要給計算機B發送數據時。咱們能夠經過ARP協議來獲得計算機B的MAC地址。ARP協議也是經過廣播的形式給同一個子網中的每臺電腦發送一個數據包(固然,這個數據包會包含接收方的IP地址)。對方收到這個數據包以後,會取出IP地址與自身的對比,若是相同,則把本身的MAC地址回覆給對方,不然就丟棄這個數據包。這樣,計算機A就能知道計算機B的MAC地址了。
可能有人會問,知道了MAC地址以後,發送數據是經過廣播的形式發送,詢問對方的MAC地址也是經過廣播的形式來發送,那其餘計算機怎麼知道你是要傳送數據仍是要詢問MAC地址呢?其實在詢問MAC地址的數據包中,在對方的MAC地址這一欄中,填的是一個特殊的MAC地址,其餘計算機看到這個特殊的MAC地址以後,就能知道廣播想幹嗎了。
假如兩臺計算機的IP不是處於同一個子網之中,這個時候,咱們就會把數據包發送給網關,而後讓網關讓咱們進行轉發傳送
這裏再說一個問題,咱們是如何知道對方計算機的IP地址的呢?這個問題可能有人會以爲很白癡,心想,固然是計算機的操做者來進行輸入了。這沒錯,當咱們想要訪問某個網站的時候,咱們能夠輸入IP來進行訪問,可是我相信絕大多數人是輸入一個網址域名的,例如訪問百度是輸入www.baidu.com這個域名。其實當咱們輸入這個域名時,會有一個叫作DNS服務器的傢伙來幫咱們解析這個域名,而後返回這個域名對應的IP給咱們的。
雖然咱們已經把數據成功從計算機A傳送到計算機B了,但是,計算機B裏面有各類各樣的應用程序,計算機該如何知道這些數據是給誰的呢?
這個時候,端口(Port)這個傢伙就上場了,也就是說,咱們在從計算機A傳數據給計算表B的時候,還得指定一個端口,以供特定的應用程序來接受處理。
也就是說,傳輸層的功能就是創建端口到端口的通訊。相比網絡層的功能是創建主機到主機的通訊。
也就是說,有了IP和端口,咱們就能夠進行通訊了。這個時候可能有人會說,我輸入IP地址的時候並無指定一個端口啊。其實呢,對於有些傳輸協議,已經有設定了一些默認端口了。例如http的傳輸默認端口是80,這些端口信息也會包含在數據包裏的。
應用層
終於說到應用層了,應用層這一層最接近咱們用戶了。
雖然咱們收到了傳輸層傳來的數據,但是這些傳過來的數據五花八門,有html格式的,有mp4格式的,各類各樣。你肯定你能看的懂?
所以咱們須要指定這些數據的格式規則,收到後纔好解讀渲染。而應用層的功能,就是用來規定應用程序的數據格式的。
五層模型至此講到這裏。對於有些層講的比較簡潔,就隨便概況了一下。若是你想詳細去了解,能夠去買計算機網絡相應的資料。但願個人講解能讓你對計算機之間數據的傳輸有個大概的瞭解。
:
https://juejin.im/post/5b5e97d8e51d451988562178(一文看懂https是如何保證數據傳輸的安全性的)