首先,協議,能夠理解爲是一套統一的規則,就像行業標準。因爲互聯網主要的功能是傳輸信息,因此其協議通常是管理系統之間如何相互通訊的規則。緩存
用郵政和物流等線下的「運輸協議」來理解,咱們之前寫信的時候都須要寫郵編、寄信人、收信人和地址,在途中郵政也有自身的標準,好比不一樣地區的郵遞員收集特定地區的郵件,而後聚集分發;物流行業也有集裝箱、鐵軌等。安全
在互聯網通訊中,「如何探測到通訊目標、由哪一邊先發起通訊、使用哪一種語言進行通訊、怎樣結束通訊等規則都須要事先肯定。不一樣的硬件、操做系統之間的通訊,全部的這一切都須要一種規則。」服務器
TCP/IP 協議的全稱是 Transmission Control Protocol and Internet Protocol。TCP 和 IP 分別是兩種協議;同時TCP/IP 協議能夠指互聯網 傳輸過程當中用到的一組協議族和互聯網模型,由於 TCP 和 IP 在其中比較重要,因此以它們來命名。微信
因爲通訊中涉及到的步驟和用到的軟硬件不少,所以會被劃分紅不一樣的層次。TCP/IP 模型有四個抽象的層次,描述了整體的設計大綱,並實現了網絡通訊的具體協議。網絡
這個模型中不一樣的協議有着不一樣的「分工」,掌握所須要的信息,而且根據特定信息完成它的工做,其實跟現實生活中工做流程差很少。再用上面郵政和寄快遞的例子,因爲存在分工,你問收件的快遞員你的快遞單到哪是他確定是不知道的,他只負責把你的快件送到快遞集散點。測試
對於用戶而言,能夠把 TCP/IP 協議理解成快遞公司,用戶只須要寄件和簽收,怎麼把快件從 A 運到 B 手上,就是快遞公司的事了。再次借用知乎哦吼的話:「TCP/IP 也是網絡通訊裏的物流公司,應用程序只要把須要傳輸的數據提交給 TCP/IP,TCP/IP 就能夠把數據打包發到目的地,至於裏面的傳輸細節應用程序也能夠不關心,這樣應用程序就能夠從最底層的傳輸細節裏解放出來,把更多的注意力放在應用程序數據自己的處理。」操作系統
接下來咱們能夠開始來了解一下這家快遞公司內部的各個重要角色。設計
這家公司大概能夠分紅四個部門,也就是 TCP/IP 協議族按層次分別分爲應用層、傳輸層、網絡層和網絡接口層(數據鏈路層+物理層)。接口
先來個英文版three
再來個萌萌噠中文版
上面這幅圖其實很形象地表現了整個數據傳輸的過程,咱們在微信上發一句話看似很簡單,其實每一步都通過了從上層到底層,再從底層到上層應用的過程。好比小熊在微信上給小明發了一句消息,直到小明收到這個消息,其實就通過了上述過程。
微信所在的是應用層,它按照特定格式把數據打包好,加上收寄件人和雙方地址、本身的 「記號」(以便到了小明那邊知道這條消息是要給微信的)等等,給到傳輸層;傳輸層的 TCP 協議會把文件切成更小的碎片,確保數據包都被安全傳輸;網絡(互連)層的 IP 協議會找到最佳路徑;這個消息會經過光纖、WiFi 等網絡發過去。到達目的地以後,被打散的數據會通過重組,傳輸層也會從記號知道這是給微信的。
上面這個過程其實已經聊到 TCP 協議和 IP 協議的主要做用,這兩個分別是傳輸層和網絡互連層最主要的協議,所以這個模型以它們來命名。具體過程當中會有不少其餘協議,傳不一樣的數據時,應用層會有不一樣的協議處理。感興趣的寶寶能夠繼續跟我一塊兒瞭解細節。
互聯網中信息以數據包的單位傳輸,不一樣的協議層對數據包有不一樣的稱謂,在傳輸層叫作段 (segment),在網絡層叫作數據報 (datagram),在鏈路層叫作幀 (frame)。
發送端在層與層之間傳輸數據時,每通過一層時一定會被打上一個該層所屬的首部信息,這種把數據信息包裝起來的作法稱爲封裝(encapsulate)。數據封裝成幀後發到傳輸介質上,到達目的主機後每層協議再剝掉相應的首部,最後將應用層數據交給應用程序處理。 我會從最底層開始講起。
常見協議: Ethernet 802.三、Token Ring 802.五、X.2五、Frame relay、HDLC、PPP ATM等。
又叫網絡訪問層(數據鏈接 + 物理層),負責從上層接收 IP 數據包並經過網絡發送,或者從網絡上接收物理幀,抽出 IP 數據包,交給 IP 層。這層包括主機鏈接到物理網絡所須要的硬件以及傳送數據的協議。好比路由、NIC(Network Interface Card,網絡適配器,即網卡),及光纖等物理可見部分;這層的協議取決於所使用的物理網絡。若是物理網絡是 LAN,那麼一般使用的是以太網(802.3)協議以及它的變體,若是使用的是 WAN,經常使用的則是點對點協議(PPP)以及幀中繼等協議。
其中比較出名的是以太網協議。「兩臺電腦(主機)之間是經過網卡來進行發送和接收數據的。每一個網卡都有一個獨特的地址,也就是 MAC 地址。以太網數據以幀爲單位,包括標頭和數據部分。以太網在子網內以廣播的形式發送數據。光有 MAC 地址並不能讓兩臺主機之間相互通訊,若是兩臺主機不在同一個子網,以太網協議就沒轍了。這就要經過網絡層來區分每臺主機所在的網絡是哪一個子網。若是在同一個子網,就用廣播發送數據,不然就用路由發送。這就致使了網絡層的誕生。」(來自極光推送)
常見協議:IP(Internet Protocol)、ICMP、ARP(Address Resolution Protocol)、RARP(Reverse ARP)。 IP 是網絡層的核心,經過路由選擇將下一條 IP 封裝後交給接口層。 ICMP 是網絡層的補充,能夠回送報文。用來檢測網絡是否通暢。
網絡層的主要任務簡而言之就是「給每一個數據包肯定路線」。這個主機可能在同一個網絡或者外部網絡,所以須要先區分主機是否是在同一個子網。
這層就是 IP 協議所在的地方。就像咱們寫信的時候須要有一個地址,在網絡世界中也須要一個地址,這個網絡地址就是 IP 地址。
IP 地址是門牌號,而 IP 協議負責計算並找到指定門牌,快遞小哥天天出門前要作的事就是 IP 協議的天職:分揀包裹、規劃路徑。其實,三五個節點的小型網絡內部通訊徹底沒必要使用 IP 協議,由於這些節點之間原本就能兩兩互通,但會有個問題:節點數變多後,網速就會癱瘓,由於帶寬耗盡。(帶寬指固定時間內能傳遞的數據包,有點像馬路寬度。)
所以,後來一片網絡拆分紅不少子網絡(sub networks),每片子網絡交給一臺路由器統管。子網絡中的節點間能夠單獨通訊,不須要 IP 協議,但因爲帶寬限制,若是你想和本網絡外的節點溝通時,就得使用一個設備:路由器。世界上大多數的路由器被幾家大運營商掌管。
如上圖,節點 1 和 2 同屬一個子網,可基於內部通訊協議溝通,而 1 和 5 間的聯絡必須基於 IP 協議,經過路由器 1 和 2 之間的路徑交流。
把 IP 協議的邏輯推廣到整個互聯網,最終,鏈接咱們手機客戶端和騰訊服務器的是無數個路由器。
把大網絡切小的好處顯而易見:節約帶寬、擡高網速,同時一隻路由器掛了不影響其餘節點間的通訊,這就是 IP 協議的做用。
這層還有一些 「協助」IP 協議工做的協議,好比 ARP 和 RARP。要保證數據確實傳送到對方主機,除了 IP 地址以外還須要 MAC 地址(Media Access Control Address)。Mac 地址又稱物理地址,跟網卡一一對應,對於一臺主機來講是惟一且不可變的。IP 地址則是會根據你所在網絡的不一樣改變的。
上述兩個協議的做用簡單而言就是:用 IP 地址找 Mac 地址;以及用 Mac 地址找 IP 地址。具體的做用請看下面兩段:
「ARP(地址解析協議)基本功能就是經過目標設備的 IP 地址,查詢目標設備的 MAC 地址,以保證通訊的順利進行。以太網中的數據幀從一個主機到達網內的另外一臺主機是根據48位的以太網地址(硬件地址)來肯定接口的,而不是根據 32 位的 IP 地址。內核必須知道目的端的硬件地址才能發送數據。P2P 的鏈接是不須要 ARP 的。
RARP(反向地址轉換協議)容許局域網的物理機器從網關服務器的 ARP 表或者緩存上請求其 IP 地址。局域網網關路由器中存有一個表以映射 MAC 和與其對應的 IP 地址。當設置一臺新的機器時,其 RARP 客戶機程序須要向路由器上的 RARP 服務器請求相應的 IP 地址。假設在路由表中已經設置了一個記錄,RARP 服務器將會返回 IP 地址給機器。」
看完以後你可能跟我有同樣的疑惑,既然都是靠物理地址找主機,爲啥還須要 IP 地址?51CTO 和 CSDN 這兩篇文章能夠解答這個問題:
MAC 地址結構是醬紫的:一共有 48bit,分爲兩部分,前 24bit 是廠商代碼,後 24bit 是廠家本身分配的。假如咱們認爲 MAC 地址能夠區分不一樣的網絡的話,那隻能是使用廠商代碼來區分不一樣的網絡,顯然同品牌網卡不表明在同一個網絡。
最先這個世界上的電腦沒這麼多的時候,是沒有路由這個東西存在的,主機都在一張網裏,因此確實是直接經過 mac 地址通訊的。最初的鏈路層協議是和 ip 地址無關的,沒有網絡層方面的設定,只有物理層和鏈路層,最初也只有集線器,沒有交換機路由器,服務器之間傳輸數據全靠 mac 地址。在沒有 ip 地址以前,mac 地址已經在使用了。如今處處都在用的二層交換機,就是根據 mac 地址轉發數據。mac 地址的設計不攜帶設備在網絡中的位置信息,想要經過 mac 地址通訊,咱們得在全部的設備上維護一張很大的表,記錄全部 mac 地址路由在當前位置的的下一跳,這顯然是不合理的。
再次用《圖解 HTTP》裏面萌萌噠圖解釋一下這個過程:
MAC 地址就像電腦的我的身份證,IP 地址就像電腦所在的屋子,屋子裏能夠住着不少人,局域網關路由就像登記人口的街道辦公室。
有了 IP 協議,就能夠在兩個主機之間發送數據了,接下來的問題在於每臺主機都有不一樣的應用,如何區分哪一個數據包屬於哪一個程序?這就是傳輸層的做用。傳輸層的主要任務是確保分割的單元在另外一端正確地到達,它創建端口到端口的鏈接。網絡層創建主機到主機的鏈接,只要有主機和端口,就能肯定數據包屬於哪一個程序的。同時它也負責接收應用層的數據,而後把它們分紅更小的單元(標頭和數據部分在網絡層的數據部分),傳輸到網絡層。
這裏提到的端口不是硬件端口,而是軟件端口,端口有點向外界信息進入電腦的門,不一樣的信息經過這些門傳給不一樣應用程序。
「ip 能鎖定一臺物理機器,對應着一張網卡,外界發來的數據包網卡都會接收。可是問題來了,網卡給程序提供了接口,你監聽一下我,要是有消息來了,我就轉發給你。這樣應用程序就能收到數據了。可是問題來了,程序 A 和程序 B 都須要監聽網卡接發數據,網卡說那我把接到的數據都發給你兩,大家本身看着辦吧。好,小 A 小 B 都接受了。可是又來了 CDEF......,不行了,每一個包都被髮到了全部應用程序,每一個應用程序都累得不行,最終垮了。
好,那網卡說我給大家加個表示吧,咱們之間能夠用一個號碼來做爲標識,我和小 A 之間就用 1 來標識,若是外界發給 1 號標識的數據我就轉發給你,你監聽個人時候得告訴我你監聽的時 1,我就轉發 1 的數據包給你。好了其餘的 BCD... 都本身弄一個標識號,只要不重複就行。這樣你們都省事了。
最後設計到安全,一個標識號只能被一個應用程序監聽,由於若是小 A 程序和小 B 同時監聽一個標識號號,那就壞了,我傳的數據都被 AB 接到,這樣數據安全性就沒辦法保證了。」
這一層主要有兩個協議:TCP 和 UDP。
TCP是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。UDP(用戶數據報協議)是一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
這兩句話雖然看起來也是讓人懵逼,但大概能讓人 get 到一個可靠一個沒那麼可靠。沒錯這就是二者的區別。
TCP 協議提到的所謂字節流服務(Byte Stream Service)是指,爲了方便傳輸,將大塊數據分割成以報文段(segment)爲單位的數據包進行管理。而可靠的傳輸服務是指,可以把數據準確可靠地傳給對方。簡單來講就是,它把數據切成一個個數據包,從第一隻數據包開始傳,傳送成功就翻倍,發現失敗就地爬起來,從絆倒的那隻數據包從新開始,周而復始。(如下內容來自知乎用戶陳寶佳和小明):
圖片來自《圖解HTTP》
爲了準確無誤地將數據送達目標處,在收發數據前,必須和對方創建可靠的鏈接。TCP 協議採用了三次握手(three-way handshaking)策略。握手過程當中使用了 TCP 的標誌(flag) —— SYN(synchronize) 和 ACK(acknowledgement):
第一次握手:客戶端發送 syn 包 (syn=j) 到服務器,並進入 SYN_SEND 狀態,等待服務器確認;
第二次握手:服務器收到 syn 包,必須確認客戶的 SYN(ack=j+1),同時本身也發送一個 SYN 包(syn=k),即 SYN+ACK 包,此時服務器進入 SYN_RECV 狀態;
第三次握手:客戶端收到服務器的 SYN+ACK 包,向服務器發送確認包 ACK(ack=k+1),此包發送完畢,客戶端和服務器進入 ESTABLISHED 狀態,完成三次握手。
注意:握手過程當中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。除了上述三次握手,TCP 協議還有其餘各類手段來保證通訊的可靠性。
理想狀態下,TCP 鏈接一旦創建,在通訊雙方中的任何一方主動關閉鏈接以前,TCP 鏈接都將被一直保持下去。
斷開鏈接時服務器和客戶端都可以主動發起斷開 TCP 鏈接的請求,斷開過程須要通過「四次握手」。
至於 UDP 協議,傳送數據前並不與對方創建鏈接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,固然也不用重發,因此說 UDP 是無鏈接的、不可靠的一種數據傳輸協議。UDP 傳輸的信息包最小隻有 8 個字節,TCP 則是 20 個字節。這樣的好處是,UDP 對系統資源要求更低,開銷更小,數據傳輸速率更高,由於沒必要進行收發數據的確認,因此 UDP 的實時性更好。他還表示 MSN 採用 TCP 傳輸協議傳文件,QQ 傳輸文件採用 UDP,因此後者更快。
我在學校的時候,有師兄教過我用 「ping」 命令來測試兩臺主機之間 TCP/IP 通訊是否正常。依然是據上面那個知乎大神解釋,「其實 ping 命令的原理就是向對方主機發送 UDP 數據包,而後對方主機確認收到數據包, 若是數據包是否到達的消息及時反饋回來,那麼網絡就是通的。ping 命令是使用 IP 和網絡控制信息協議 (ICMP),於是沒有涉及到任何傳輸協議(UDP/TCP) 和應用程序。它發送 icmp 回送請求消息給目的主機。ICMP 協議規定:目的主機必須返回 ICMP 回送應答消息給源主機。若是源主機在必定時間內收到應答,則認爲主機可達。」
應用層是互聯網程序與其餘程序通訊所使用的層,也是離用戶「最近」的一層。
好比說訪問網頁,確定要用到 HTTP,前面確定會有"HTTP://",這就是 HTTP 協議(超文本傳輸協議)(或者加上了"HTTPS://",這是安全的超文本傳輸協議)。1982 年春,美國國防部宣佈 TCP/IP 做爲軍用網絡的通訊標準。1989 年,Timothy Berners-Lee 研發出了超文本傳輸協議 HTTP,以後,互聯網上能夠傳輸的不只只有文字,還有包括圖片等各類多媒體的網頁。
咱們一般訪問一個網頁的的時候更習慣打域名,好比 https://www.badidu.com,而不會直接打IP(看我上面 ping 命令的截圖,你會看到百度的 IP),由於這樣更好記,但是電腦就不是這麼想的,因此就須要 DNS(域名系統)。DNS 用於經過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務。
若是要發郵件,就要用到SMTP(簡單郵件傳輸協議);還有 FTP(文件傳輸協議),用於 Internet 上的控制文件的雙向傳輸,同時也是一個應用程序;還有 Telnet,Internet 遠程登錄服務的標準協議和主要方式,能用戶能夠在一臺電腦上遠程控制另外一臺電腦(你在 QQ 中大概用過)。
這一層的主要任務是將接收到的數據包按照協議解讀成各類類型的數據,並將要發送的數據打包進傳輸層。主要協議有:HTTP、FTP、SMTP、Telnet、NFS、RIP 等等。