文章目錄
- 1. 網絡發展史
- 1.1 廣域網
- 1.2 局域網
- 2. 網絡通信基礎
- 2.1 IP地址
- 2.2 端口號
- 2.3 認識協議
- 2.4 五元組
- 2.5 協議分層
- 2.5.1 分層的作用
- 2.5.2 OSI七層模型(教科書)
- 2.5.3 TCP/IP五層(或四層)模型(工業中常用,行業中常說)
- 2.6 封裝和分用
1. 網絡發展史
1.1 廣域網
廣域網,即WideArea Network,簡稱WAN。通過路由器,將多個局域網連接起來,在物理上組成很大范圍的網絡,就形成了廣域網。廣域網內部的局域網都屬于其子網。
如果有北、中、南等分公司,甚至海外分公司,把這些分公司以專線方式連接起來,即稱為“廣域網”。如果屬于全球化的公共型廣域網,則稱為互聯網(又稱公網,外網),屬于廣域網的一個子集。有時在不嚴格的環境下說的廣域網,其實是指互聯網。所謂“局域網”和"廣域網”只是一個相對的概念。比如,我們有"天朝特色”的廣域網,也可以看做一個比較大的局域網。
1.2 局域網
局域網,即LocalAreaNetwork,簡稱LAN。Local即標識了局域網是本地,局部組建的一種私有網絡。局域網內的主機之間能方便的進行網絡通信,又稱為內網;局域網和局域網之間在沒有連接的情況下,是無法通信的。
局域網組建網絡的方式有很多種:
-
基于網線直連
-
基于集線器組建
-
基于交換機組建
可以實現對所有計算機設備的數據轉發,在內網中實現組網,主要用在公司內部。 -
基于交換機和路由器組建
通過路由可以連接互聯網(廣域網),獲取一個公網IP。
在公司和家庭中很常見,路由器下面可以連接多個交換機。
路由:可以理解為一個地方到另一個地方的路徑。但是路徑有多條,有路程最短的、用時最短的、最通暢的、成本最低的。例如:從北京到上海的快遞可能有多種路線,路由器類似“中轉站”負責選擇最快或最經濟的路徑。
2. 網絡通信基礎
2.1 IP地址
概念: IP地址主要用于標識網絡主機、其他網絡設備(如路由器)的網絡地址。簡單說,IP地址用于定位主機的網絡地址。就像我們發送快遞一樣,需要知道對方的收貨地址,快遞員才能將包裹送到目的地。
格式: IP地址是一個32位的二進制數,通常被分割為4個“8位二進制數”(也就是4個字節,也就是相當于一個整形的大小,42億左右),如:01100100.00000100.00000101.00000110。
我們把這種表示稱為IPv4,但是,隨著網絡設備越來越多,42億個IP就不夠了,升級成了IPv6。
通常用“點分十進制”的方式來表示,即a.b.c.d的形式(a,b,c,d都是0~255之間的十進制整數)如:100.4.5.6。
2.2 端口號
概念: 在網絡通信中,IP地址用于標識主機網絡地址,端口號可以標識主機中發送數據、接收數據的進程。簡單說:端口號用于定位主機中的進程。
類似發送快遞時,不光需要指定收貨地址(IP地址),還需要指定收貨人(端口號)。
格式: 端口號是0~65535范圍的數字,在網絡通信中,進程可以通過綁定一個端口號,來發送及接收網絡數據。
如果是服務提供方就需要一個確定的端口號(比如MySQL服務端的端口號默認是3306),如果是客戶端的話系統會隨機分配一個端口號。1 ~ 1024是知名端口號,比較有名的程序已經占用了的端口號,比如web程序用的80,FTP用的21。1025 ~ 65535這個范圍內可以隨便指定,原則就是一臺主機上的端口號不能在不同的網絡程序之間沖突。
**問題:**有了IP地址和端口號,可以定位到網絡中唯一的一個進程,但還存在一個問題,網絡通信是基于二進制0/1數據來傳輸,如何告訴對方發送的數據是什么樣的呢?網絡通信傳輸的數據類型可能有多種:圖片,視頻,文本等。同一個類型的數據,格式可能也不同,如發送一個文本字符串“你好!”:如何標識發送的數據是文本類型,及文本的編碼格式呢?
基于網絡數據傳輸,需要使用協議來規定雙方的數據格式。
2.3 認識協議
概念: 協議,網絡協議的簡稱,網絡協議是網絡通信(即網絡數據傳輸)經過的所有網絡設備都必須共同遵從的一組約定、規則。如怎么樣建立連接、怎么樣互相識別等。只有遵守這個約定,計算機之間才能相互通信交流。協議(protocol)最終體現為在網絡上傳輸的數據包的格式。
2.4 五元組
在TCP/IP協議中,用五元組來標識一個網絡通信:
- 源IP:標識源主機
- 源端口號:標識源主機中該次通信發送數據的進程
- 目的IP:標識目的主機
- 目的端口號:標識目的主機中該次通信接收數據的進程
- 協議號:標識發送進程和接收進程雙方約定的數據格式
可以在cmd中,輸入netstat -ano
查看網絡數據傳輸中的五元組信息:
2.5 協議分層
2.5.1 分層的作用
分層最大的好處,類似于面向接口編程:定義好兩層間的接口規范,讓雙方遵循這個規范來對接。在代碼中,類似于定義好一個接口,一方為接口的實現類(提供方,提供服務),一方為接口的使用類(使用方,使用服務):
- 對于使用方來說,并不關心提供方是如何實現的,只需要使用接口即可。
- 對于提供方來說,利用封裝的特性,隱藏了實現的細節,只需要開放接口即可。
2.5.2 OSI七層模型(教科書)
OSI七層模型既復雜又不實用:所以OSI七層模型沒有落地、實現。實際組建網絡時,只是以OSI七層模型設計中的部分分層,也即是以下TCP/IP五層(或四層)模型來實現。
2.5.3 TCP/IP五層(或四層)模型(工業中常用,行業中常說)
TCP/IP是一組協議的代名詞,它還包括許多協議,組成了TCP/IP協議簇。
TCP/IP通訊協議采用了5層的層級結構,每一層都呼叫它的下一層所提供的網絡來完成自己的需求。
1. 應用層: 和用戶打交道,接收與展示用戶的數據,比如手法快遞的過程中,只關注物品本身。
2. 傳輸層: 完成端到端的傳輸的準備,也就是說確定收發主機的地址和端口號,比如確認快遞的收件人和發件人的地址和電話。
3. 網絡層: 規劃出端到端之間的網絡路徑,路徑中可能會包含中間經過其他的網絡設備,比如快遞運輸過程中可能經過的加油站。
4. 數據鏈路層: 完成點到點之間的傳輸,每個網絡設備之間的傳輸。
5. 物理層: 把真實的BIT數據流通過轉換成光電信號在傳輸介質中傳輸(網線:電信號;光纖:光信號)。
其中四層是指不包含物理層。
2.6 封裝和分用
封裝是指在發送方對數據進行的處理。
分用是指在接收方對數據進行的處理。
下面就以qq發送消息與接收消息的場景為例:
1. 應用層
這一層是由應用程序來實現的,此時對應的就是QQ這個應用程序,應用層主要是確定消息體的內容。
比如現在用戶A要給用戶B發送一個"hello"。下面一個問題就是如何進行數據的組織與解析,這個協議一般是在設計階段就要完成的任務(協議的任務只有程序員知道),現在我們假設協議是:發送方QQ;接收方QQ;發送的內容
那么,我們按照協議規定組織好的數據就是:123456;654321;hello
組織好之后,就可以調用系統的API(socket api)進行發送操作,從而信息的處理方移交給下一層。
2. 傳輸層
傳輸層眾多協議中最典型的兩種協議是:TCP協議、UDP協議。我們假設使用TCP協議:
此時我們就接收到消息體,我們把這個消息體稱為載荷
此時會在傳輸層根據TCP協議加上一個在載荷頭部加上一個TCP頭,該TCP頭主要確定源端口號和目標端口號,該操作由操作洗頭膏完成們可以知道哪個程序使用了哪個端口號。
3. 網絡層
該層會規劃出端到端之間的網絡路徑。
此時當前載荷就變成了:
該層會根據IP協議在該載荷頭部加一個IP頭,該IP頭主要確定了元IP地址與目標IP地址,此時就可以確認消息要發送給哪臺主機的哪個進程。
如何獲取接收方的IP地址與端口號?
我們在使用QQ時都是需要登錄的,登陸的時候等于向QQ服務器發送了一個請求,然后QQ服務器給了有一個響應,此時QQ服務器就會記錄登陸方的信息類似于key value的形式,比如:(key:QQ123456, value:IP:端口號)。用戶A和用戶B在進行信息傳輸的時候并不是兩臺網絡設備直接進行傳輸的,而是發送方會把信息發送到QQ服務器,服務器根據自己維護的登錄用戶以及對應的IP地址,找到接收方的IP,再把消息轉發給接收方。
4. 數據鏈路層
此時的載荷是:
該層會根據以太協議在當前載荷的頭部和尾部分別加一個幀頭和幀尾。
幀頭中存放的是源MAC地址和目標MAC地址;幀尾中存放的是校驗和。
校驗和
發送方通過某種算法(CRC–對每個byte進行累加操作,最終得一個值)對載荷進行運算,得到一個值并保存起來,接收方在收到數據之后,取出載荷以相同的算法進行計算,如果得到的結果與校驗和相同,就表示接收到的載荷與發送的載荷一致,中途沒有被篡改,否則載荷就是無效的。
加入幀頭和幀尾之后,把數據以二進制的形式發送給物理層。
5. 物理層
這一層主要是把具體的數據(報文)轉換成光電信號,通過傳輸介質進行傳輸。
如何通過電信號表示0和1?
高電平表示1(3.5 ~ 5v);低電平表示0(0.1v ~ 0.25v)
6. 物理層
接收到光電信號之后,根據以太網協議把信號轉換成二進制BIT流。
然后以二進制的形式交給上一層。
7. 數據鏈路層
該層會解析出幀頭、幀尾和載荷。
確認數據正確之后,會去掉幀頭和幀尾,然后把本層的載荷移交給上一層。
8. 網絡層
根據IP協議解析報文,取出載荷交給上一層。
9. 傳輸層
根據TCP協議解析報文,取出載荷交給上一層。
10. 應用層
按照應用程序解析消息體–發送方QQ:123456;接收方QQ:654321;消息內容:hello.
以上的1-5是發送方,6-10是接收方
發送方的數據從應用層到物理層的過程叫封裝;接收方的數據從物理層到應用層的過程叫分用。