高并发负载均衡——网络协议原理
一、網絡分層模型
軟件工程項目學中有一個重要的思想就是分層解耦。OSI七層模型,TCP/IP四層(有時將數據鏈路層和物理層分開稱為五層模型),都是為了更好的實現網絡的互通。
應用層:網絡服務于最終用戶的一個接口,Tomcat、瀏覽器都屬于這一層。
表示層:數據的表示、安全(加解密)、壓縮等處理。
會話層:建立、管理、終止會話。
傳輸層:定義數據傳輸的協議端口號,以及流控和差錯校驗。
網絡層:進行邏輯地址尋址,實現不同網絡之間的路由。
數據鏈路層:建立邏輯連接、進行硬件地址尋址、差錯校驗等。
物理層:建立、維護、斷開物理連接。
二、網絡數據傳輸示例
通過Linux系統的Shell交互程序實現百度首頁的請求。
首先進入當前shell程序的文件描述符定義路徑,其中$$是當前命令解釋程序(即Shell)。
0 1 2分別代表輸入、輸出和報錯,這是所有交互程序都必須具備的接口。
使用exec命令,建立一個文件描述符8,代表一個socket連接:
此時,我們已經對www.baidu.com建立了一個TCP連接,緊接著,手寫一個最簡HTTP請求,輸出到Socket中,并通過輸入流從socket中取出響應,并輸出。
最后關閉socket:
通過echo打印的 HTTP協議頭字符串,就是在模擬應用層服務(如瀏覽器)的請求封裝工作。但實際上,并不是應用層服務直接將請求發出,而是通過更下層的服務層層包裝、尋址完成的。每一層都有對應的協議,上層服務只需要將請求內容按照協議組織好后就可以調用傳輸層服務,并通過網絡接口發送出去。
應用層屬于用戶態,傳輸層以下是內核態。Java應用程序在請求網絡時,就是像上面這樣,獲取一個socket對象,然后將封裝好的信息放入其中。JVM如果想要建立一個網絡連接,我們通過代碼new Socket,但實際上底層都是native接口,是JVM去請求了系統調用,待操作系統內核跑完底層,返回一個建立成功的連接,之后才能執行下一步代碼。在建立連接的時候,程序一定是會出現一定的阻塞。
三、傳輸層的TCP協議
TCP協議是傳輸層的重要協議,是面向連接的、可靠的通信標準。它通過三次握手、四次揮手機制實現安全可靠的連接。
3.1 三次握手
上圖是三次握手的模型。
① 客戶機首先發送第一次請求,主要參數有SYN、seq ;
② 服務器收到請求后,發送第二次請求給客戶機,這實際上是上一次客戶機請求的確認響應,但同時也是服務器對客戶機的請求,參數主要有SYN、ACK、seq。
③ 客戶機收到響應后,會再次確認這個響應,遞增相關參數并響應回去。
經過了一次原始請求和兩次確認的通信之后,我們就已經可以認為這是一次明確、可靠的連接。
三趟數據包走完之后,雙方才會在內存中開辟線程,開辟對象,開辟所有的描述符,建立相應的資源,而如果三次握手失敗,這些資源是不會開辟的。
3.2 四次揮手
四次揮手斷開連接,請求方發送斷開請求,接收響應,但此時并未斷開,需要由被動方主動發起允許斷開的通知,方可完成斷開操作。即先告知斷開請求,再由被動方斷開,最后雙方釋放資源,如端口號等。
整體通訊過程大致為:
三次握手-->數據傳輸-->四次分手
這個通訊過程是一個最小粒度,不可被分割。類似事務原子性。例如,在多負載系統中,多個實例不可以拆分同一個TCP連接,即端點與端點的所有數據請求、響應都不可以被任何負載技術所打散。
3.3 Linux下查看TCP 連接狀態
netstat命令:
-n:numeric 直接使用ip地址,不通過域名服務器
-a:all 顯示所有連線中的socket
-t:tcp
-p: 顯示PID及對應程序
我們通過終端軟件進行ssh登錄后,就可以看到netstat的網絡連接狀態:
響應表格中,LISTEN表示正在監聽,ESTABLISHED表示已經建立連接,所謂的Socket,就是Local Address和Foreign Address組成的一條唯一值。
其中有三條sshd程序,第一條sshd是父進程,處于LISTEN狀態,一旦監聽到連接請求,那么就會拋出一個線程用于建立Socket連接,后面兩個sshd分別是遠程終端的圖形交互窗口sftp連接和命令行窗口ssh連接,Foreign Address中的192.168.1.1實際上就是Windows上的虛擬網卡,而port是隨機的。
四、網絡層
4.1 Linux網卡配置及IP下一跳機制
我們查看eth0網卡的配置信息,一般主要關注四個維度:
ip地址、掩碼、網關、DNS服務地址。
查看路由表:
在很早的以前的網絡拓撲當中,有一種模型,是每臺主機都存儲一個全局的網絡拓撲,這種模型會隨著互聯網上的設備增多而失去可行性,于是就產生了現在的網絡尋址機制,即下一跳機制。
所謂“下一跳”,就是當前IP地址到達目標IP的路徑上臨近的下一個IP地址。在路由過程中,數據包到達每個主機都會進行路由判定,并依次轉發。這些轉發的路徑需要網絡工程師來進行規劃。下一跳機制可以極大的減少主機需要存儲的IP地址信息,只需要記住同一網絡的網關地址,就可以了。
4.2?通過ping理解下一跳機制
通過ping命令(基于ICMP協議)可以判斷主機的連通狀態,如下是ping百度首頁:
那么ping程序是如何將數據包發送到遙遠的百度服務器的呢?
首先,ping命令拿著目標地址(39.156.66.14)逐條與路由表中的掩碼進行按位與運算,并且與Destination進行比較,這就是路由判定。如果目標地址與Destination記錄的IP一致,就將數據包發給它。
上圖中,經過路由判定,Destination=0.0.0.0符合要求,于是,我們就得到了下一跳地址192.168.1.2。而實際上不論什么IP,只要和掩碼為0.0.0.0進行與運算,就都會得到0.0.0.0,因此在上面的路由表中192.168.1.2 就是默認網關。
互聯網中的所有設備都會存儲這樣的路由表,只要具備轉發能力,都會進行路由判定。一般的小型路由設備都會有一條默認的下一跳地址,而對于一些骨干網、城域網等大型網絡環境,網絡工程師可能會設置更多的下一跳條目,規劃通信路由。
網關可以有多個,但是默認網關只有一個。同一網絡通信是不需要路由設備的,只需要簡單的交換機即可實現數據轉發,只有不同網絡的通信才需要下一跳地址。
五、數據鏈路層
當網絡層的路由判定找到了下一跳地址,但數據包中的目標地址永遠是最終將要發送到的IP地址,又如何將數據包發送到下一跳呢?
在IP數據包之外,又“包裹”了一層協議包。數據鏈路層同樣存在一張表格,記錄了MAC地址:
DNS是解釋域名和IP地址的映射,arp協議會解釋IP地址到MAC地址的映射。但前者是全網的,而arp是同一局域網內的。
經過arp的地址判定,IP數據包外面會“包裹”一個下一跳的MAC地址,這時整個數據包內部存在三個地址:下一跳的MAC地址、目標IP地址,以及目標端口號。
總結
TCP是重要的網絡通信手段,三次握手建立的連接是一個可靠的Socket信道,這些信息可以通過 netstat -natp 命令查看。
IP數據包會記錄目標地址的IP,傳輸過程中并不會改變。通過路由判定找到下一跳的網絡IP地址,再通過數據鏈路層的 arp 協議找到下一跳IP的MAC地址,將其包裹在IP數據包外面,并通過物理層發送到下一跳。最終發送到IP數據包內的目標地址的目標端口上。
下一跳機制極大的減少了主機需要記錄的通信IP數據,但同時,需要網絡工程師對下一跳進行網絡規劃,開通相應策略,就像是搭建一個網絡上的路由橋梁,連接各個網絡之間的通信。
總結
以上是生活随笔為你收集整理的高并发负载均衡——网络协议原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux进阶之路————用户管理
- 下一篇: Maven配置_01