week 7
網關地址:100.0.0.17
廣播地址:100.0.0.31
可分配IP地址:100.0.0.16~100.0.0.31
2.tcpdump的使用
語法:
tcpdump [options][Protocol][Direction][Host(s)][Value][Logical Operations][Other expression] options: -a 嘗試將網絡和廣播地址轉換成名稱。 -c<數據包數目> 收到指定的數據包數目後,就停止進行傾倒操作。 -d 把編譯過的數據包編碼轉換成可閱讀的格式,並傾倒到標準輸出。 -dd 把編譯過的數據包編碼轉換成C語言的格式,並傾倒到標準輸出。 -ddd 把編譯過的數據包編碼轉換成十進制數字的格式,並傾倒到標準輸出。 -e 在每列傾倒資料上顯示連接層級的文件頭。 -f 用數字顯示網際網絡地址。 -F<表達文件> 指定內含表達方式的文件。 -i<網絡界面> 使用指定的網絡截面送出數據包。 -l 使用標準輸出列的緩沖區。 -n 不把主機的網絡地址轉換成名字。 -N 不列出域名。 -O 不將數據包編碼最佳化。 -p 不讓網絡界面進入混雜模式。 -q 快速輸出,僅列出少數的傳輸協議信息。靜默模式 -r<數據包文件> 從指定的文件讀取數據包數據。 -s<數據包大小> 設置每個數據包的大小。 -S 用絕對而非相對數值列出TCP關聯數。顯示絕對序列號 -t 在每列傾倒資料上不顯示時間戳記。 -tt 在每列傾倒資料上顯示未經格式化的時間戳記。 -ttt 輸出本行和前面一行之間的時間差。 -tttt 在每一行中輸出由date處理的默認格式的時間戳。 -T<數據包類型> 強制將表達方式所指定的數據包轉譯成設置的數據包類型。 -v 詳細顯示指令執行過程。 -vv 更詳細顯示指令執行過程。 -x 用十六進制字碼列出數據包資料。 -w<數據包文件> 把數據包數據寫入指定的文件。 Protocol(協議): Values(取值):ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp and udp. 如果未指定協議,則使用所有協議 Direction(流向): Values(取值):src,dst,src and dst,src or dst 如果未指定源或目標,則應用"src or dst" Host(s)(主機): Values(替代關鍵字):net,port,host,portrange. 如果未指定關鍵字,則默認使用"host" Logical Operations: (1) AND and or && (2) OR or or || (3) EXCEPT not or !
tcpdump示例:
(1).默認啟動
tcpdump
默認情況下,直接啟動tcpdump將監視第一個網絡接口(非lo口)上所有流通的數據包。
(2).監聽指定網絡接口的數據包
tcpdump -i eth1
如果不指定網卡,默認tcpdump只會監聽第一個網絡接口,如eth0
(3).監聽指定主機的數據包
打印所有進入或離開主機hostname的數據表
tcpdump host hostname
也可以指定ip,例如截獲192.168.3.10的主機收到和發出的數據包
tcpdump host 192.168.3.10
截獲主機192.168.3.10與192.168.3.17或18的通信
tcpdump host 192.168.3.10 and \(192.168.3.17 or 192.168.3.18 \)
截獲主機192.168.3.10除了與192.168.3.17之外所有主機通信的IP包
tcpdump host 192.168.3.10 and ! 192.168.3.17
截獲主機hostname發送的所有數據
tcpdump src host hostname
截獲所有發送到主機hostname的數據
tcpdump dst host hostname
(4).監聽指定主機和端口的數據包
獲取主機192.168.3.10接收或發出的telnet包
tcpdump port 23 and host 192.168.3.10
(5).監聽指定網絡的數據包
獲取本機與192.168網段通信的數據包
tcpdump -c 10 net 192.168 ###-c 10 表示只抓取10個包
(6).監聽指定協議的數據包
獲取ping包
tcpdump -i eth0 icmp
獲取主機192.168.3.10對本機的ping
tcpdump -c 5 -nn -i eth0 src 192.168.3.10 and icmp
3.僵屍進程產生的原因以及危害
僵死狀態(Zombies)是一個比較特殊的狀態。? 當進程退出並且父進程沒有讀取到子進程退出的返回代碼時就會產生僵屍進程。僵屍進程會以終止狀態保持在進程表中,並且會一直在等待父進程讀取退出狀態代碼。所以,只要子進程退出,父進程還在運行,但父進程沒有讀取子進程狀態,子進程進入Z狀態
產生原因:
在子進程終止後到父進程調用wait()前的時間裏,子進程被稱為zombie;
a. 子進程結束後向父進程發出SIGCHLD信號,父進程默認忽略了它
b. 父進程沒有調用wait()或waitpid()函數來等待子進程的結束
c. 網絡原因有時會引起僵屍進程;
危害:
僵屍進程會占用系統資源,如果很多,則會嚴重影響服務器的性能;
如何防止僵屍進程
1)讓僵屍進程成為孤兒進程,孤兒進程不會占用系統資源,最終是由init進程托管,由init進程來釋放;
signal(SIGCHLD, SIG_IGN); 忽略SIGCHLD信號,這是一個常用於提升並發服務器性能的技巧 因為並發服務器常常fork很多子進程,子進程終結之後需要服務器進程去wait清理資源。 如果將此信號的處理方式設置為忽略,可讓內核把僵屍進程轉交給init進程去處理,省去了大量僵屍進程占用系統資源。
2) 調用fork()兩次;
3) 捕捉SIGCHLD信號,並在信號處理函數中調用wait函數;
4.說明vmstat輸出結果的含義
vmstat命令說明
[root@www ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 738856 948 150136 0 0 422 39 149 406 2 4 94 0 0
procs(進程):
r:等待運行的進程的個數;
b:處於不可中斷睡眠態的進程個數;
memory(內存):
swpd:交換內存使用總量;
free:空閑的物理內存總量;
buffer:用於buffer的內存總量;
cache:用於cache的內存總量;
swap
si:數據進入swap中的數據速率(kb/s)
so:數據離開swap的速率(kb/s)
io
bi:從塊設備讀入數據到系統的速度(kb/s)
bo:保存數據至塊設備的速率(kb/s)
system
in:interrupts,中斷速率;
cs:context switch, 上下文切換的速率;
cpu
us: user space,用戶進程執行時間百分比。
sy:system,內核系統進程執行時間百分比。
id:idle,空閑時間百分比
wa:wait,等待io完成
st: stolen,被虛擬化偷走的
week 7