TCP/IP簡易入門

什麼是 TCP/IP 協議

首先,協議,可以理解爲是一套統一的規則,就像行業標準。由於互聯網主要的功能是傳輸信息,所以其協議一般是管理系統之間如何相互通信的規則。

用郵政和物流等線下的“運輸協議”來理解,我們以前寫信的時候都需要寫郵編、寄信人、收信人和地址,在途中郵政也有自身的標準,比如不同地區的郵遞員收集特定地區的郵件,然後彙集分發;物流行業也有集裝箱、鐵軌等。

在互聯網通信中,“如何探測到通信目標、由哪一邊先發起通信、使用哪種語言進行通信、怎樣結束通信等規則都需要事先確定。不同的硬件、操作系統之間的通信,所有的這一切都需要一種規則。”(來自知乎用戶“哦吼”)

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 各層協議的職能

這家公司大概可以分成四個部門,也就是 TCP/IP 協議族按層次分別分爲應用層、傳輸層、網絡層和網絡接口層(數據鏈路層+物理層)。

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

先來個英文版

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

再來個萌萌噠中文版

上面這幅圖其實很形象地表現了整個數據傳輸的過程,我們在微信上發一句話看似很簡單,其實每一步都經過了從上層到底層,再從底層到上層應用的過程。比如小熊在微信上給小明發了一句消息,直到小明收到這個消息,其實就經過了上述過程。

微信所在的是應用層,它按照特定格式把數據打包好,加上收寄件人和雙方地址、自己的 “記號”(以便到了小明那邊知道這條消息是要給微信的)等等,給到傳輸層;傳輸層的 TCP 協議會把文件切成更小的碎片,確保數據包都被安全傳輸;網絡(互連)層的 IP 協議會找到最佳路徑;這個消息會通過光纖、WiFi 等網絡發過去。到達目的地之後,被打散的數據會經過重組,傳輸層也會從記號知道這是給微信的。

上面這個過程其實已經聊到 TCP 協議和 IP 協議的主要作用,這兩個分別是傳輸層和網絡互連層最主要的協議,因此這個模型以它們來命名。具體過程中會有很多其他協議,傳不同的數據時,應用層會有不同的協議處理。感興趣的寶寶可以繼續跟我一起了解細節。

每一層都有自身的職能和常見的協議,整理 CSDN 上極光推送的博客、March On 博主,知乎網友哦吼Drake小明的文章,還有《圖解HTTP》一書,總結如下。

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

互聯網中信息以數據包的單位傳輸,不同的協議層對數據包有不同的稱謂,在傳輸層叫做段 (segment),在網絡層叫做數據報 (datagram),在鏈路層叫做幀 (frame)。

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

圖文來自《圖解HTTP》

發送端在層與層之間傳輸數據時,每經過一層時必定會被打上一個該層所屬的首部信息,這種把數據信息包裝起來的做法稱爲封裝(encapsulate)。數據封裝成幀後發到傳輸介質上,到達目的主機後每層協議再剝掉相應的首部,最後將應用層數據交給應用程序處理。 我會從最底層開始講起。

網絡接口層

常見協議: Ethernet 802.3、Token Ring 802.5、X.25、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 協議,但由於帶寬限制,如果你想和本網絡外的節點溝通時,就得使用一個設備:路由器。世界上大多數的路由器被幾家大運營商掌管。

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

如上圖,節點 1 和 2 同屬一個子網,可基於內部通信協議溝通,而 1 和 5 間的聯絡必須基於 IP 協議,通過路由器 1 和 2 之間的路徑交流。

把 IP 協議的邏輯推廣到整個互聯網,最終,連接我們手機客戶端和騰訊服務器的是無數個路由器。

ä¸æçæäºèç½TCP/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》裏面萌萌噠圖解釋一下這個過程:

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

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)爲單位的數據包進行管理。而可靠的傳輸服務是指,能夠把數據準確可靠地傳給對方。簡單來說就是,它把數據切成一個個數據包,從第一隻數據包開始傳,傳送成功就翻倍,發現失敗就地爬起來,從絆倒的那隻數據包重新開始,周而復始。(以下內容來自知乎用戶陳寶佳小明):

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

圖片來自《圖解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,所以後者更快。

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

我在學校的時候,有師兄教過我用 “ping” 命令來測試兩臺主機之間 TCP/IP 通信是否正常。依然是據上面那個知乎大神解釋,“其實 ping 命令的原理就是向對方主機發送 UDP 數據包,然後對方主機確認收到數據包, 如果數據包是否到達的消息及時反饋回來,那麼網絡就是通的。ping 命令是使用 IP 和網絡控制信息協議 (ICMP),因而沒有涉及到任何傳輸協議(UDP/TCP) 和應用程序。它發送 icmp 回送請求消息給目的主機。ICMP 協議規定:目的主機必須返回 ICMP 回送應答消息給源主機。如果源主機在一定時間內收到應答,則認爲主機可達。”

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

應用層

應用層是互聯網程序與其他程序通信所使用的層,也是離用戶“最近”的一層。

比如說訪問網頁,肯定要用到 HTTP,前面肯定會有"HTTP://",這就是  HTTP 協議(超文本傳輸協議)(或者加上了"HTTPS://",這是安全的超文本傳輸協議)。1982 年春,美國國防部宣佈 TCP/IP 作爲軍用網絡的通信標準。1989 年,Timothy Berners-Lee 研發出了超文本傳輸協議 HTTP,之後,互聯網上可以傳輸的不僅只有文字,還有包括圖片等各種多媒體的網頁。

我們通常訪問一個網頁的的時候更習慣打域名,比如 http://www.badidu.com,而不會直接打 IP(看我上面 ping 命令的截圖,你會看到百度的 IP),因爲這樣更好記,可是電腦就不是這麼想的,所以就需要 DNS(域名系統)。DNS 用於通過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務。

如果要發郵件,就要用到SMTP(簡單郵件傳輸協議);還有 FTP(文件傳輸協議),用於 Internet 上的控制文件的雙向傳輸,同時也是一個應用程序;還有 Telnet,Internet 遠程登陸服務的標準協議和主要方式,能用戶可以在一臺電腦上遠程控制另一臺電腦(你在 QQ 中大概用過)。

ä¸æçæäºèç½TCP/IPåè®® | å°æ学习ç¬è®°

這一層的主要任務是將接收到的數據包按照協議解讀成各種類型的數據,並將要發送的數據打包進傳輸層。主要協議有:HTTP、FTP、SMTP、Telnet、NFS、RIP 等等。

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