網(wǎng)絡(luò)基礎(chǔ)

網(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é)議。

參考文檔

  1. 操作系統(tǒng)與網(wǎng)絡(luò) - 慕課網(wǎng)
  2. 網(wǎng)絡(luò)是怎樣連接的
  3. netstat -ano 查看機(jī)器端口占用情況
  4. 碼出高效 1.5 TCP/IP

2021年3月25日12:00:52

后面根據(jù)參考文檔補(bǔ)充網(wǎng)絡(luò)部分的筆記。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容