每一層實現各自的功能。html
在Internet上的給主機統一編址的地址格式,也稱爲網絡協議(IP協議)地址。它爲互聯網上的每個網絡和每一臺主機分配一個邏輯地址,常見的IP地址,分爲IPv4與IPv6兩大類。python
IP地址是以網絡號和主機號來標示網絡上的主機的,好比172.16.10.0/24所表示的一個子網前24個bits表示網絡號,後8bits表示主機號,該子網的IP地址的範圍是172.16.10.0-172.16.10.255。網絡號爲相同子網,同子網的主機能夠直接相互通訊;不一樣子網須經過本地網關(Gateway)經由路由器來轉發數據。緩存
稱爲物理地址,也叫硬件地址,用來定義網絡設備的位置,MAC地址是網卡出廠時設定的。採用十六進制數表示,長度是6個字節(48位)。安全
工做在網絡層,根據IP地址,將數據包從一個子網傳遞轉發到另一個子網上。服務器
工做在數據鏈路層,根據MAC地址,將一個數據幀從一個節點傳送到相同鏈路的另外一個節點上。網絡
以上ECS網卡的IP地址以及MAC地址能夠經過ifconfig命令查詢到。以查詢ecs1的網卡信息爲例:curl
ICMP 容許主機或路由器報告差錯狀況和提供有關異常狀況的報告。ICMP 工做在IP層,報文做爲 IP 層數據報的數據,加上IP數據報的首部,組成 IP 數據報發送出去。tcp
-c
限定發包的個數-i
控制發包的時間間隔-s
設定包的大小,一般用於驗證大包是否能夠正常傳輸arp
arp相關操做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地址。
目前各大公有云廠商基本都提供了虛擬私有云(Virtual Private Cloud,簡稱VPC)這個網絡產品,爲用戶提供了一個安全隔離,管理配置便捷的虛擬網絡環境。前面的講解的通訊模型能夠構成一個最簡單的VPC,每一個VPC由一個虛擬路由器和一個或多個虛擬交換機組成,每一個虛擬交換機對應了一個子網,用戶能夠在不一樣的子網去建立虛擬機。子網內主機的通訊經過對應的交換機去完成,跨子網的主機通訊須要經過路由器路跳轉到目的子網再到目的主機。
阿里雲的經典網絡也一樣能夠理解爲是一個獨立的網絡平面,可是與VPC不一樣的是,VPC裏的IP地址是每一個租戶單獨使用的,租戶可使用一整段的IP地址進行網絡規劃,並配置相應的安全規則和路由規則。而經典網絡的IP資源是全部用戶共享的,分配到的IP也是隨機獲取的,這樣就會形成每一個租戶的IP是離散的,就沒法靈活地去配置安全規則和路由規則。另外,每一個經典網絡的虛擬機都須要一個IP得到公網訪問能力,而在VPC中只要給一個VPC配置一個NAT網關讓VPC內全部虛擬機都得到公網訪問能力。以上是VPC優於經典網絡的地方。
虛擬私有云這個名稱容易對剛接觸雲計算的同窗形成困擾,可能會與公有云、私有云等概念形成混淆,實際上虛擬私有云就是一個隔離的虛擬網絡環境,這樣了理解會更加清晰點。
當源主機的信息經過網絡層傳送到目的主機的網卡以後,傳輸層經過端口將報文信息送到對應的端口。傳輸層實現了應用進程間的端到端(end-to-end)通訊 。
netstat
查看本地端口鏈接狀態telnet
判斷目的主機端口是否能夠訪問
經過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狀態的網絡端口狀態信息。
在ecs1上對ecs3的8000端口進行端口探測,若是能夠正常的進行鏈接ecs1是以下圖的結果:
若是此時,停掉ecs3上對應的進程,使其再也不對8000端口進行監聽,能夠發現telnet的結果是直接反饋Connection refused。
還有種狀況是,對8000端口進行探測一直處於trying狀態,這種狀況通常是發起請求的報文未到達目的端,請求報文在傳輸過程當中被drop掉,源端一直會等待到超時。
-a
顯示全部連線中的Socket-n
直接使用ip地址,而不經過域名服務器-t
顯示TCP傳輸協議的連線情況-u
顯示UDP傳輸協議的連線情況-p
顯示正在使用Socket的程序識別碼和程序名稱-l
顯示監控中的服務器的Socketcurl
利用URL語法在命令行下工做的文件傳輸工具在ecs1上經過curl命令訪問ecs3在8000端口的服務,能夠返回ecs3上的網頁資源:
經過抓包發現能夠清楚地看到發起請求過程當中TCP三次握手的報文以及HTTP請求報文
一樣的在完成請求後,會有HTTP響應報文以及TCP四次揮手的報文
-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
若是抓包要存入到文件中,最好指定抓取報文的數量,不然持續抓包而忘記中止會致使文件一直增大,擠爆服務器的存儲空間,致使影響業務。