如何通過命令行工具去理解網絡協議

TCP/IP網絡分層模型

  • TCP/IP五層模型將網絡功能五層。
  • 每一層實現各自的功能。

    • 應用層:爲應用程序提供服務。
    • 傳輸輸層:解決進程間的通信。
    • 網絡層:解決跨網絡的主機通信問題。
    • 數據鏈路層:解決相鄰網絡節點通信問題。
    • 物理層:透明地傳輸比特流。
  • 每一層都有對應的具體協議。
  • 每一層通過接口爲上層提供服務。
  • 收發兩端的對等層通過協議進行通信。

基本概念

  • IP地址

    在Internet上的給主機統一編址的地址格式,也稱爲網絡協議(IP協議)地址。它爲互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,常見的IP地址,分爲IPv4與IPv6兩大類。

  • 子網

    IP地址是以網絡號和主機號來標示網絡上的主機的,比如172.16.10.0/24所表示的一個子網前24個bits表示網絡號,後8bits表示主機號,該子網的IP地址的範圍是172.16.10.0-172.16.10.255。網絡號爲相同子網,同子網的主機可以直接相互通信;不同子網須通過本地網關(Gateway)經由路由器來轉發數據。

  • MAC地址

    稱爲物理地址,也叫硬件地址,用來定義網絡設備的位置,MAC地址是網卡出廠時設定的。採用十六進制數表示,長度是6個字節(48位)。

  • 路由器

    工作在網絡層,根據IP地址,將數據包從一個子網傳遞轉發到另外一個子網上。

  • 交換機

    工作在數據鏈路層,根據MAC地址,將一個數據幀從一個節點傳送到相同鏈路的另一個節點上。


測試場景

以上ECS網卡的IP地址以及MAC地址可以通過ifconfig命令查詢到。以查詢ecs1的網卡信息爲例:


網絡診斷助手

命令工具
  • ping
ping命令採用的協議ICMP

ICMP 允許主機或路由器報告差錯情況和提供有關異常情況的報告。ICMP 工作在IP層,報文作爲 IP 層數據報的數據,加上IP數據報的首部,組成 IP 數據報發送出去。

ping命令的基本作用
  • 目的主機是否可達
  • 報文往返主機的時延

ping命令選項
  • -c 限定發包的個數
  • -i 控制發包的時間間隔
  • -s 設定包的大小,通常用於驗證大包是否可以正常傳輸

解析主機間通信過程

命令工具
  • arp arp相關操作
  • route 路由相關操作
通過route命令區分通信的類型

通過route -n查看ecs1的路由信息:

​ ecs2的IP爲172.16.10.20,匹配最後一條路由信息,屬於172.16.10.0/24網段,說明兩者同屬一個子網。同屬於一個子網的主機間通信通過二層交換機即可完成,屬於子網通內通信。

​ ecs3的ip 172.16.30.30會匹配第一條路由,從ecs1發給ecs3的報文會從網卡eth0發送到網關172.16.10.1,該網關配置的路由器的一個端口上。凡是需要通過子網網關轉發到目的主機的通信過程都屬於子網間通信。

子網內通信

ecs1和ecs2同屬一個子網,我們通過從ecs1去ping ecs2來觀察子網內的通信過程。

子網內通信發送數據幀過程:

接下來我們通過命令行觀察通信過程是如何完成的。

​ 在子網內通信中,數據幀是通過MAC地址去找到目標主機然後完成傳輸。首先我們通過arp -n命令查看ecs1的arp緩存表:

可以看到網關172.16.10.1的MAC地址是fa:16:3e:12:00:7d,但是ecs1並沒有esc2的MAC地址,需要ARP協議去獲得目標主機ecs2的MAC地址。

​ 通過抓包發現,在正式進行通信之前,ecs1會先發送ARP廣播,在ecs2收到報文之後,因爲自身的IP是arp請求的IP,所以會回覆自己的MAC地址,這樣ecs1就獲得ecs2的MAC地址。同時ecs2也會學習到ecs1的MAC地址。

這個過程之後再分別查看ecs1和ecs2的arp緩存表,收發兩端都獲取到了對端主機的MAC信息:

在接下來的過程中,兩者可以拿着學習到的MAC地址完成通信。

跨子網通信

ecs1和ecs3屬於不同子網,我們通過從ecs1去ping ecs3來觀察跨子網的通信過程。

三層報文的數據轉發路徑:

​ 報文首先會從ecs1發送到網關172.16.10.0/24網關172.16.10.1,然後路由器會查詢路由表從子網172.16.30.0/24網關172.16.30.1接口發出去達到ecs3。

結束ping之後查看ecs1和ecs3的arp緩存,發現並沒有對端IP的arp緩存記錄。

在ecs1抓包,可以發現ecs1發送給ecs3的報文的目的MAC地址正是172.16.10.0/24網關172.16.10.1的MAC地址。

在ecs3上抓包,ecs1發送給ecs3的報文的可以發現源MAC地址是子網172.16.30.0/24網關172.16.30.1的MAC地址。

VPC網絡理解

​ 目前各大公有云廠商基本都提供了虛擬私有云(Virtual Private Cloud,簡稱VPC)這個網絡產品,爲用戶提供了一個安全隔離,管理配置便捷的虛擬網絡環境。前面的講解的通信模型可以構成一個最簡單的VPC,每個VPC由一個虛擬路由器和一個或多個虛擬交換機組成,每個虛擬交換機對應了一個子網,用戶可以在不同的子網去創建虛擬機。子網內主機的通信通過對應的交換機去完成,跨子網的主機通信需要通過路由器路跳轉到目的子網再到目的主機。

​ 阿里雲的經典網絡也同樣可以理解爲是一個獨立的網絡平面,但是與VPC不同的是,VPC裏的IP地址是每個租戶單獨使用的,租戶可以使用一整段的IP地址進行網絡規劃,並配置相應的安全規則和路由規則。而經典網絡的IP資源是所有用戶共享的,分配到的IP也是隨機獲取的,這樣就會造成每個租戶的IP是離散的,就無法靈活地去配置安全規則和路由規則。另外,每個經典網絡的虛擬機都需要一個IP獲得公網訪問能力,而在VPC中只要給一個VPC配置一個NAT網關讓VPC內所有虛擬機都獲得公網訪問能力。以上是VPC優於經典網絡的地方。

虛擬私有云這個名稱容易對剛接觸雲計算的同學造成困擾,可能會與公有云、私有云等概念造成混淆,實際上虛擬私有云就是一個隔離的虛擬網絡環境,這樣了理解會更加清晰點。

傳輸層基本功能

​ 當源主機的信息通過網絡層傳送到目的主機的網卡之後,傳輸層通過端口將報文信息送到對應的端口。傳輸層實現了應用進程間的端到端(end-to-end)通信 。

命令工具
  • netstat 查看本地端口連接狀態
  • telnet 判斷目的主機端口是否可以訪問
tcp連接中的連接釋放過程與狀態變化

傳輸層網絡狀態查看

​ 通過python的SimpleHTTPServer命令在ecs3的8000端口上起一個http服務 python -m SimpleHTTPServer ,然後通過命令netstat -nat可以查看ecs3上所有tcp的端口連接狀態。可以看到8000端口處於LISTEN狀態。

​ 在ecs1上telnet ecs3的8000端口 telnet 172.16.30.30 8000,可以看到ecs3的8000端口與ecs1de 57498端口建立了連接,進入了TCP連接中的ESTABLISHED狀態。

​ 最後在ecs1終止telnet,再次觀察ecs3的8000端口的端口連接狀態,可以發現收發兩端的連接狀態進入了TIME_WAIT的狀態。

再經過一段時間,TIME_WAIT狀態的連接會消失,回到只有一個LISTEN狀態的網絡端口狀態信息。

telnet端口探測結果

​ 在ecs1上對ecs3的8000端口進行端口探測,如果可以正常的進行連接ecs1是如下圖的結果:

​ 如果此時,停掉ecs3上對應的進程,使其不再對8000端口進行監聽,可以發現telnet的結果是直接反饋Connection refused。

還有種情況是,對8000端口進行探測一直處於trying狀態,這種情況一般是發起請求的報文未到達目的端,請求報文在傳輸過程中被drop掉,源端一直會等待到超時。

netstat命令常用選項
  • -a 顯示所有連線中的Socket
  • -n 直接使用ip地址,而不通過域名服務器
  • -t 顯示TCP傳輸協議的連線狀況
  • -u 顯示UDP傳輸協議的連線狀況
  • -p 顯示正在使用Socket的程序識別碼和程序名稱
  • -l 顯示監控中的服務器的Socket

應用層的報文

命令工具
  • curl 利用URL語法在命令行下工作的文件傳輸工具

    在ecs1上通過curl命令訪問ecs3在8000端口的服務,可以返回ecs3上的網頁資源:

通過抓包發現可以清楚地看到發起請求過程中TCP三次握手的報文以及HTTP請求報文

同樣的在完成請求後,會有HTTP響應報文以及TCP四次揮手的報文

curl命令常用選項
  • -v/--verbose 用於打印更多信息,包括髮送的請求信息
  • -m/--max-time <seconds> 指定處理的最大時長
  • -H/--header <header> 指定請求頭參數
  • -s/--slient 減少輸出的信息,比如進度
  • -o/--output <file> 指定輸出文件名稱
  • -d/--data/--data-ascii <data> 指定POST的內容
  • -I/--head 僅返回頭部信息,使用HEAD請求

抓包小貼士

命令工具
  • tcpdump 採用命令行方式對接口的數據包進行篩選抓取
抓包基本格式

重要抓包選項

-c 指定要抓取的包數量。
-i 指定tcpdump需要監聽的接口。可以使用'any'關鍵字表示所有網絡接口。
-n 對地址以數字方式顯式,否則顯式爲主機名。
-nn 除了-n的作用外,還把端口顯示爲數值,否則顯示端口服務名。
-e 輸出的每行中都將包括數據鏈路層頭部信息,例如源MAC和目標MAC。
-w 將抓包數據輸出到文件中而不是標準輸出

舉例

抓取經過eth0的ecs1與ecs3在8000端口的tcp報文,抓取數量爲1000,並存到文件中。

tcpdump -i eth0  host 172.16.10.10 and 172.16.30.30 and tcp port 8000 -nne -w packet.pcap
如果抓包要存入到文件中,最好指定抓取報文的數量,否則持續抓包而忘記停止會導致文件一直增大,擠爆服務器的存儲空間,導致影響業務。

參考資料

OSI七層模型與TCP/IP五層模型

IP地址和子網劃分學習筆記

netstat 命令詳解

Linux之curl命令詳解

抓包工具tcpdump用法說明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章