主頁 > 軟體設計 > 電腦A和他的女朋友電腦B坐在一塊聊天,這就是網路。IO、中斷、緩沖區這都不是研究網路時該關心的事

電腦A和他的女朋友電腦B坐在一塊聊天,這就是網路。IO、中斷、緩沖區這都不是研究網路時該關心的事

2021-01-17 10:36:08 軟體設計

你是一臺電腦,你的名字叫 A

很久很久之前,你不與任何其他電腦相連接,孤苦伶仃,

直到有一天,你希望與另一臺電腦 B 建立通信,于是你們各開了一個網口,用一根網線連接了起來,

用一根網線連接起來怎么就能"通信"了呢?我可以給你講 IO、講中斷、講緩沖區,但這不是研究網路時該關心的問題,

如果你糾結,要么去研究一下作業系統是如何處理網路 IO 的,要么去研究一下包是如何被網卡轉換成電信號發送出去的,要么就僅僅把它當做電腦里有個小人在開槍吧~

反正,你們就是連起來了,并且可以通信,

第一層

有一天,一個新伙伴 C 加入了,但聰明的你們很快發現,可以每個人開兩個網口,用一共三根網線,彼此相連,

隨著越來越多的人加入,你發現身上開的網口實在太多了,而且網線密密麻麻,混亂不堪,(而實際上一臺電腦根本開不了這么多網口,所以這種連線只在理論上可行,所以連不上的我就用紅色虛線表示了,就是這么嚴謹哈哈~)

于是你們發明了一個中間設備,你們將網線都插到這個設備上,由這個設備做轉發,就可以彼此之間通信了,本質上和原來一樣,只不過網口的數量和網線的數量減少了,不再那么混亂,

你給它取名叫集線器,它僅僅是無腦將電信號轉發到所有出口(廣播),不做任何處理,你覺得它是沒有智商的,因此把人家定性在了物理層

由于轉發到了所有出口,那 BCDE 四臺機器怎么知道資料包是不是發給自己的呢?

首先,你要給所有的連接到交換機的設備,都起個名字,原來你們叫 ABCD,但現在需要一個更專業的,全域唯一的名字作為標識,你把這個更高端的名字稱為 MAC 地址

你的 MAC 地址是 aa-aa-aa-aa-aa-aa,你的伙伴 b 的 MAC 地址是 bb-bb-bb-bb-bb-bb,以此類推,不重復就好,

這樣,A 在發送資料包給 B 時,只要在頭部拼接一個這樣結構的資料,就可以了,

B 在收到資料包后,根據頭部的目標 MAC 地址資訊,判斷這個資料包的確是發給自己的,于是便收下

其他的 CDE 收到資料包后,根據頭部的目標 MAC 地址資訊,判斷這個資料包并不是發給自己的,于是便丟棄

雖然集線器使整個布局干凈不少,但原來我只要發給電腦 B 的訊息,現在卻要發給連接到集線器中的所有電腦,這樣既不安全,又不節省網路資源,

第二層

如果把這個集線器弄得更智能一些,只發給目標 MAC 地址指向的那臺電腦,就好了,

雖然只比集線器多了這一點點區別,但看起來似乎有智能了,你把這東西叫做交換機,也正因為這一點點智能,你把它放在了另一個層級,資料鏈路層

如上圖所示,你是這樣設計的,

交換機內部維護一張 MAC 地址表,記錄著每一個 MAC 地址的設備,連接在其哪一個埠上,

MAC 地址
bb-bb-bb-bb-bb-bb1
cc-cc-cc-cc-cc-cc3
aa-aa-aa-aa-aa-aa4
dd-dd-dd-dd-dd-dd5

假如你仍然要發給 B 一個資料包,構造了如下的資料結構從網口出去,

到達交換機時,交換機內部通過自己維護的 MAC 地址表,發現目標機器 B 的 MAC 地址 bb-bb-bb-bb-bb-bb 映射到了埠 1 上,于是把資料從 1 號埠發給了 B,完事~

你給這個通過這樣傳輸方式而組成的小范圍的網路,叫做以太網

當然最開始的時候,MAC 地址表是空的,是怎么逐步建立起來的呢?

假如在 MAC 地址表為空是,你給 B 發送了如下資料

由于這個包從埠 4 進入的交換機,所以此時交換機就可以在 MAC地址表記錄第一條資料:

MAC:aa-aa-aa-aa-aa-aa-aa
埠:4

交換機看目標 MAC 地址(bb-bb-bb-bb-bb-bb)在地址表中并沒有映射關系,于是將此包發給了所有埠,也即發給了所有機器,

之后,只有機器 B 收到了確實是發給自己的包,于是做出了回應,回應資料從埠 1 進入交換機,于是交換機此時在地址表中更新了第二條資料:

MAC:bb-bb-bb-bb-bb-bb
埠:1

程序如下

經過該網路中的機器不斷地通信,交換機最終將 MAC 地址表建立完畢~

隨著機器數量越多,交換機的埠也不夠了,但聰明的你發現,只要將多個交換機連接起來,這個問題就輕而易舉搞定~

你完全不需要設計額外的東西,只需要按照之前的設計和規矩來,按照上述的接線方式即可完成所有電腦的互聯,所以交換機設計的這種規則,真的很巧妙,你想想看為什么(比如 A 要發資料給 F),

但是你要注意,上面那根紅色的線,最終在 MAC 地址表中可不是一條記錄呀,而是要把 EFGH 這四臺機器與該埠(埠6)的映射全部記錄在表中,

最終,兩個交換機將分別記錄 A ~ H 所有機器的映射記錄

左邊的交換機

MAC 地址
bb-bb-bb-bb-bb-bb1
cc-cc-cc-cc-cc-cc3
aa-aa-aa-aa-aa-aa4
dd-dd-dd-dd-dd-dd5
ee-ee-ee-ee-ee-ee6
ff-ff-ff-ff-ff-ff6
gg-gg-gg-gg-gg-gg6
hh-hh-hh-hh-hh-hh6

右邊的交換機

MAC 地址
bb-bb-bb-bb-bb-bb1
cc-cc-cc-cc-cc-cc1
aa-aa-aa-aa-aa-aa1
dd-dd-dd-dd-dd-dd1
ee-ee-ee-ee-ee-ee2
ff-ff-ff-ff-ff-ff3
gg-gg-gg-gg-gg-gg4
hh-hh-hh-hh-hh-hh6

這在只有 8 臺電腦的時候還好,甚至在只有幾百臺電腦的時候,都還好,所以這種交換機的設計方式,已經足足支撐一陣子了,

但很遺憾,人是貪婪的動物,很快,電腦的數量就發展到幾千、幾萬、幾十萬,

第三層交換機已經無法記錄如此龐大的映射關系了,

此時你動了歪腦筋,你發現了問題的根本在于,連出去的那根紅色的網線,后面不知道有多少個設備不斷地連接進來,從而使得地址表越來越大,

那我可不可以讓那根紅色的網線,接入一個新的設備,這個設備就跟電腦一樣有自己獨立的 MAC 地址,而且同時還能幫我把資料包做一次轉發呢?

這個設備就是路由器,它的功能就是,作為一臺獨立的擁有 MAC 地址的設備,并且可以幫我把資料包做一次轉發你把它定在了網路層,

注意,路由器的每一個埠,都有獨立的 MAC 地址

好了,現在交換機的 MAC 地址表中,只需要多出一條 MAC 地址 ABAB 與其埠的映射關系,就可以成功把資料包轉交給路由器了,這條搞定,

那如何做到,把發送給 C 和 D,甚至是把發送給 DEFGH.... 的資料包,統統先發送給路由器呢?

不難想到這樣一個點子,假如電腦 C 和 D 的 MAC 地址擁有共同的前綴,比如分別是

C 的 MAC 地址:FFFF-FFFF-CCCC
D 的 MAC 地址:FFFF-FFFF-DDDD

那我們就可以說,將目標 MAC 地址為 FFFF-FFFF-?開頭的,統統先發送給路由器,

這樣是否可行呢?答案是否定的,

我們先從現實中 MAC 地址的結構入手,MAC地址也叫物理地址、硬體地址,長度為 48 位,一般這樣來表示

00-16-EA-AE-3C-40

它是由網路設備制造商生產時燒錄在網卡的EPROM(一種閃存芯片,通常可以通程序式擦寫),其中前 24 位(00-16-EA)代表網路硬體制造商的編號,后 24 位(AE-3C-40)是該廠家自己分配的,一般表示系列號,只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的,形象地說,MAC地址就如同身份證上的身份證號碼,具有唯一性,

那如果你希望向上面那樣表示將目標 MAC 地址為 FFFF-FFFF-?開頭的,統一從路由器出去發給某一群設備(后面會提到這其實是子網的概念),那你就需要要求某一子網下統統買一個廠商制造的設備,要么你就需要要求廠商在生產網路設備燒錄 MAC 地址時,提前按照你規劃好的子網結構來定 MAC 地址,并且日后這個網路的結構都不能輕易改變,

也許干巴巴的文字看起來有寫枯燥,如果單看文字不是很容易消化的話,可以進群973961276來跟大家一起交流學習,群里也有許多視頻資料和技術大牛,配合文章一起理解應該會讓你有不錯的識訓,

推薦一個不錯的c/c++ 初學者課程,這個跟以往所見到的只會空談理論的有所不同,這個課程是從六個可以寫在簡歷上的企業級專案入手帶領大家學習c/c++,正在學習的朋友可以了解一下,

這顯然是不現實的,

于是你發明了一個新的地址,給每一臺機器一個 32 位的編號,如:

11000000101010000000000000000001

你覺得有些不清晰,于是把它分成四個部分,中間用點相連,

11000000.10101000.00000000.00000001

你還覺得不清晰,于是把它轉換成 10 進制,

192.168.0.1

最后你給了這個地址一個響亮的名字,IP 地址,現在每一臺電腦,同時有自己的 MAC 地址,又有自己的 IP 地址,只不過 IP 地址是軟體層面上的,可以隨時修改,MAC 地址一般是無法修改的,

這樣一個可以隨時修改的 IP 地址,就可以根據你規劃的網路拓撲結構,來調整了,

如上圖所示,假如我想要發送資料包給 ABCD 其中一臺設備,不論哪一臺,我都可以這樣描述,"將 IP 地址為 192.168.0 開頭的全部發送給到路由器,之后再怎么轉發,交給它!",巧妙吧,

那交給路由器之后,路由器又是怎么把資料包準確轉發給指定設備的呢?

別急我們慢慢來,

我們先給上面的組網方式中的每一臺設備,加上自己的 IP 地址

現在兩個設備之間傳輸,除了加上資料鏈路層的頭部之外,還要再增加一個網路層的頭部,

假如 A 給 B 發送資料,由于它們直接連著交換機,所以 A 直接發出如下資料包即可,其實網路層沒有體現出作用,

但假如 A 給 C 發送資料,A 就需要先轉交給路由器,然后再由路由器轉交給 C,由于最底層的傳輸仍然需要依賴以太網,所以資料包是分成兩段的,

A ~ 路由器這段的包如下:

路由器到 C 這段的包如下:

好了,上面說的兩種情況(A->B,A->C),相信細心的讀者應該會有不少疑問,下面我們一個個來展開,

A 給 C 發資料包,怎么知道是否要通過路由器轉發呢?

答案:子網

如果源 IP 與目的 IP 處于一個子網,直接將包通過交換機發出去,

如果源 IP 與目的 IP 不處于一個子網,就交給路由器去處理,

好,那現在只需要解決,什么叫處于一個子網就好了,

  • 192.168.0.1 和 192.168.0.2 處于同一個子網

  • 192.168.0.1 和 192.168.1.1 處于不同子網

這兩個是我們人為規定的,即我們想表示,對于 192.168.0.1 來說:

192.168.0.xxx 開頭的,就算是在一個子網,否則就是在不同的子網,

那對于計算機來說,怎么表達這個意思呢?于是人們發明了子網掩碼的概念

假如某臺機器的子網掩碼定為 255.255.255.0

這表示,將源 IP 與目的 IP 分別同這個子網掩碼進行與運算,相等則是在一個子網,不相等就是在不同子網,就這么簡單,

比如

  • A電腦:192.168.0.1 & 255.255.255.0 = 192.168.0.0

  • B電腦:192.168.0.2 & 255.255.255.0 = 192.168.0.0

  • C電腦:192.168.1.1 & 255.255.255.0 = 192.168.1.0

  • D電腦:192.168.1.2 & 255.255.255.0 = 192.168.1.0

那么 A 與 B 在同一個子網,C 與 D 在同一個子網,但是 A 與 C 就不在同一個子網,與 D 也不在同一個子網,以此類推,

所以如果 A 給 C 發訊息,A 和 C 的 IP 地址分別 & A 機器配置的子網掩碼,發現不相等,則 A 認為 C 和自己不在同一個子網,于是把包發給路由器,就不管了,之后怎么轉發,A 不關心

A 如何知道,哪個設備是路由器?

答案:在 A 上要設定默認網關

上一步 A 通過是否與 C 在同一個子網內,判斷出自己應該把包發給路由器,那路由器的 IP 是多少呢?

其實說發給路由器不準確,應該說 A 會把包發給默認網關

對 A 來說,A 只能直接把包發給同處于一個子網下的某個 IP 上,所以發給路由器還是發給某個電腦,對 A 來說也不關心,只要這個設備有個 IP 地址就行,

所以默認網關,就是 A 在自己電腦里配置的一個 IP 地址,以便在發給不同子網的機器時,發給這個 IP 地址,

僅此而已!

路由器如何知道C在哪里?

答案:路由表

現在 A 要給 C 發資料包,已經可以成功發到路由器這里了,最后一個問題就是,路由器怎么知道,收到的這個資料包,該從自己的哪個埠出去,才能直接(或間接)地最終到達目的地 C 呢,

路由器收到的資料包有目的 IP 也就是 C 的 IP 地址,需要轉化成從自己的哪個埠出去,很容易想到,應該有個表,就像 MAC 地址表一樣,

這個表就叫路由表

至于這個路由表是怎么出來的,有很多路由演算法,本文不展開,因為我也不會哈哈~

不同于 MAC 地址表的是,路由表并不是一對一這種明確關系,我們下面看一個路由表的結構,

目的地址子網掩碼下一跳
192.168.0.0255.255.255.0 0
192.168.0.254255.255.255.255 0
192.168.1.0255.255.255.0 1
192.168.1.254255.255.255.255 1

我們學習一種新的表示方法,由于子網掩碼其實就表示前多少位表示子網的網段,所以如 192.168.0.0(255.255.255.0) 也可以簡寫為 192.168.0.0/24

目的地址下一跳
192.168.0.0/24 0
192.168.0.254/32 0
192.168.1.0/24 1
192.168.1.254/32 1

這就很好理解了,路由表就表示,192.168.0.xxx 這個子網下的,都轉發到 0 號埠,192.168.1.xxx 這個子網下的,都轉發到 1 號埠,下一跳列還沒有值,我們先不管

配合著結構圖來看(這里把子網掩碼和默認網關都補齊了)

剛才說的都是 IP 層,但發送資料包的資料鏈路層需要知道 MAC 地址,可是我只知道 IP 地址該怎么辦呢?

答案:arp

假如你(A)此時不知道你同伴 B 的 MAC 地址(現實中就是不知道的,剛剛我們只是假設已知),你只知道它的 IP 地址,你該怎么把資料包準確傳給 B 呢?

答案很簡單,在網路層,我需要把 IP 地址對應的 MAC 地址找到,也就是通過某種方式,找到 192.168.0.2 對應的 MAC 地址 BBBB

這種方式就是 arp 協議,同時電腦 A 和 B 里面也會有一張 arp 快取表,表中記錄著 IP 與 MAC 地址的對應關系,

IP 地址MAC 地址
192.168.0.2BBBB

一開始的時候這個表是空的,電腦 A 為了知道電腦 B(192.168.0.2)的 MAC 地址,將會廣播一條 arp 請求,B 收到請求后,帶上自己的 MAC 地址給 A 一個回應,此時 A 便更新了自己的 arp 表,

這樣通過大家不斷廣播 arp 請求,最終所有電腦里面都將 arp 快取表更新完整,

總結一下

好了,總結一下,到目前為止就幾條規則

從各個節點的視角來看

電腦視角

  • 首先我要知道我的 IP 以及對方的 IP

  • 通過子網掩碼判斷我們是否在同一個子網

  • 在同一個子網就通過 arp 獲取對方 mac 地址直接扔出去

  • 不在同一個子網就通過 arp 獲取默認網關的 mac 地址直接扔出去

交換機視角:

  • 我收到的資料包必須有目標 MAC 地址

  • 通過 MAC 地址表查映射關系

  • 查到了就按照映射關系從我的指定埠發出去

  • 查不到就所有埠都發出去

路由器視角:

  • 我收到的資料包必須有目標 IP 地址

  • 通過路由表查映射關系

  • 查到了就按照映射關系從我的指定埠發出去(不在任何一個子網范圍,走其路由器的默認網關也是查到了)

  • 查不到則回傳一個路由不可達的資料包

如果你嗅覺足夠敏銳,你應該可以感受到下面這句話:

網路層(IP協議)本身沒有傳輸包的功能,包的實際傳輸是委托給資料鏈路層(以太網中的交換機)來實作的,

涉及到的三張表分別是

  • 交換機中有 MAC 地址表用于映射 MAC 地址和它的埠

  • 路由器中有路由表用于映射 IP 地址(段)和它的埠

  • 電腦和路由器中都有 arp 快取表用于快取 IP 和 MAC 地址的映射關系

這三張表是怎么來的

  • MAC 地址表是通過以太網內各節點之間不斷通過交換機通信,不斷完善起來的,

  • 路由表是各種路由演算法 + 人工配置逐步完善起來的,

  • arp 快取表是不斷通過 arp 協議的請求逐步完善起來的,

知道了以上這些,目前網路上兩個節點是如何發送資料包的這個程序,就完全可以解釋通了!

那接下來我們就放上本章 最后一個 網路拓撲圖吧,請做好 戰斗 準備!

這時路由器 1 連接了路由器 2,所以其路由表有了下一條地址這一個概念,所以它的路由表就變成了這個樣子,如果匹配到了有下一跳地址的一項,則需要再次匹配,找到其埠,并找到下一跳 IP 的 MAC 地址,

也就是說找來找去,最終必須能映射到一個埠號,然后從這個埠號把資料包發出去,

目的地址下一跳
192.168.0.0/24 0
192.168.0.254/32 0
192.168.1.0/24 1
192.168.1.254/32 1
192.168.2.0/24192.168.100.5
192.168.100.0/24 2
192.168.100.4/32 2

這時如果 A 給 F 發送一個資料包,能不能通呢?如果通的話整個程序是怎樣的呢?

思考一分鐘...

詳細程序影片描述:

詳細程序文字描述:

1. 首先 A(192.168.0.1)通過子網掩碼(255.255.255.0)計算出自己與 F(192.168.2.2)并不在同一個子網內,于是決定發送給默認網關(192.168.0.254)

2. A 通過 ARP 找到 默認網關 192.168.0.254 的 MAC 地址,

3. A 將源 MAC 地址(AAAA)與網關 MAC 地址(ABAB)封裝在資料鏈路層頭部,又將源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.2.2)(注意這里千萬不要以為填寫的是默認網關的 IP 地址,從始至終這個資料包的兩個 IP 地址都是不變的,只有 MAC 地址在不斷變化)封裝在網路層頭部,然后發包

4. 交換機 1 收到資料包后,發現目標 MAC 地址是 ABAB,轉發給路由器1

5. 資料包來到了路由器 1,發現其目標 IP 地址是 192.168.2.2,查看其路由表,發現了下一跳的地址是 192.168.100.5

6. 所以此時路由器 1 需要做兩件事,第一件是再次匹配路由表,發現匹配到了埠為 2,于是將其封裝到資料鏈路層,最后把包從 2 號口發出去,

7. 此時路由器 2 收到了資料包,看到其目的地址是 192.168.2.2,查詢其路由表,匹配到埠號為 1,準備從 1 號口把資料包送出去,

8. 但此時路由器 2 需要知道 192.168.2.2 的 MAC 地址了,于是查看其 arp 快取,找到其 MAC 地址為 FFFF,將其封裝在資料鏈路層頭部,并從 1 號埠把包發出去,

9. 交換機 3 收到了資料包,發現目的 MAC 地址為 FFFF,查詢其 MAC 地址表,發現應該從其 6 號埠出去,于是從 6 號埠把資料包發出去,

10. F 最終收到了資料包!并且發現目的 MAC 地址就是自己,于是收下了這個包

更詳細且精準的程序:

讀到這相信大家已經很累了,理解上述程序基本上網路層以下的部分主流程就基本疏通了,如果你想要本程序更為專業的程序描述,可以在公眾號 低并發編程 后臺回復 網路,獲得我模擬這個程序的 Cisco Packet Tracer 源檔案,

每一步包的傳輸都會有各層的原始資料,以及專業的程序描述

同時在此基礎之上你也可以設計自己的網路拓撲結構,進行各種實驗,來加深網路傳輸程序的理解,

后記

至此,經過物理層、資料鏈路層、網路層這前三層的協議,以及根據這些協議設計的各種網路設備(網線、集線器、交換機、路由器),理論上只要擁有對方的 IP 地址,就已經將地球上任意位置的兩個節點連通了,

本文經過了很多次的修改,刪減了不少影響主流程的內容,就是為了讓讀者能抓住網路傳輸前三層的真正核心思想,同時網路相關的知識也是多且雜,我也還有很多搞不清楚的地方,非常歡迎大家與我交流,共同進步,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/249796.html

標籤:其他

上一篇:Map映射模擬佇列(南昌理工學院ACM集訓隊)

下一篇:單向鏈表尾插法和頭插法分別實作佇列和堆疊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more