網(wǎng)絡(luò)
TCP/IP四層網(wǎng)絡(luò)模型
- 數(shù)據(jù)鏈路層 - 以太網(wǎng)協(xié)議
- 網(wǎng)絡(luò)層 - IP 協(xié)議
- 傳輸層 - TCP協(xié)議
- 應(yīng)用層 - HTTP 協(xié)議
OSI 七層網(wǎng)絡(luò)模型
- 應(yīng)用層
- 表示層
- 會(huì)話層
- 傳輸層
- 網(wǎng)絡(luò)層
- 數(shù)據(jù)鏈路層
- 物理層
1.1 物理層
電腦之間需要聯(lián)網(wǎng),都需要插一根網(wǎng)線,美國與中國聯(lián)網(wǎng)是海底的光纜,這里的光纜與網(wǎng)線都屬于物理層,將各個(gè)電腦連接起來,形成一個(gè)網(wǎng)絡(luò),這就是物理層的含義,物理層負(fù)責(zé)傳輸 0 和 1 的電路信號。
1.2 數(shù)據(jù)鏈路層
物理層將各個(gè)電腦連接起來了,還傳輸 0 和 1 的電路信號,但是這些 01 的含義和規(guī)則并沒有統(tǒng)一規(guī)定,很多年前,各個(gè)公司都定義自己的電路信號規(guī)則,為了互聯(lián)互通,就誕生了以太網(wǎng)協(xié)議。
一組 01 電路信號是一個(gè)數(shù)據(jù)包,叫一個(gè)幀 (frame) ,每個(gè)幀分成兩個(gè)部分,標(biāo)頭(head) 和數(shù)據(jù)(data) ,標(biāo)頭包含一些說明性的東西,比如發(fā)送者,接受者,數(shù)據(jù)類型之類。
以太網(wǎng)協(xié)議規(guī)定,接入網(wǎng)絡(luò)的所有設(shè)備,都必須有一個(gè)網(wǎng)卡,以太網(wǎng)協(xié)議里的數(shù)據(jù)包,在數(shù)據(jù)鏈路層傳輸?shù)臄?shù)據(jù)包,必須從一個(gè)電腦的網(wǎng)卡,傳輸?shù)搅硪粋€(gè)電腦的網(wǎng)卡,而這個(gè)網(wǎng)卡的唯一標(biāo)識就是 mac 地址。每塊網(wǎng)卡出廠的時(shí)候,就有一個(gè)全球唯一的 mac 地址,48 bit 即 12 位 16進(jìn)制數(shù)表示,前 6 位是網(wǎng)卡廠商編號,后 6 為是網(wǎng)卡流水號。
在 windows 中,ipconfig /all可以查看物理地址,就是 mac地址
C:\Users\trac>ipconfig /all
# VMware 的虛擬網(wǎng)卡
以太網(wǎng)適配器 VMware Network Adapter VMnet1:
描述. . . . . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
物理地址. . . . . . . . . . . . . : 00-50-56-C0-00-01
IPv4 地址 . . . . . . . . . . . . : 192.168.253.1(首選)
# VMware 的虛擬網(wǎng)卡
以太網(wǎng)適配器 VMware Network Adapter VMnet8:
描述. . . . . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
物理地址. . . . . . . . . . . . . : 00-50-56-C0-00-08
IPv4 地址 . . . . . . . . . . . . : 192.168.252.1(首選)
# 電腦上的真網(wǎng)卡
以太網(wǎng)適配器 以太網(wǎng):
描述. . . . . . . . . . . . . . . : Intel(R) Ethernet Connection (7) I219-V
物理地址. . . . . . . . . . . . . : 30-9C-23-E8-C1-7E
IPv4 地址 . . . . . . . . . . . . : 192.168.1.107(首選)
# Hyper-V 的虛擬網(wǎng)卡
以太網(wǎng)適配器 vEthernet (Default Switch):
描述. . . . . . . . . . . . . . . : Hyper-V Virtual Ethernet Adapter
物理地址. . . . . . . . . . . . . : 00-15-5D-D5-CA-E6
IPv4 地址 . . . . . . . . . . . . : 172.27.128.1(首選)
通過去網(wǎng)站 https://mac.51240.com 查詢這些網(wǎng)卡,電腦上的物理網(wǎng)卡廠商是 Micro_Star 微星,與電腦主板的廠商一致,Hyper-V 的虛擬網(wǎng)卡的廠商是 Microsoft 微軟,VMware 的虛擬網(wǎng)卡的廠商是 VMware。
在以太網(wǎng)中傳輸數(shù)據(jù)包時(shí),必須指定接受者的 mac 地址才能傳輸數(shù)據(jù)。
以太網(wǎng)的數(shù)據(jù)包從一個(gè) mac 地址發(fā)送到另一個(gè) mac 地址并不是精準(zhǔn)推送的。如果一個(gè)電腦發(fā)一個(gè)數(shù)據(jù)包出去,會(huì)廣播給局域網(wǎng)內(nèi)的所有電腦設(shè)備的網(wǎng)卡,然后每臺(tái)電腦都從數(shù)據(jù)包里獲取接收者 mac地址,跟自己的 mac 地址進(jìn)行對比,如果一致,則說明是發(fā)送給自己的數(shù)據(jù)包。
上面這種廣播的方式,僅僅針對一個(gè)子網(wǎng)(局域網(wǎng))內(nèi)的電腦進(jìn)行廣播,當(dāng)然也不可能廣播給所有電腦的網(wǎng)卡。
1.3 網(wǎng)絡(luò)層
通過以太網(wǎng)發(fā)送數(shù)據(jù)包,會(huì)廣播給子網(wǎng)(局域網(wǎng))內(nèi)所有電腦,那么如何知道哪些電腦是在一個(gè)子網(wǎng)(局域網(wǎng))內(nèi)呢?另外在世界范圍內(nèi),不可能通過廣播的方式,從千萬計(jì)的電腦里找到目標(biāo) MAC地址的電腦而不超時(shí),此時(shí)就得依靠 ip 協(xié)議
這就得依靠網(wǎng)絡(luò)層,有一套 ip 地址,ip地址就可以讓我們區(qū)分哪些電腦是一個(gè)子網(wǎng)的。
網(wǎng)絡(luò)層里有 ip 協(xié)議,ip 協(xié)議定義的地址就是 ip 地址。 ip 地址有 ipv4 和 ipv6 兩個(gè)版本,目前廣泛使用的 ipv4,由 32 位 bit 組成,一般用 4 個(gè)十進(jìn)制數(shù)字表示,范圍從 0.0.0.0 到 255.255.255.255 。
每臺(tái)計(jì)算機(jī),都會(huì)分配一個(gè) ip 地址,ip 地址的前 3 個(gè)數(shù)字,代表了子網(wǎng),后 1 個(gè)數(shù)字表示子網(wǎng)內(nèi)的電腦。如果幾臺(tái)電腦是一個(gè)子網(wǎng)的,那么前面的 3 個(gè)數(shù)字是一樣的。(這里只是舉例)
準(zhǔn)確的來說,判斷是否為一個(gè)子網(wǎng),是將 ip 地址與子網(wǎng)掩碼進(jìn)行與運(yùn)算,如果結(jié)果相等,則說明在同一個(gè)子網(wǎng)。
將下面的設(shè)備的 ip 地址與子網(wǎng)掩碼做與運(yùn)算,可得所在的子網(wǎng)是 192.168.1.0,如果其他設(shè)備的計(jì)算結(jié)果也是192.168.1.0,則說明在一個(gè)子網(wǎng)中,可以通過廣播的方式使用以太網(wǎng)協(xié)議向這臺(tái)電腦發(fā)送數(shù)據(jù)包
IPv4 地址 . . . . . . . . . . . . : 192.168.1.107
子網(wǎng)掩碼 . . . . . . . . . . . . : 255.255.255.0
默認(rèn)網(wǎng)關(guān). . . . . . . . . . . . . : 192.168.1.1
但是如果發(fā)現(xiàn)接收者不在當(dāng)前子網(wǎng)內(nèi),那么就不能通過廣播來發(fā)送數(shù)據(jù)包,則將數(shù)據(jù)包發(fā)送到默認(rèn)網(wǎng)關(guān)(路由器)通過路由器來發(fā)送數(shù)據(jù)包。路由器負(fù)責(zé)將多個(gè)子網(wǎng)進(jìn)行連接,比如家里的路由器,其實(shí)就是將家里的子網(wǎng)發(fā)送的數(shù)據(jù)包路由到你要訪問網(wǎng)站的所在子網(wǎng),進(jìn)行通信。當(dāng)然,路由器的一次轉(zhuǎn)發(fā),可能并不能直接找到要訪問網(wǎng)站的子網(wǎng),經(jīng)過多次轉(zhuǎn)發(fā)后,若當(dāng)前路由器ip 與訪問網(wǎng)站ip 在一個(gè)子網(wǎng)內(nèi),則說明找到了目標(biāo)子網(wǎng),然后將數(shù)據(jù)包廣播給當(dāng)前子網(wǎng)內(nèi)的所有網(wǎng)卡設(shè)備。(路由器的轉(zhuǎn)發(fā)規(guī)則是什么?)
舉個(gè)例子,一個(gè)快遞從美國洛杉磯發(fā)出,要發(fā)給中國浙江杭州市A小區(qū)X先生,快遞公司需要將快遞多次轉(zhuǎn)發(fā),從洛杉磯 -> 紐約 -> 北京 -> 杭州 -> A小區(qū),根據(jù)郵編指定轉(zhuǎn)發(fā)路線,然后到了 A 小區(qū)之后,就可以用廣播的形式,快遞員大喊一聲 “X先生取快遞了”,雖然小區(qū)內(nèi)所有人都聽到了快遞員的喊聲,但只有 X 先生會(huì)收取快遞并打開確認(rèn)。
網(wǎng)關(guān)其實(shí)就是路由器的一種,運(yùn)作在網(wǎng)絡(luò)層,大家可以把路由器上的 ip 地址認(rèn)為是網(wǎng)關(guān),路由器其實(shí)是工作在網(wǎng)絡(luò)層的設(shè)備。我們使用ipconfig就可以看到默認(rèn)網(wǎng)關(guān),就是路由器的 ip 地址(一般為 192.168.1.1),是子網(wǎng)與外網(wǎng)連接的設(shè)備。
交換機(jī)時(shí)工作在數(shù)據(jù)鏈路層的,通過 mac 地址來尋址和傳輸數(shù)據(jù)包的,主要用在局域網(wǎng)內(nèi)的通信,一般你假設(shè)一個(gè)局域網(wǎng),里面的電腦通信就是通過數(shù)據(jù)鏈路層發(fā)送數(shù)據(jù)包,通過mac地址來廣播的,廣播就是通過交換機(jī)這個(gè)設(shè)備來吧數(shù)據(jù)廣播到局域網(wǎng)內(nèi)的其他機(jī)器上。
路由器是工作在網(wǎng)絡(luò)層的,通過 ip 地址尋址和傳輸數(shù)據(jù)包的,一般用于連接英特網(wǎng)。
LAN local area network 是局域網(wǎng),WAN wide area network 是廣域網(wǎng),WLAN wireless area network 是無線局域網(wǎng),也就是 wifi,在局域網(wǎng)內(nèi),可以通過 wifi 無線聯(lián)網(wǎng)。
家里的路由器包含了交換機(jī)和路由的兩個(gè)功能,如果是與局域網(wǎng)的內(nèi)的設(shè)備連接,就把網(wǎng)線插在 LAN 端口,如果是與因特網(wǎng)連接,就把網(wǎng)線插在 WAN 端口。
1.4 傳輸層
通過 ip 協(xié)議解決了跨局域網(wǎng)的通信問題,但是在一臺(tái)電腦上,有多個(gè)程序使用一個(gè)網(wǎng)卡進(jìn)行通信,那么如何區(qū)分不同程序的數(shù)據(jù)呢?
這的依靠端口,發(fā)送一個(gè)數(shù)據(jù)包到指定電腦(ip)的一個(gè)網(wǎng)卡的某個(gè)端口,然后這臺(tái)電腦中會(huì)有程序來監(jiān)聽這個(gè)端口,如 Tomcat 監(jiān)聽 8080,即使用端口來區(qū)分不同程序的數(shù)據(jù)包。端口范圍是[0~65535],其中[0~1023]被系統(tǒng)占用。
數(shù)據(jù)鏈路層,基于以太網(wǎng)協(xié)議,進(jìn)行局域網(wǎng)內(nèi)的尋址與通信;
網(wǎng)絡(luò)層,基于 ip 協(xié)議,進(jìn)行夸局域網(wǎng)的尋址與通信;
傳輸層,基于 tcp 協(xié)議,通過端口來區(qū)分不同程序的通信數(shù)據(jù)。
傳輸層的 tcp協(xié)議,僅僅只是規(guī)定了一套基于端口的點(diǎn)對點(diǎn)通信協(xié)議,包括如何建立連接,如何發(fā)送和讀取消息,但是實(shí)際上如果要基于 tcp 協(xié)議來開發(fā),一般是用 socket,java socket 網(wǎng)絡(luò)編程。
我們使用瀏覽器訪問https://www.baidu.com/,通過瀏覽器控制臺(tái)可以看到百度的 ip 地址為14.215.177.38:443,其中 443 端口是 HTTPS 的默認(rèn)端口。然后使用netstat -ano查看端口的占用情況,可以看到本機(jī)是進(jìn)程10900使用63223端口訪問的百度,ESTABLISHED表示雙方已經(jīng)建議了連接。然后查找該進(jìn)程,果然是我們的瀏覽器進(jìn)程。
C:\Users\mao> netstat -ano | findstr "443"
協(xié)議 本地地址 外部地址 狀態(tài) PID
TCP 192.168.1.107:63223 14.215.177.38:443 ESTABLISHED 10900
C:\Users\mao>tasklist | findstr "10900"
QQBrowser.exe 10900 Console 1 205,232 K
經(jīng)過上述步驟,我們也可以知道,瀏覽器的每一個(gè)標(biāo)簽頁其實(shí)就是一個(gè)進(jìn)程,都會(huì)分配一個(gè)端口,基于 TCP 協(xié)議來與互聯(lián)網(wǎng)進(jìn)行通信。
然后我們啟動(dòng)一個(gè) Web 項(xiàng)目,訪問端口設(shè)置為 9000,即進(jìn)程 9180 正在監(jiān)聽 9000端口,此時(shí)外部地址為 0.0.0.0:0,說明沒有人與當(dāng)前端口建立網(wǎng)絡(luò)連接,再去查一下 9180 進(jìn)程,恰好是我們的 java 進(jìn)程。
C:\Users\mao>netstat -ano | findstr "9000"
協(xié)議 本地地址 外部地址 狀態(tài) PID
TCP 0.0.0.0:9000 0.0.0.0:0 LISTENING 9180
TCP [::]:9000 [::]:0 LISTENING 9180
然后使用瀏覽器訪問 localhost:9000,進(jìn)程 9180 使用 9000 端口與外部地址 [::1]:49474 建立了連接,狀態(tài)為 ESTABLISHED;進(jìn)程 10900 使用 49474 端口與外部地址 [::1]:9000 建立了連接,說人話就是本機(jī)的 java進(jìn)程9180 使用 9000 端口與瀏覽器進(jìn)程 10900 端口建立了連接。為什么會(huì)建立兩條連接呢?
C:\Users\mao>netstat -ano | findstr "9000"
協(xié)議 本地地址 外部地址 狀態(tài) PID
TCP 0.0.0.0:9000 0.0.0.0:0 LISTENING 9180
TCP [::]:9000 [::]:0 LISTENING 9180
TCP [::1]:9000 [::1]:49474 ESTABLISHED 9180
TCP [::1]:9000 [::1]:49547 ESTABLISHED 9180
TCP [::1]:49474 [::1]:9000 ESTABLISHED 10900
TCP [::1]:49475 [::1]:9000 TIME_WAIT 0
TCP [::1]:49547 [::1]:9000 ESTABLISHED 10900
然后再使用瀏覽器訪問192.168.1.107:9000,也會(huì)訪問到前面的 web項(xiàng)目,可以看到本機(jī)的 java進(jìn)程9180 使用 9000 端口與瀏覽器進(jìn)程 8084 使用49740端口建立了連接。
C:\Users\mao>netstat -ano | findstr "9000"
協(xié)議 本地地址 外部地址 狀態(tài) PID
TCP 0.0.0.0:9000 0.0.0.0:0 LISTENING 9180
TCP 192.168.1.107:9000 192.168.1.107:49740 ESTABLISHED 9180
TCP 192.168.1.107:49740 192.168.1.107:9000 ESTABLISHED 8084
TCP 的三次握手與四次揮手參考《碼出高效》1.5章節(jié)。
1.5 應(yīng)用層
通過傳輸層的 tcp 協(xié)議可以傳輸數(shù)據(jù),接收到數(shù)據(jù)后,怎么解析?比如郵件如何發(fā)送如何解析,網(wǎng)頁如何請求如何解析,針對不同的數(shù)據(jù)類型,需要定義不同的應(yīng)用層協(xié)議。
HTTP 協(xié)議就是網(wǎng)頁傳輸?shù)膮f(xié)議,GET http://localhost:8080?k1=v1&k2=v2 http-1.1 ,返回 200 ,說明訪問成功。以上其實(shí)就是 HTTP 協(xié)議。
參考文檔
- 操作系統(tǒng)與網(wǎng)絡(luò) - 慕課網(wǎng)
- 網(wǎng)絡(luò)是怎樣連接的
- netstat -ano 查看機(jī)器端口占用情況
- 碼出高效 1.5 TCP/IP
2021年3月25日12:00:52
后面根據(jù)參考文檔補(bǔ)充網(wǎng)絡(luò)部分的筆記。