1. 程式人生 > >【面試必備】探究!一個數據包在網路中的心路歷程

【面試必備】探究!一個數據包在網路中的心路歷程

每日一句英語學習,每天進步一點點:

前言

想必不少小夥伴面試過程中,會遇到「當鍵入網址後,到網頁顯示,其間發生了什麼」的面試題。

還別說,這真是挺常問的這題,前幾天坐在我旁邊的主管電話面試應聘者的時候,也問了這個問題。

這次,小林我帶大家一起探究下,一個數據包在網路中的心路歷程。

每個階段都有資料包的「心路歷程」,我們一起看看它說了什麼?


正文

接下來以下圖較簡單的網路拓撲模型作為例子,探究探究其間發生了什麼?

簡單的網路模型

01 孤單小弟 —— HTTP

瀏覽器做的第一步工作是解析 URL

首先瀏覽器做的第一步工作就是要對 URL 進行解析,從而生髮送給 Web

伺服器的請求資訊。

讓我們看看一條長長的 URL 裡的各個元素的代表什麼,見下圖:

URL 解析

所以圖中的長長的 URL 實際上是請求伺服器裡的檔案資源。

要是上圖中的藍色部分 URL 元素都省略了,哪應該是請求哪個檔案呢?

當沒有路徑名時,就代表訪問根目錄下事先設定的預設檔案,也就是 /index.html 或者 /default.html 這些檔案,這樣就不會發生混亂了。

生產 HTTP 請求資訊

URL 進行解析之後,瀏覽器確定了 Web 伺服器和檔名,接下來就是根據這些資訊來生成 HTTP 請求訊息了。

HTTP 的訊息格式

一個孤單 HTTP 資料包表示:“我這麼一個小小的資料包,沒親沒友,直接發到浩瀚的網路,誰會知道我呢?誰能載我一層呢?誰能保護我呢?我的目的地在哪呢?”。充滿各種疑問的它,沒有停滯不前,依然踏上了征途!


02 真實地址查詢 —— DNS

通過瀏覽器解析 URL 並生成 HTTP 訊息後,需要委託作業系統將訊息傳送給 Web 伺服器。

但在傳送之前,還有一項工作需要完成,那就是查詢伺服器域名對於的 IP 地址,因為委託作業系統傳送訊息時,必須提供通訊物件的 IP 地址。

比如我們打電話的時候,必須要知道對方的電話號碼,但由於電話號碼難以記憶,所以通常我們會將對方電話號 + 姓名儲存在通訊錄裡。

所以,有一種伺服器就專門儲存了 Web 伺服器域名與 IP 的對應關係,它就是 DNS 伺服器。

域名的層級關係

DNS 中的域名都是用句點來分隔的,比如 www.server.com

,這裡的句點代表了不同層次之間的界限。

在域名中,越靠右的位置表示其層級越高。

畢竟域名是外國人發明,所以思維和中國人相反,比如說一個城市地點的時候,外國喜歡從小到大的方式順序說起(如 XX 街道 XX 區 XX 市 XX 省),而中國則喜歡從大到小的順序(如 XX 省 XX 市 XX 區 XX 街道)。

根域是在最頂層,它的下一層就是 com 頂級域,再下面是 server.com。

所以域名的層級關係類似一個樹狀結構:

  • 根 DNS 伺服器
  • 頂級域 DNS 伺服器(com)
  • 權威 DNS 伺服器(server.com)
DNS 樹狀結構

根域的 DNS 伺服器資訊儲存在網際網路中所有的 DNS 伺服器中。

這樣一來,任何 DNS 伺服器就都可以找到並訪問根域 DNS 伺服器了。

因此,客戶端只要能夠找到任意一臺 DNS 伺服器,就可以通過它找到根域 DNS 伺服器,然後再一路順藤摸瓜找到位於下層的某臺目標 DNS 伺服器。

域名解析的工作流程

  1. 客戶端首先會發出一個 DNS 請求,問 www.server.com 的 IP 是啥,併發給本地 DNS 伺服器(也就是客戶端的 TCP/IP 設定中填寫的 DNS 伺服器地址)。
  2. 本地域名伺服器收到客戶端的請求後,如果快取裡的表格能找到 www.server.com,則它直接返回 IP 地址。如果沒有,本地 DNS 會去問它的根域名伺服器:“老大, 能告訴我 www.server.com 的 IP 地址嗎?” 根域名伺服器是最高層次的,它不直接用於域名解析,但能指明一條道路。
  3. 根 DNS 收到來自本地 DNS 的請求後,發現後置是 .com,說:“www.server.com 這個域名歸 .com 區域管理”,我給你 .com 頂級域名伺服器地址給你,你去問問它吧。”
  4. 本地 DNS 收到頂級域名伺服器的地址後,發起請求問“老二, 你能告訴我 www.server.com 的 IP 地址嗎?”
  5. 頂級域名伺服器說:“我給你負責 www.server.com 區域的權威 DNS 伺服器的地址,你去問它應該能問到”。
  6. 本地 DNS 於是轉向問權威 DNS 伺服器:“老三,www.server.com對應的IP是啥呀?” server.com 的權威 DNS 伺服器,它是域名解析結果的原出處。為啥叫權威呢?就是我的域名我做主。
  7. 權威 DNS 伺服器查詢後將對應的 IP 地址 X.X.X.X 告訴本地 DNS。
  8. 本地 DNS 再將 IP 地址返回客戶端,客戶端和目標建立連線。

至此,我們完成了 DNS 的解析過程。現在總結一下,整個過程我畫成了一個圖。

域名解析的工作流程

DNS 域名解析的過程蠻有意思的,整個過程就和我們日常生活中找人問路的過程類似,只指路不帶路。

資料包表示:“DNS 老大哥厲害呀,找到了目的地了!我還是很迷茫呀,我要發出去,接下來我需要誰的幫助呢?”


03 指南好幫手 —— 協議棧

通過 DNS 獲取到 IP 後,就可以把 HTTP 的傳輸工作交給作業系統中的協議棧。

協議棧的內部分為幾個部分,分別承擔不同的工作。上下關係是有一定的規則的,上面的部分會向下面的部分委託工作,下面的部分收到委託的工作並執行。

應用程式(瀏覽器)通過呼叫 Socket 庫,來委託協議棧工作。協議棧的上半部分有兩塊,分別是負責收發資料的 TCP 和 UDP 協議,它們兩會接受應用層的委託執行收發資料的操作。

協議棧的下面一半是用 IP 協議控制網路包收發操作,在網際網路上傳資料時,資料劊被切分成一塊塊的網路包,而將網路包傳送給對方的操作就是由 IP 負責的。

此外 IP 中還包括 ICMP 協議和 ARP 協議。

  • ICMP 用於告知網路包傳送過程中產生的錯誤以及各種控制資訊。
  • ARP 用於根據 IP 地址查詢相應的乙太網 MAC 地址。

IP 下面的網絡卡驅動程式負責控制網絡卡硬體,而最下面的網絡卡則負責完成實際的收發操作,也就是對網線中的訊號執行傳送和接收操作。

資料包看了這份指南表示:“原來我需要那麼多大佬的協助啊,那我先去找找 TCP 大佬!”


04 可靠傳輸 —— TCP

HTTP 是基於 TCP 協議傳輸的,所以在這我們先了解下 TCP 協議。

TCP 包頭格式

我們先看看 TCP 報文頭部的格式:

TCP 包頭格式

首先,源埠號和目標埠號是不可少的,如果沒有這兩個埠號,資料就不知道應該發給哪個應用。

接下來有包的序號,這個是為了解決包亂序的問題。

還有應該有的是確認號,目的是確認發出去對方是否有收到。如果沒有收到就應該重新發送,直到送達,這個是為了解決不丟包的問題。

接下來還有一些狀態位。例如 SYN 是發起一個連線,ACK 是回覆,RST 是重新連線,FIN 是結束連線等。TCP 是面向連線的,因而雙方要維護連線的狀態,這些帶狀態位的包的傳送,會引起雙方的狀態變更。

還有一個重要的就是視窗大小。TCP 要做流量控制,通訊雙方各宣告一個視窗(快取大小),標識自己當前能夠的處理能力,別傳送的太快,撐死我,也別發的太慢,餓死我。

除了做流量控制以外,TCP還會做擁塞控制,對於真正的通路堵車不堵車,它無能為力,唯一能做的就是控制自己,也即控制傳送的速度。不能改變世界,就改變自己嘛。

TCP 傳輸資料之前,要先三次握手建立連線

在 HTTP 傳輸資料之前,首先需要 TCP 建立連線,TCP 連線的建立,通常稱為三次握手。

這個所謂的「連線」,只是雙方計算機裡維護一個狀態機,在連線建立的過程中,雙方的狀態變化時序圖就像這樣。

TCP 三次握手
  • 一開始,客戶端和服務端都處於 CLOSED 狀態。先是服務端主動監聽某個埠,處於 LISTEN 狀態。

  • 然後客戶端主動發起連線 SYN,之後處於 SYN-SENT 狀態。

  • 服務端收到發起的連線,返回 SYN,並且 ACK 客戶端的 SYN,之後處於 SYN-RCVD 狀態。

  • 客戶端收到服務端傳送的 SYNACK 之後,傳送 ACKACK,之後處於 ESTABLISHED 狀態,因為它一發一收成功了。

  • 服務端收到 ACKACK 之後,處於 ESTABLISHED 狀態,因為它也一發一收了。

所以三次握手目的是保證雙方都有傳送和接收的能力。

如何檢視 TCP 的連線狀態?

TCP 的連線狀態檢視,在 Linux 可以通過 netstat -napt 命令檢視。

TCP 連線狀態檢視

TCP 分割資料

如果 HTTP 請求訊息比較長,超過了 MSS 的長度,這時 TCP 就需要把 HTTP 的資料拆解一塊塊的資料傳送,而不是一次性發送所有資料。

MTU 與 MSS
  • MTU:一個網路包的最大長度,乙太網中一般為 1500 位元組。
  • MSS:除去 IP 和 TCP 頭部之後,一個網路包所能容納的 TCP 資料的最大長度。

資料會被以 MSS 的長度為單位進行拆分,拆分出來的每一塊資料都會被放進單獨的網路包中。也就是在每個被拆分的資料加上 TCP 頭資訊,然後交給 IP 模組來發送資料。

資料包分割

TCP 報文生成

TCP 協議裡面會有兩個埠,一個是瀏覽器監聽的埠(通常是隨機生成的),一個是 Web 伺服器監聽的埠(HTTP 預設埠號是 80, HTTPS 預設埠號是 443)。

在雙方建立了連線後,TCP 報文中的資料部分就是存放 HTTP 頭部 + 資料,組裝好 TCP 報文之後,就需交給下面的網路層處理。

至此,網路包的報文如下圖。

TCP 層報文

此時,遇上了 TCP 的 資料包激動表示:“太好了,碰到了可靠傳輸的 TCP 傳輸,它給我加上 TCP 頭部,我不在孤單了,安全感十足啊!有大佬可以保護我的可靠送達!但我應該往哪走呢?”


05 遠端定位 —— IP

TCP 模組在執行連線、收發、斷開等各階段操作時,都需要委託 IP 模組將資料封裝成網路包傳送給通訊物件。

IP 包頭格式

我們先看看 IP 報文頭部的格式:

IP 包頭格式

在 IP 協議裡面需要有**源地址 IP **和 目標地址 IP:

  • 源地址IP,即是客戶端輸出的 IP 地址;
  • 目標地址,即通過 DNS 域名解析得到的 Web 伺服器 IP。

因為 HTTP 是經過 TCP 傳輸的,所以在 IP 包頭的協議號,要填寫為 06(十六進位制),表示協議為 TCP。

假設客戶端有多個網絡卡,就會有多個 IP 地址,那 IP 頭部的源地址應該選擇哪個 IP 呢?

當存在多個網絡卡時,在填寫源地址 IP 時,就需要判斷到底應該填寫哪個地址。這個判斷相當於在多塊網絡卡中判斷應該使用哪個一塊網絡卡來發送包。

這個時候就需要根據路由表規則,來判斷哪一個網絡卡作為源地址 IP。

在 Linux 作業系統,我們可以使用 route -n 命令檢視當前系統的路由表。

路由表

舉個例子,根據上面的路由表,我們假設 Web 伺服器的目標地址是 192.168.10.200

路由規則判斷
  1. 首先先和第一條條目的子網掩碼(Genmask)進行 與運算,得到結果為 192.168.10.0,但是第一個條目的 Destination192.168.3.0,兩者不一致所以匹配失敗。
  2. 再與第二條目的子網掩碼進行 與運算,得到的結果為 192.168.10.0,與第二條目的 Destination 192.168.10.0 匹配成功,所以將使用 eth1 網絡卡的 IP 地址作為 IP 包頭的源地址。

那麼假設 Web 伺服器的目標地址是 10.100.20.100,那麼依然依照上面的路由表規則判斷,判斷後的結果是和第三條目匹配。

第三條目比較特殊,它目標地址和子網掩碼都是 0.0.0.0,這表示預設閘道器,如果其他所有條目都無法匹配,就會自動匹配這一行。並且後續就把包發給路由器,Gateway 即是路由器的 IP 地址。

IP 報文生成

至此,網路包的報文如下圖。

IP 層報文

此時,加上了 IP 頭部的資料包表示 :“有 IP 大佬給我指路了,感謝 IP 層給我加上了 IP 包頭,讓我有了遠端定位的能力!不會害怕在浩瀚的網際網路迷茫了!可是目的地好遠啊,我下一站應該去哪呢?”


06 兩點傳輸 —— MAC

生成了 IP 頭部之後,接下來網路包還需要在 IP 頭部的前面加上 MAC 頭部。

MAC 包頭格式

MAC 頭部是乙太網使用的頭部,它包含了接收方和傳送方的 MAC 地址等資訊。

MAC 包頭格式

在 MAC 包頭裡需要傳送方 MAC 地址和接收方目標 MAC 地址,用於兩點之間的傳輸。

一般在 TCP/IP 通訊裡,MAC 包頭的協議型別只使用:

  • 0800 : IP 協議
  • 0806 : ARP 協議

MAC 傳送方和接收方如何確認?

傳送方的 MAC 地址獲取就比較簡單了,MAC 地址是在網絡卡生產時寫入到 ROM 裡的,只要將這個值讀取出來寫入到 MAC 頭部就可以了。

接收方的 MAC 地址就有點複雜了,只要告訴乙太網對方的 MAC 的地址,乙太網就會幫我們把包傳送過去,那麼很顯然這裡應該填寫對方的 MAC 地址。

所以先得搞清楚應該把包發給誰,這個只要查一下路由表就知道了。在路由表中找到相匹配的條目,然後把包發給 Gateway 列中的 IP 地址就可以了。

既然知道要發給誰,按如何獲取對方的 MAC 地址呢?

不知道對方 MAC 地址?不知道就喊唄。

此時就需要 ARP 協議幫我們找到路由器的 MAC 地址。

ARP 廣播

ARP 協議會在乙太網中以廣播的形式,對乙太網所有的裝置喊出:“這個 IP 地址是誰的?請把你的 MAC 地址告訴我”。

然後就會有人回答:“這個 IP 地址是我的,我的 MAC 地址是 XXXX”。

如果對方和自己處於同一個子網中,那麼通過上面的操作就可以得到對方的 MAC 地址。然後,我們將這個 MAC 地址寫入 MAC 頭部,MAC 頭部就完成了。

好像每次都要廣播獲取,這不是很麻煩嗎?

放心,在後續作業系統會把本次查詢結果放到一塊叫做 ARP 快取的記憶體空間留著以後用,不過快取的時間就幾分鐘。

也就是說,在發包時:

  • 先查詢 ARP 快取,如果其中已經儲存了對方的 MAC 地址,就不需要傳送 ARP 查詢,直接使用 ARP 快取中的地址。
  • 而當 ARP 快取中不存在對方 MAC 地址時,則傳送 ARP 廣播查詢。

檢視 ARP 快取內容

在 Linux 系統中,我們可以使用 arp -a 命令來檢視 ARP 快取的內容。

ARP 快取內容

MAC 報文生成

至此,網路包的報文如下圖。

MAC 層報文

此時,加上了 MAC 頭部的資料包萬分感謝,說道 :“感謝 MAC 大佬,我知道我下一步要去了哪了!我現在有很多頭部兄弟,相信我可以到達最終的目的地!”。
帶著眾多頭部兄弟的資料包,終於準備要出門了。


07 出口 —— 網絡卡

IP 生成的網路包只是存放在記憶體中的一串二進位制數字資訊,沒有辦法直接傳送給對方。因此,我們需要將數字資訊轉換為電訊號,才能在網線上傳輸,也就是說,這才是真正的資料傳送過程。

負責執行這一操作的是網絡卡,要控制網絡卡還需要靠網絡卡驅動程式。

網絡卡驅動從 IP 模組獲取到包之後,會將其複製到網絡卡內的快取區中,接著會其開頭加上報頭和起始幀分界符,在末尾加上用於檢測錯誤的幀校驗序列。

物理層資料包
  • 起始幀分界符是一個用來表示包起始位置的標記
  • 末尾的 FCS(幀校驗序列)用來檢查包傳輸過程是否有損壞

最後網絡卡會將包轉為電訊號,通過網線傳送出去。

唉,真是不容易,發一個包,真是歷經歷經千辛萬苦。致此,一個帶有許多頭部的資料終於踏上尋找目的地的征途了!


08 送別者 —— 交換機

下面來看一下包是如何通過交換機的。交換機的設計是將網路包原樣轉發到目的地。交換機工作在 MAC 層,也稱為二層網路裝置。

交換機的包接收操作

首先,電訊號到達網線介面,交換機裡的模組進行接收,接下來交換機裡的模組將電訊號轉換為數字訊號。

然後通過包末尾的 FCS 校驗錯誤,如果沒問題則放到緩衝區。這部分操作基本和計算機的網絡卡相同,但交換機的工作方式和網絡卡不同。

計算機的網絡卡本身具有 MAC 地址,並通過核對收到的包的接收方 MAC 地址判斷是不是發給自己的,如果不是發給自己的則丟棄;相對地,交換機的埠不核對接收方 MAC 地址,而是直接接收所有的包並存放到緩衝區中。因此,和網絡卡不同,交換機的埠不具有 MAC 地址。

將包存入緩衝區後,接下來需要查詢一下這個包的接收方 MAC 地址是否已經在 MAC 地址表中有記錄了。

交換機的 MAC 地址表主要包含兩個資訊:

  • 一個是裝置的 MAC 地址,
  • 另一個是該裝置連線在交換機的哪個埠上。
交換機的 MAC 地址表

舉個例子,如果收到的包的接收方 MAC 地址為 00-02-B3-1C-9C-F9,則與圖中表中的第 3 行匹配,根據埠列的資訊,可知這個地址位於 3 號埠上,然後就可以通過交換電路將包傳送到相應的埠了。

所以,交換機根據 MAC 地址表查詢 MAC 地址,然後將訊號傳送到相應的埠。

當 MAC 地址表找不到指定的 MAC 地址會怎麼樣?

地址表中找不到指定的 MAC 地址。這可能是因為具有該地址的裝置還沒有向交換機發送過包,或者這個裝置一段時間沒有工作導致地址被從地址表中刪除了。

這種情況下,交換機無法判斷應該把包轉發到哪個埠,只能將包轉發到除了源埠之外的所有埠上,無論該裝置連線在哪個埠上都能收到這個包。

這樣做不會產生什麼問題,因為乙太網的設計本來就是將包傳送到整個網路的,然後只有相應的接收者才接收包,而其他裝置則會忽略這個包。

有人會說:“這樣做會發送多餘的包,會不會造成網路擁塞呢?”

其實完全不用過於擔心,因為傳送了包之後目標裝置會作出響應,只要返回了響應包,交換機就可以將它的地址寫入 MAC 地址表,下次也就不需要把包發到所有埠了。

區域網中每秒可以傳輸上千個包,多出一兩個包並無大礙。

此外,如果接收方 MAC 地址是一個廣播地址,那麼交換機會將包傳送到除源埠之外的所有埠。

以下兩個屬於廣播地址:

  • MAC 地址中的 FF:FF:FF:FF:FF:FF
  • IP 地址中的 255.255.255.255

資料包通過交換機轉發抵達了路由器,準備要離開土生土長的子網了。此時,資料包和交換機離別時說道:“感謝交換機兄弟,幫我轉發到出境的大門,我要出遠門啦!”


09 出境大門 —— 路由器

路由器與交換機的區別

相關推薦

面試必備探究個數網路心路歷程

每日一句英語學習,每天進步一點點: 前言 想必不少小夥伴面試過程中,會遇到「當鍵入網址後,到網頁顯示,其間發生了什麼」的面試題。 還別說,這真是挺常問的這題,前幾天坐在我旁邊的主管電話面試應聘者的時候,也問了這個問題。 這次,小林我帶大家一起探究下,一個數據包在網路中的心路歷程。 每個階段都有資料包的「

面試必備透過源碼角度步帶你分析 ArrayList 擴容機制

bject string else if _array 核心 ray 擴容 ++ cit 一 先從 ArrayList 的構造函數說起ArrayList有三種方式來初始化,構造方法源碼如下:/** 默認初始容量大小*/private static final int D

面試必備透過原始碼角度步帶你分析 ArrayList 擴容機制

該文已加入開源文件:JavaGuide(一份涵蓋大部分Java程式設計師所需要掌握的核心知識)。地址:https://github.com/Snailclimb... 一 先從 ArrayList 的建構函式說起 ArrayList有三種方式來初始化,構造方法原始

面試必備透過原始碼角度步帶你走近阿里

一 先從 ArrayList 的建構函式說起 ArrayList有三種方式來初始化,構造方法原始碼如下: /** * 預設初始容量大小 */ private static final int DEFAULT_CAPACITY = 10; private stat

面試必備硬核30 張圖解 HTTP 常見的面試題

每日一句英語學習,每天進步一點點: 前言 在面試過程中,HTTP 被提問的概率還是比較高的。小林我搜集了 5 大類 HTTP 面試常問的題目,同時這 5 大類題跟 HTTP 的發展和演變關聯性是比較大的,通過問答 + 圖解的形式由淺入深的方式幫助大家進一步的學習和理解 HTTP 。 HTTP 基本概念

面試必備用了那麼多次 ping,是時候知道 ping 是如何工作的了

每日一句英語學習,每天進步一點點: 前言 在日常生活或工作中,我們在判斷與對方網路是否暢通,使用的最多的莫過於 ping 命令了。 “那你知道 ping 是如何工作的嗎?” —— 來自小林的靈魂拷問 可能有的小夥伴奇怪的問:“我雖然不明白它的工

面試 IO第十篇 java IO

長度 HR 數據 比特 inpu 最小 str itl 部分 1.什麽是比特(Bit),什麽是字節(Byte),什麽是字符(Char),它們長度是多少,各有什麽區別   1》Bit最小的二進制單位 ,是計算機的操作部分 取值0或者1  2》Byte是計算機操作數據的最小單位

面試必備常見Java面試題大綜合

一、Java基礎1、Arrays.sort實現原理和Collections.sort實現原理答:Collections.sort方法底層會呼叫Arrays.sort方法,底層實現都是TimeSort實現的。TimSort演算法就是找到已經排好序資料的子序列,然後對剩餘部分排序,然後合併起來.2、foreach

面試必備手撕程式碼,你怕不怕?

Part 1.生產者-消費者問題這絕對是屬於重點了,不管是考察對於該重要模型的理解還是考察程式碼能力,這都是一道很好的考題,所以很有必要的,我們先來回顧一下什麼是生產者-消費者問題; 問題簡單回顧 如果想學習Java工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分

面試必備手撕代碼,你怕不怕?

建議 快速排序算法 後續遍歷 任務 一點 編程 thread類 選擇 很多 Part 1.生產者-消費者問題這絕對是屬於重點了,不管是考察對於該重要模型的理解還是考察代碼能力,這都是一道很好的考題,所以很有必要的,我們先來回顧一下什麽是生產者-消費者問題; 問題簡單回顧 如

程式19 題目:個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6 = 1+2+3.程式設計 找出1000以內的所有完數。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> /* 題目:一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6 = 1+2+3.程式設計 找出1000以內的所有完數。 */ int main(void){ int num

面試必備如何在10億數找出前1000大的數?

作者:channingbreeze | 微信公眾號:網際網路偵察小史是一個應屆生,雖然學的是電子

MongoDB--副本集基本資訊面試必備

副本集的概念 副本集是一組伺服器,其中有一個是主伺服器(primary),用於處理客戶端請求;還有多個備份伺服器(secondary),用於儲存主伺服器的資料副本。如果主伺服器崩潰了,備份伺服器會自動將其中一個成員升級為新的主伺服器。 副本集特徵:  · N 個節點的叢集  ·

Python基礎總結之第十天開始認識一下python的另個數物件-----字典(新手可相互督促)

       看了大家的評論,還是有意外的收貨。感謝每個小夥伴的評論與補充。 眾人拾柴火焰高~         今天的筆記是記錄python中的資料物件----字典! 前面有講到list列表和tuple元組的筆記,他們都是一

面試必備小夥伴栽在了JVM的記憶體分配策略。。。

週末有小夥伴留言說上週面試時被問到記憶體分配策略的問題,但回答的不夠理想,小夥伴說之前公號裡看過這一塊的文章的,當時看時很清楚,也知道各個策略是幹嘛的,但面試時腦子裡清楚,心裡很明白,但嘴裡就是說不清楚,說出來的就是像雲像霧又像風,最後面試官說他應該是不清楚這一塊的內容 這裡給小夥伴要再次說明下,任何知識點,

如何利用UDP協議封裝個數

  在如何封裝一個數據包上,是一個非常細緻的問題,而利用UDP協議來封裝的話,是比較簡單,讓我們一步步來分析典型的TCP/IP協議。一般來說一個典型的一個數據包,包括乙太網MAC頭+網路層IP資料頭+傳輸層UDP頭+要傳輸的資料。讓我們一層層來看看這些資料頭是如何構成的。    1、乙太網MAC頭   

新年快樂羊年最後貼~ 祝大家猴年快樂 散分

don 飛康 store target abs 猴年快樂 ref http 快樂 唐載問菜溫蔡牙品安藝http://huiyi.docin.com/vok090 吻肛型爛副囟亢蔔鍛狗銑嚼稍刮http://shequ.docin.com/vok090 撤焉擻可婪喜略新靠扇

Excle如何創建個數透視表

tle 依次 live thumb div 數據 vid write 通過 數據透視表可以匯總、分析、瀏覽和提供工作表數據或外部數據源的匯總數據 創建方法一 通過”插入”創建,具體操作請看下圖: 創建方法二 通過快捷鍵創建 使用【ALT

php增刪改查實例第四節 -自己 DIY 個數庫管理工具

user clas 記錄 split函數 增刪 err sset post 個數 本節介紹如何自己DIY一個數據庫管理工具,可以在頁面輸入sql 進行簡單的增刪改查操作。 首先,找到xampp的安裝目錄,打開htdocs: 新建一個php文件,名稱為 mysqladmin

面試演算法——二叉樹(

一、二叉樹問題概述 二叉樹型別的題目為常考題型 原因: 能夠結合佇列、棧、連結串列、字串等多資料結構 需要掌握圖的基本遍歷方法,比如BFS和DFS 需要掌握遞迴函式的使用,並自己設計出遞迴過程 二叉樹問題與實際工作結合緊密   二、二叉樹先序