電腦要組網,第一件事要幹什麼?固然是先把電腦連起來,能夠用光纜、電纜、雙絞線、無線電波(WiFi)等方式。物理層的做用就是經過物理手段把電腦鏈接起來,它主要規定了網絡的一些電氣特性,做用是負責傳送0和1的電信號。java
這裏說一下,經過物理手段將設備鏈接起來組網,物理手段就是光纜、電纜、雙絞線、無線電波(WiFi)等,好比中美之間的網絡通訊是經過海底光纜;兩個不一樣的局域網(電信的網絡和移動的網絡)通信,嗯,稍微麻煩點,個人電信手機先連上電信的服務器,你的移動手機連移動服務器,他們兩個ISP(Internet Service Provider 互聯網服務提供商)之間是經過物理手段連接的,這樣咱們就可以間接的實現通信了。程序員
互聯網能夠說就是用物理設備將各個「局域網」相連組成的更大的「局域網「,更大局域網層層相連,最終就組成了」互聯網「,好比小的互聯網就是你家和我家的WiFi,一個省的每戶家庭的WiFi組成這個省的局域網,各個省的局域網組成中國的局域網,各個國家之間的局域網經過物理手段互聯就組成了橫跨世界的」互聯網「(固然天朝還有一堵牆)。數據庫
物理層就是傳輸電路的0和1信號的,可是單純的0和1沒有意義,必須規定解讀方式:多少個0和1算一組?每一個信號有什麼意義?——這就是鏈路層的意義,它在物理層的上方,肯定了0和1的分組方式。編程
早些時候,各個公司都有本身的電信號分組方式,後來出現了「以太網」這種協議逐漸佔據了主導的地位。「以太網」規定,一組電信號構成一個數據包,叫作「幀(Frame)」;每一幀分紅兩個個部分:標頭(Head)和數據(Data)。瀏覽器
所以,數據鏈路層鏈路層的數據包就叫「以太網數據包」,他由「標頭」和「數據」兩部分組成——其中,「標頭」包含數據包的一些說明項,好比發送者、接受者、數據類型等等。服務器
上面咱們提到,以太網數據包的「標頭」包含了發送者和接受者的信息,那麼,發送者和接受者是如何標識的呢?網絡
以太網規定,連入網絡的全部設備,都必須具備「網卡」接口。數據包必須是從一塊網卡,傳送到另外一塊網卡,網卡的地址,就是數據包的發送地址和接受地址,也叫MAC地址。架構
每塊網卡出廠的時候,都有全世界獨一無二的MAC地址,長度是48位的二進制,一般用12個十六進制數表示。less
前6個十六進制是廠商編號,後6個是該廠商的網卡流水號,有了MAC地址,就能夠定位網卡和數據包的路徑了。socket
定義地址只是第一步,後面還有更多步驟—首先,一塊網卡怎麼只帶另外一塊網卡的MAC地址?回答是有一種ARP協議,能夠解決這個問題。這個留到後面介紹,這裏只須要知道,以太網數據包必須知道接收方的MAC地址,而後才能發送。
其次,就算有了MAC地址,系統怎樣才能把數據包準確送到接收方?回答是以太網採用了一種很"原始"的廣播式的方式,它不是把數據包準確送到接收方,而是向本網絡(局域網)內全部計算機發送,讓每臺計算機本身判斷,是否爲接收方。
一臺計算機向本局域網內的全部電腦均發送相同的數據包,其餘計算機收到這個數據包以後,會讀取這個數據包的「標頭」,找到其中接收方(目標方)的MAC地址,而後與自身的MAC地址進行比對,若是二者相同,說明就是要發給本身的,而後接受這個包並作出進一步的處理,不然丟棄這個包。這種發送方式就叫「廣播」,主要經過分組交換機或者網絡交換機進行。
根據上面的講解,理論上依靠MAC地址和廣播技術,上海的網卡發出的數據包就能夠找到洛杉磯網卡了——可是若是全世界的計算機都這麼幹,那麼每一臺計算機發出的數據包都同步廣播到全世界其餘電腦,再一一比對判斷,這樣顯然是低效、不現實的。
所以,上面咱們強調,廣播是在發送者所在的局域網內廣播的,不一樣也就是說,若是兩臺計算機沒有在同一個子網(局域網)內,是沒法經過廣播直接傳過去的。前面咱們說過,互聯網是由一個個子網組成的更大的子網,一級一級組網,最終構成的互聯網。
所以咱們必須找到一種方法,區分哪些MAC地址屬於同一個子網。若是是同一個子網就採用廣播的形式,若是不是,則採用「路由」的方式(後面會講)發送——這就致使了網絡層的出現,他的做用是引入一套新的地址,使咱們可以區分哪些計算機屬於同一個子網,這套機制就叫作「網絡地址」,也就是「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」則是同一子網內兩臺不一樣電腦(主機)的編號。
問題在於單單從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),而後比較結果是否相同,若是是的話,就代表它們在同一個子網絡中,不然就不是。
上面咱們已經肯定了兩臺計算機是否在同一個子網中,若是在,則採用廣播+MAC尋址的的方式發送數據包,若是不是,則要採用「路由」的方式了,那麼什麼是「路由」呢?
就是經過互聯的網絡把信息從源地址傳輸到目的地址的活動。路由引導分組轉送,通過中間的一些節點,到它們最後的目的地。
從「路由」的定義中能夠看到,「路由」是一種活動,一種動做,一種行爲,做用是是將信息從原地址傳輸到目的地址,比較特殊的是,原地址和目標地址是在兩個不一樣的子網中的。 那麼如何傳輸呢?路由定義一條路徑,通過因特網發送包到另外一網絡上的地址,但路由不定義徹底路徑,只定義從主機到能夠將包轉發到目的地的網關(子網)間的路徑段(或從一個子網到另外一個子網)。
簡單理解就是實現路由功能的機器。路由器鏈接兩個或多個網絡並提供路由功能。
前面咱們說過,網卡是計算機的一個硬件,它在接收到網路信息以後,將信息交給計算機。當計算機須要發送信息的時候,也要經過網卡發送。一臺計算機能夠有不僅一個網卡,好比筆記本就有一個以太網卡和一個WiFi網卡。計算機在接收或者發送信息的時候,要先決定想要經過哪一個網卡。路由器(router)能夠通俗理解爲一臺配備有多個網卡的專用電腦,它讓網卡接入到不一樣的網絡中。
是路由器的一種,一般咱們把網絡層使用的路由器稱爲網關,路由器能夠在網絡接口級或物理級路由;網關是在網絡層上路由(我的感受應該是一種概念,即在網絡層鏈接兩個子網的概念,並不存在實體,真正實現路由功能仍是得靠路由器)。
說的再通俗一點,路由器上面有MAC地址和MAC地址對應的IP,而網關因爲是網絡層的概念所以只有IP地址。在今天不少局域網採用都是路由來接入網絡,所以如今一般指的網關就是路由器的IP。
另外,須要強調一點,雖然路由器上面有MAC地址和IP地址,但它並不能經過MAC地址工做,必須經過IP尋址。所以它是工做在網絡層的設備。
是一個擴大網絡的器材,能爲子網中提供更多的鏈接端口,以便鏈接更多的電腦。交換機與路由器的區別:
交換機雖然主要依靠MAC地址查找工做在數據鏈路層,可是他也能夠有IP地址,這樣就能夠進行遠程登陸等操做了。
WAN是一種跨越大的、地域性的計算機網絡的集合。一般跨越省、市,甚至一個國家。廣域網包括大大小小不一樣的子網,子網能夠是局域網,也能夠是小型的廣域網。
家用的路由器,通常包括了交換機和路由器,所以他有兩個接口——WAN端口用於鏈接至Internet;LAN端口用於鏈接至局域網設備。
PASS:舉例
在上面的過程當中,咱們實際上假設了,每一臺主機和路由都能瞭解局域網內的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的功能。
有了MAC地址和IP地址,咱們已經能夠在互聯網上的任意兩臺電腦之間創建通訊了。接下來的問題是,同一臺主機上許多程序(進程)都須要用到網絡,好比你一遍瀏覽網頁一遍聊天。當一個數據包從網上發送過來的時候,咱們須要一個參數來區分,他究竟是提供哪一個進程使用的——這個參數就叫作「端口號」,他其實就是每個使用網卡的程序的編號。 每一個數據包發送到主機特定的端口,因此不一樣的程序就能取到本身想要的數據包。
端口是0到65535之間的一個整數,正好16個二進制。0~1023的端口被系統佔用,用戶只能使用大於1023的端口。 無論是瀏覽網頁仍是聊天,應用程序都會隨機選用一個端口,而後與服務器創建相應的端口關係。這裏須要補充一點,HTTP協議默認使用80端口,8080是用來訪問代理服務的。
「傳輸層」的功能,就是創建「端口到端口」之間的通訊。相比之下,「網絡層」的功能是創建「主機到主機"的通訊。 只要肯定主機和端口號,咱們就能實現程序之間的交流。
上面咱們已經說了,傳輸層是創建「端口到端口」之間的通訊,更具體一點,也就是程序和程序之間的通訊,或者「進程間通訊」。 嗯,挺唬人的一個概念。
進程間通訊分爲兩種——一種是主機內部(或終端內部)進程間通訊 ,這個由終端或主機上的操做系統決定,好比在Android系統上面進程間通訊就是AIDL;另外一種是跨主機進程間通訊或者網絡進程間通訊,也叫 「socket通訊」 。咱們能夠先籠統的理解——Unix系統把主機+端口,叫作"套接字"(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鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。
UDP和TCP協議都是傳輸層的協議,他們的主要做用就是在應用層的數據包標頭加上端口號(或者在IP協議的數據包中插入端口號)。
TCP協議主要的確認機制是"三次握手,四次揮手",因爲這個協議很是複雜,咱們會另起一篇文章詳細講解。
應用程序收到"傳輸層"的數據,接下來就要進行解讀。因爲互聯網是開放架構,數據來源五花八門,必須事先規定好格式,不然根本沒法解讀。。"應用層"的做用,就是規定應用程序的數據格式。 舉例來講,TCP協議能夠爲各類各樣的程序傳遞數據,好比Email、WWW、FTP等等。那麼,必須有不一樣協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了"應用層"。這是最高的一層,直接面對用戶。
這裏的應用層是文章開頭的OSI七層模型的最上面三層的綜合,由於是直接面向用戶,所以它的主要做用是「消除設備固有數據格式和網絡標準數據格式直接的差別」,由於在網絡流中,數據的格式是標準化的,可是具體到不一樣得設備,不一樣的操做系統上,他的要求數據呈現格式是不一樣的,所以須要轉化成統一的、用戶可以感知的聲音、圖片、文字等信息,這就是應用層作的事情。
網域名稱系統(英文:Domain Name System,縮寫:DNS),端口53,是互聯網的一項服務。它做爲將域名和IP地址相互映射的一個分佈式數據庫,可以令人更方便地訪問互聯網。
什麼意思?咱們上面已經說了,網絡中的數據包,是經過「端口號+IP地址+MAC地址」來識別目的地址的,也就是說定位一個主機的時候,咱們是定位的是他的IP地址,而後咱們經過瀏覽器訪問的時候呢?好比咱們要訪問谷歌,就在瀏覽器中輸入他的"域名":www.google.com ,卻不是谷歌服務器的IP地址——這個時候,DNS協議就起做用了:
咱們輸入www.google.com 並按下回車的時候,本機服務器先是請求DNS服務器,DNS服務器根據咱們發送的域名,根據DNS協議,解析成該域名對應的IP地址並返回給本機,這樣,咱們就能夠進行下面幾層的地址封裝了。