網(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)用層
- 表示層
- 會話層
- 傳輸層
- 網(wǎng)絡(luò)層
- 數(shù)據(jù)鏈路層
- 物理層
1.1 物理層
電腦之間需要聯(lián)網(wǎng)脓杉,都需要插一根網(wǎng)線,美國與中國聯(lián)網(wǎng)是海底的光纜冲九,這里的光纜與網(wǎng)線都屬于物理層剖膳,將各個電腦連接起來,形成一個網(wǎng)絡(luò),這就是物理層的含義榄鉴,物理層負責傳輸 0 和 1 的電路信號。
1.2 數(shù)據(jù)鏈路層
物理層將各個電腦連接起來了蛉抓,還傳輸 0 和 1 的電路信號庆尘,但是這些 01 的含義和規(guī)則并沒有統(tǒng)一規(guī)定,很多年前巷送,各個公司都定義自己的電路信號規(guī)則减余,為了互聯(lián)互通,就誕生了以太網(wǎng)協(xié)議惩系。
一組 01 電路信號是一個數(shù)據(jù)包,叫一個幀 (frame) 如筛,每個幀分成兩個部分堡牡,標頭(head) 和數(shù)據(jù)(data) ,標頭包含一些說明性的東西杨刨,比如發(fā)送者晤柄,接受者,數(shù)據(jù)類型之類妖胀。
以太網(wǎng)協(xié)議規(guī)定芥颈,接入網(wǎng)絡(luò)的所有設(shè)備惠勒,都必須有一個網(wǎng)卡,以太網(wǎng)協(xié)議里的數(shù)據(jù)包爬坑,在數(shù)據(jù)鏈路層傳輸?shù)臄?shù)據(jù)包纠屋,必須從一個電腦的網(wǎng)卡,傳輸?shù)搅硪粋€電腦的網(wǎng)卡盾计,而這個網(wǎng)卡的唯一標識就是 mac 地址售担。每塊網(wǎng)卡出廠的時候,就有一個全球唯一的 mac 地址署辉,48 bit 即 12 位 16進制數(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ù)包時,必須指定接受者的 mac 地址才能傳輸數(shù)據(jù)莽红。
以太網(wǎng)的數(shù)據(jù)包從一個 mac 地址發(fā)送到另一個 mac 地址并不是精準推送的妥畏。如果一個電腦發(fā)一個數(shù)據(jù)包出去,會廣播給局域網(wǎng)內(nèi)的所有電腦設(shè)備的網(wǎng)卡安吁,然后每臺電腦都從數(shù)據(jù)包里獲取接收者 mac地址醉蚁,跟自己的 mac 地址進行對比,如果一致鬼店,則說明是發(fā)送給自己的數(shù)據(jù)包网棍。
上面這種廣播的方式,僅僅針對一個子網(wǎng)(局域網(wǎng))內(nèi)的電腦進行廣播妇智,當然也不可能廣播給所有電腦的網(wǎng)卡滥玷。
1.3 網(wǎng)絡(luò)層
通過以太網(wǎng)發(fā)送數(shù)據(jù)包,會廣播給子網(wǎng)(局域網(wǎng))內(nèi)所有電腦巍棱,那么如何知道哪些電腦是在一個子網(wǎng)(局域網(wǎng))內(nèi)呢惑畴?另外在世界范圍內(nèi),不可能通過廣播的方式航徙,從千萬計的電腦里找到目標 MAC地址的電腦而不超時如贷,此時就得依靠 ip 協(xié)議
這就得依靠網(wǎng)絡(luò)層,有一套 ip 地址,ip地址就可以讓我們區(qū)分哪些電腦是一個子網(wǎng)的杠袱。
網(wǎng)絡(luò)層里有 ip 協(xié)議尚猿,ip 協(xié)議定義的地址就是 ip 地址。 ip 地址有 ipv4 和 ipv6 兩個版本楣富,目前廣泛使用的 ipv4凿掂,由 32 位 bit 組成,一般用 4 個十進制數(shù)字表示菩彬,范圍從 0.0.0.0 到 255.255.255.255 缠劝。
每臺計算機,都會分配一個 ip 地址骗灶,ip 地址的前 3 個數(shù)字惨恭,代表了子網(wǎng),后 1 個數(shù)字表示子網(wǎng)內(nèi)的電腦耙旦。如果幾臺電腦是一個子網(wǎng)的脱羡,那么前面的 3 個數(shù)字是一樣的。(這里只是舉例)
準確的來說免都,判斷是否為一個子網(wǎng)锉罐,是將 ip 地址與子網(wǎng)掩碼進行與運算,如果結(jié)果相等绕娘,則說明在同一個子網(wǎng)脓规。
將下面的設(shè)備的 ip 地址與子網(wǎng)掩碼做與運算,可得所在的子網(wǎng)是 192.168.1.0
险领,如果其他設(shè)備的計算結(jié)果也是192.168.1.0
侨舆,則說明在一個子網(wǎng)中,可以通過廣播的方式使用以太網(wǎng)協(xié)議向這臺電腦發(fā)送數(shù)據(jù)包
IPv4 地址 . . . . . . . . . . . . : 192.168.1.107
子網(wǎng)掩碼 . . . . . . . . . . . . : 255.255.255.0
默認網(wǎng)關(guān). . . . . . . . . . . . . : 192.168.1.1
但是如果發(fā)現(xiàn)接收者不在當前子網(wǎng)內(nèi)绢陌,那么就不能通過廣播來發(fā)送數(shù)據(jù)包挨下,則將數(shù)據(jù)包發(fā)送到默認網(wǎng)關(guān)(路由器)通過路由器來發(fā)送數(shù)據(jù)包。路由器負責將多個子網(wǎng)進行連接脐湾,比如家里的路由器臭笆,其實就是將家里的子網(wǎng)發(fā)送的數(shù)據(jù)包路由到你要訪問網(wǎng)站的所在子網(wǎng),進行通信秤掌。當然愁铺,路由器的一次轉(zhuǎn)發(fā),可能并不能直接找到要訪問網(wǎng)站的子網(wǎng)闻鉴,經(jīng)過多次轉(zhuǎn)發(fā)后茵乱,若當前路由器ip 與訪問網(wǎng)站ip 在一個子網(wǎng)內(nèi),則說明找到了目標子網(wǎng)椒拗,然后將數(shù)據(jù)包廣播給當前子網(wǎng)內(nèi)的所有網(wǎng)卡設(shè)備。(路由器的轉(zhuǎn)發(fā)規(guī)則是什么?)
舉個例子蚀苛,一個快遞從美國洛杉磯發(fā)出在验,要發(fā)給中國浙江杭州市A小區(qū)X先生,快遞公司需要將快遞多次轉(zhuǎn)發(fā)堵未,從洛杉磯 -> 紐約 -> 北京 -> 杭州 -> A小區(qū)腋舌,根據(jù)郵編指定轉(zhuǎn)發(fā)路線,然后到了 A 小區(qū)之后渗蟹,就可以用廣播的形式块饺,快遞員大喊一聲 “X先生取快遞了”,雖然小區(qū)內(nèi)所有人都聽到了快遞員的喊聲雌芽,但只有 X 先生會收取快遞并打開確認授艰。
網(wǎng)關(guān)其實就是路由器的一種,運作在網(wǎng)絡(luò)層世落,大家可以把路由器上的 ip 地址認為是網(wǎng)關(guān)淮腾,路由器其實是工作在網(wǎng)絡(luò)層的設(shè)備。我們使用ipconfig
就可以看到默認網(wǎng)關(guān)屉佳,就是路由器的 ip 地址(一般為 192.168.1.1
)谷朝,是子網(wǎng)與外網(wǎng)連接的設(shè)備。
交換機時工作在數(shù)據(jù)鏈路層的武花,通過 mac 地址來尋址和傳輸數(shù)據(jù)包的圆凰,主要用在局域網(wǎng)內(nèi)的通信,一般你假設(shè)一個局域網(wǎng)体箕,里面的電腦通信就是通過數(shù)據(jù)鏈路層發(fā)送數(shù)據(jù)包专钉,通過mac地址來廣播的,廣播就是通過交換機這個設(shè)備來吧數(shù)據(jù)廣播到局域網(wǎng)內(nèi)的其他機器上干旁。
路由器是工作在網(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)轻要。
家里的路由器包含了交換機和路由的兩個功能复旬,如果是與局域網(wǎng)的內(nèi)的設(shè)備連接,就把網(wǎng)線插在 LAN 端口冲泥,如果是與因特網(wǎng)連接驹碍,就把網(wǎng)線插在 WAN 端口壁涎。
1.4 傳輸層
通過 ip 協(xié)議解決了跨局域網(wǎng)的通信問題,但是在一臺電腦上志秃,有多個程序使用一個網(wǎng)卡進行通信怔球,那么如何區(qū)分不同程序的數(shù)據(jù)呢?
這的依靠端口浮还,發(fā)送一個數(shù)據(jù)包到指定電腦(ip)的一個網(wǎng)卡的某個端口竟坛,然后這臺電腦中會有程序來監(jiān)聽這個端口,如 Tomcat 監(jiān)聽 8080钧舌,即使用端口來區(qū)分不同程序的數(shù)據(jù)包担汤。端口范圍是[0~65535]
,其中[0~1023]
被系統(tǒng)占用洼冻。
數(shù)據(jù)鏈路層崭歧,基于以太網(wǎng)協(xié)議,進行局域網(wǎng)內(nèi)的尋址與通信碘赖;
網(wǎng)絡(luò)層驾荣,基于 ip 協(xié)議,進行夸局域網(wǎng)的尋址與通信普泡;
傳輸層播掷,基于 tcp 協(xié)議,通過端口來區(qū)分不同程序的通信數(shù)據(jù)撼班。
傳輸層的 tcp協(xié)議歧匈,僅僅只是規(guī)定了一套基于端口的點對點通信協(xié)議,包括如何建立連接砰嘁,如何發(fā)送和讀取消息件炉,但是實際上如果要基于 tcp 協(xié)議來開發(fā),一般是用 socket矮湘,java socket 網(wǎng)絡(luò)編程斟冕。
我們使用瀏覽器訪問https://www.baidu.com/
,通過瀏覽器控制臺可以看到百度的 ip 地址為14.215.177.38:443
缅阳,其中 443
端口是 HTTPS 的默認端口磕蛇。然后使用netstat -ano
查看端口的占用情況,可以看到本機是進程10900
使用63223
端口訪問的百度十办,ESTABLISHED
表示雙方已經(jīng)建議了連接秀撇。然后查找該進程,果然是我們的瀏覽器進程向族。
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)過上述步驟呵燕,我們也可以知道,瀏覽器的每一個標簽頁其實就是一個進程件相,都會分配一個端口再扭,基于 TCP 協(xié)議來與互聯(lián)網(wǎng)進行通信氧苍。
然后我們啟動一個 Web 項目,訪問端口設(shè)置為 9000泛范,即進程 9180 正在監(jiān)聽 9000端口候引,此時外部地址為 0.0.0.0:0
,說明沒有人與當前端口建立網(wǎng)絡(luò)連接敦跌,再去查一下 9180 進程,恰好是我們的 java 進程逛揩。
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
柠傍,進程 9180 使用 9000 端口與外部地址 [::1]:49474 建立了連接,狀態(tài)為 ESTABLISHED辩稽;進程 10900 使用 49474 端口與外部地址 [::1]:9000 建立了連接惧笛,說人話就是本機的 java進程9180 使用 9000 端口與瀏覽器進程 10900 端口建立了連接。為什么會建立兩條連接呢逞泄?
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
患整,也會訪問到前面的 web項目,可以看到本機的 java進程9180 使用 9000 端口與瀏覽器進程 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 ,說明訪問成功柿汛。以上其實就是 HTTP 協(xié)議冗酿。
參考文檔
2021年3月25日12:00:52
后面根據(jù)參考文檔補充網(wǎng)絡(luò)部分的筆記。