寫在前面
在互聯網+的時代,網絡顯得越發重要,如果現在你一頓不吃飯可能還沒事但是一個小時沒網絡,估計你都要瘋了。那么網絡到底是個啥呢?看不見又摸不著。拿著一臺電腦怎么和網絡建立連接呢?那么下面要講解的內容或許可以給你解決個大概。
閑聊網絡
如果讓你修一棟房子你會一層一層的往上修,并且規劃好一層用來開商鋪,二層用來開超市,上面一層用來干嘛等等,其實網絡也是一樣,把一個虛擬的環境進行分層而定,因此就有了我們現在熟知的四層和七層網絡模型,這里你可能又會問了,為什么還會有四層和七層之分呢,其實呢早期的網絡只有四層,也即是我們現在用得最多的網絡結構,但是后來為了讓人們能夠更加詳盡的認識到網絡,因此就把網絡劃分為更加詳細的七層模型,所以就有了四層與七層之分,不過在實際使用中仍然使用四層,七層模型大多用于學習。
TCP/IP網絡模型是由美國國防部在ARPANET網絡中創建的網絡體系結構,從上往下共有四層,因此也是我們常說的TCP/IP四層結構,其模型從下往上依次是網絡接口層、網際層、傳輸層、應用層。
- 網絡接口層主要提供了網卡等網絡硬件設備以及驅動程序,還定義了各種物理網絡的底層互聯協議,如Ethernet、令牌環網、幀中繼網絡、分組交換網絡等。;
- 網際層主要定義了各主機之間跨多個網絡的路由連接,完成尋址和路由等功能;
- 傳輸層主要是完成各主機的端到端的數據傳輸;
- 應用層則是為客戶提供各種豐富的應用。
為了能夠更好的了解網絡,那么ISO的七層參考網絡模型就是必須的,因為該模型更加詳盡細致的劃分了網絡,并定義了每層所要完成的功能特性,從下往上依次是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。
- 物理層主要是規定了物理設備的機械電氣特性,為上層提供一個可用的物理環境;
- 數據鏈路層將物理層提供的可能出錯的物理連接改造成邏輯上無差錯的數據鏈路,并對物理層的原始數據進行幀封裝。也就是負責在兩個相鄰的節點間無差錯地傳送以幀為單位的數據流;
- 網絡層主要負責網絡尋址,在兩個主機之間建立連接;
- 傳輸層負責將上層數據分段并提供端到端的、可靠的或不可靠的傳輸。此外,傳輸層還處理端到端的差錯控制和流量控制問題;
- 會話層管理主機之間的會話進程,即負責建立、管理、終止進程之間的會話;
- 表示層定義數據傳輸以何種格式進行表示,還能夠為應用程序提供特定的數據處理功能。包含協議轉換、數據加密、數據解密、數據壓縮;
- 應用層定義了應用程序可用于請求網絡服務的接口,而不是直接指應用程序本身。
上述內容就是我們常說的網絡的兩種分層體系結構,數據通過傳輸時從上往下一層一層的封裝到達對端主機后,從下往上一層一層的解封裝,最終得到傳輸的數據。
了解了網絡的分層結構后,為了更好的管理網絡以及主機,我們通常會對主機進行一些基本的操作,如配置IP地址、網關地址等,這樣我們的主機才能連接上互聯網。IP命令是比ifconfig命令更加強大的一個網絡管理類命令,能夠顯示和管理主機、路由以及路由策略等。其用法為:
ip [ OPTIONS ] OBJECT { COMMAND | help }
此處的OBJECT常用的有link、address、route、netns。
ip link 子命令主要用于配置網絡設備:
- ip link set?name INTERFACE_NAME 重命名接口;
- ip link set?dev ?INTERFACE_NAME up|down 啟用或提供某網卡;
- ip link set ?mtu NUMBER ?設置MTU的大小,默認為1500;
- ip link show ? 顯示設備屬性;
ip netns主要用于管理網絡的名稱空間:
- ip netns list:列出所有的netns;
- ip netns add NAME:創建指定的netns;
- ip netns del NAME:刪除指定的netns;
- ip netns exec NAME COMMAND:在指定的netns中運行命令;
ip address用于管理主機地址:
- ip addr add IFADDR dev IFACE:添加指定接口的IP地址;
- ip addr delete IFADDR dev IFACE:刪除指定接口的IP地址;
- ip addr list [IFACE]:顯示接口的地址;
- ip addr flush dev IFACE:清空指定接口的地址;
ip route用于管理主機的路由表:
- ip route add TYPE PREFIX via GW [dev IFACE]:添加路由表,此處 TYPE PREFIX的可以是主機路由、網絡路由或者默認路由;
- ip route del TYPE PRIFIX:刪除指定類型的路由表;
- ip route show?TYPE PRIFIX:顯示指定類型的路由表;
我想通過上面的講解,如果此時你拿著一個即便是Linux系統的電腦肯定也能接到網絡中了,為了更好的管理服務,此處還要提供一個類似于netstat的命令,它就是ss命令,ss是Socket?Statistics的縮寫。顧名思義,ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容,但ss的優勢在于它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。ss命令的用法也非常簡單:
ss [options] [FILTER]
此處的選項:
- -t:tcp協議相關的連接;
- -u:udp協議相關的連接;
- -w:raw socket相關的連接;
- -l:監聽狀態的連接;
- -a:所有狀態的連接;
- -n:數字格式;
- -p:相關的程序及其PID;
- -e:擴展格式信息;
- -m:內存用量;
- -o:計時器信息
常見的FILTER則有 [ state TCP-STATE ] [ EXPRESSION ]:
- TCP-STATE有:LISTENING、ESTABLISEHD、FIN_WAIT_1、FIN_WAIT_2、SYN_SENT、SYN_RECV、CLOSED等有限狀態機;
- EXPRESSION則有dport和sport;
這么講述可能有點暈乎乎的,那么就來兩個例子您可能看的更清楚:
示例1:ss -tan ‘( dport = :22 or sport = :22 )’ ?表示只顯示源端口和目標端口是22的網絡進程信息,注意此處的格式為固定格式,括號內各字段之間都有空格。
示例2:ss -tan state ESTABLISHED ?表示只顯示狀態為ESTABLISHED的進程信息。
這里提到了進程的概念,您可能又要犯迷糊了,其實進程就是運行中程序的一個副本,進程有守護進程和前臺進程之分,守護進程是在系統引導過程中啟動的進程,而前臺進程是通過終端啟動的進程。在以后的使用中經常需要查看進程的運行情況,因此最簡單的進程的查看就必不可少了。進程的管理也有非常多的工具,這里列出幾個常用的管理工具htop、vmstat命令。
htop命令和top命令非常類似,但是htop命令較后者功能更加強大,基本功能用于顯示進程信息,其用法為:
htop [-dus]
- -d #:指定延遲時間間隔;
- -u UserName:僅顯示指定用戶的進程;
- -s COLUME:以指定字段進行排序顯示;
在鍵入htop命令后,在顯示頁面通過鍵入頁面下面的字符還可以靈活的操作:
- F1:查看htop使用幫助說明,其中有對一些子命令的說明;
- F2:對htop進行設定,可以更改CPU,MEM,SWP顯示格式等信息;
- F3:搜索進程;
- F4:進程過濾器;
- F5:以樹狀結構顯示進程;
- F6:選擇排序方式;
- F7:減少nice值,提高對應進程的優先級;
- F8:增加nice值,降低對應進程的優先級;
- F9:對進程傳遞信號;
- F10:結束htop;
當然此處只是粗略的提了一下,更強大的功能還需要您結合上述內容實現。說完了htop命令,下面就來聊一聊vmstat命令,vmstat可以展現給定時間間隔的服務器的各個狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況以及IO讀寫情況等信息。其使用方法為:
vmstat ?[delay [count]]
可以指明采樣的時間間隔delay值和采樣的次數count值,但是如果此處的采樣次數沒給,vmstat會根據采樣間隔一直采樣顯示,如果兩個都沒給定,那么只顯示一次采樣值。采樣的顯示內容分為procs,memory,swap,io,system,cpu段信息,每段信息都有固定的意義,其中:
- procs段中的r:等待運行的進程的個數;CPU上等待運行的任務的隊列長度;
- procs段中的b:處于不可中斷睡眠態的進程個數;被阻塞的任務隊列的長度;
- memory段中的swpd:交換內存使用總量;
- memory段中的free:空閑的物理內存總量;
- memory段中的buffer:用于buffer的內存總量;
- memory段中的cache:用于cache的內存總量;
- swap段中的si:數據進入swap中的數據速率(kb/s);
- swap段中的so:數據離開swap的速率(kb/s);
- io段中的bi:從塊設備讀入數據到系統的速度(kb/s);
- io段中的bo:保存數據至塊設備的速率(kb/s);
- system段中的in:interrupts,中斷速率;
- system段中的cs:context switch, 上下文 切換的速率;
- cpu段中的us:用戶CPU時間;
- cpu段中的ussy:系統CPU時間;
- cpu段中的id:空閑 CPU時間;
- cpu段中的wa:等待IO的CPU時間;
- cpu段中的st:被偷走的CPU時間;
shell腳本時間
我們都知道Linux系統中shell腳本是非常非常重要的,使用腳本可以很方便的完成繁瑣的功能,并且系統上的很多服務也都是使用腳本完成控制的,因此學習腳本是必不可少的環節。剛剛接觸腳本,也不要實現太復雜的功能,試想一個場景,統計一下你在的網段中有多少人在線,即有哪些IP地址被分配出去了。很多人都非常聰明,連上路由器看一下就可以知道了啊,但是現在如果你不知道路由器密碼咋整呢?使用腳本在這里就變得非常簡單了,我們只需要使用前面學過的ping命令就可以很容易的判斷當前哪些IP已經被使用了,話不多少,直接上結果。
運行結果如下:
或者使用util也能實現上述功能,
運行結果如下:
其實本題還有很多種方法實現,上面的while和until實現剛好是條件相反的時候執行,while是條件為真時執行,而until則是條件為假,即條件不滿足的時候執行。更多更好的方法希望讀者朋友能夠實現。
寫在最后
學習是一個漫長的過程,很多時候都是三分鐘的激情,因此學習要克服懶惰,貴在堅持,特別是這種實操類型的學習不能完了就完了,如果是這樣那真是只有完了。要一遍一遍不斷的練習,不斷的實踐,同一個問題從多維度多方向解答,就像上面的問題,其實還有很多種實現方法,即便是使用while實現,內容也可以有很多種寫法,只有每次這樣不辭艱辛的練習,打鬧基礎知識,才能在后期快速的成長。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/90977