- 1、100.0.0.16/28 对应网段的网关地址、广播地址、可分配IP地址范围
- 2、使用man手册学习tcpdump的使用
- 3、详细叙述僵尸进程产生的原因以及危害
- 4、详细说明vmstat输出结果的含义
100.0.0.16/28 对应网段的网关地址、广播地址、可分配IP地址范围
子网掩码28对应,255.255.255.240
这个网段 =
255.255.255.11110000=240
100.0.0.00010000=16
算法 :ipv4地址对应32位
28转换成二进制
1111 1111=255,
1111 0000=240
255.255.255.240
一个网络的主机数算法:=2^主机id位数-2
可分配IP地址范围:
2^4-2=14
100.0.0.16~100.0.0.0.31
当主机位是全1时我们将该地址作为子网广播地址
默认网关位第一位:100.0.0.16
广播地址:
100.0.0.0001 1111=广播地址
100.0.0.31
网关地址
100.0.0.0001 0001=网关地址
100.0.0.17
使用man手册学习tcpdump的使用
[root@centos7 ~]#man tcpdump
NAME
tcpdump - dump traffic on a network #tcpdump 在网络上转储流量
tcpdump的选项:
[root@centos7 ~]#tcpdump --help
Usage: tcpdump
[-a 将网络地址和广播地址转变成名字;
A
b
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd 将匹配信息包的代码以c语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;
D
-e 在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议;
-f 将外部的Internet地址以数字的形式打印出来;
h
H
-I 使标准输出变为缓冲行形式;
J
K
l
L
-n 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字;
-nn tcpdump遇到协议号或端口号的时候,将端口显示数字,而不是显示名称,
N
O
p
q
S
u
U
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv 输出详细的报文信息;
x
-X 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。
#]
[ -B size ]
[ -c count ] 选项很好理解,就是抓固定数量的包,如果没有-c选项,tcpdump会一直运行
[ -C file_size ] 指定住区固定数目的包,后面加数字
[ -E algo:secret ]
[ -F file ] [ -G seconds ] 从指定的文件中读取表达式,忽略其它的表达式;
[ -i interface ] i的含义是interface,这里我们需要指定的是监听哪一块网卡,这对于主机具有多台网卡的时候十分必要。
[ -j tstamptype ]
[ -M secret ]
[ --number ]
[ -Q|-P in|out|inout ]
[ -r file ]
[ -s snaplen ] snaplen表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节。
[ --time-stamp-precision precision ]
[ --immediate-mode ]
[ -T type ] 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)
[ --version ]
[ -V file ]
[ -w file ]
[ -W filecount ] 直接将包写入文件中,并不分析和打印出来;
[ -y datalinktype ]
[ -z postrotate-command ]
[ -Z user ]
[ expression ]
tcpdump常见的选项:
tcpdump -c 10 限制抓取10个包 (count)
tcpdump -c 10 -w cap.log -w保存到一个文件
tcpdump -r cap.log 读取存储文件 内容
-v
详细模式 显示包信息 v越多 约详细
-n
不进行别名 (查看IP 而不是域名 联想netstat -n选项)
常见参数:
指定协议类型:
tcpdump udp
只查看udp 常见udp应用,文件共享,语音,文字聊天 dns
tcpdump icmp
icmp : ping流量
指定端口号:
tcpdump port 80
指定端口范围:
tcpdump portrange 80
指定 源端口,目标端口
tcpdump src port 80 tcpdump dst port 80
指定 主机:
tcpdump host www.baidu.com
也可以加ip
以ascii 显示
tcpdump -A
详细叙述僵尸进程产生的原因以及危害
僵尸进程产生的原因:
当一个进程创建了一个子进程时,他们的运行时异步的。即父进程无法预知子进程会在什么时候结束,那么如果父进程很繁忙来不及wait 子进程时,那么当子进程结束时,会不会丢失子进程的结束时的状态信息呢?处于这种考虑unix提供了一种机制可以保证只要父进程想知道子进程结束时的信息,它就可以得到。
这种机制是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存。但是仍然保留了一些信息(如进程号pid 退出状态 运行时间等)。这些保留的信息直到进程通过调用wait/waitpid时才会释放。这样就导致了一个问题,如果没有调用wait/waitpid的话,那么保留的信息就不会释放。比如进程号就会被一直占用了。但系统所能使用的进程号的有限的,如果产生大量的僵尸进程,将导致系统没有可用的进程号而导致系统不能创建进程。所以我们应该避免僵尸进程
这里有一个需要注意的地方。如果子进程先结束而父进程后结束,即子进程结束后,父进程还在继续运行但是并未调用wait/waitpid那子进程就会成为僵尸进程。
但如果子进程后结束,即父进程先结束了,但没有调用wait/waitpid来等待子进程的结束,此时子进程还在运行,父进程已经结束。那么并不会产生僵尸进程。应为每个进程结束时,系统都会扫描当前系统中运行的所有进程,看看有没有哪个进程时刚刚结束的这个进程的子进程,如果有,就有init来接管它,成为它的父进程。
同样的在产生僵尸进程的那种情况下,即子进程结束了但父进程还在继续运行(并未调用wait/waitpid)这段期间,假如父进程异常终止了,那么该子进程就会自动被init接管。那么它就不再是僵尸进程了。应为intit会发现并释放它所占有的资源。(当然如果进程表越大,init发现它接管僵尸进程这个过程就会变得越慢,所以在init为发现他们之前,僵尸进程依旧消耗着系统的资源)
在linux系统中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。
简略的产生原因:
在子进程终止后到父进程调用wait()前的时间里,子进程被称为zombie;
具体a. 子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它
b. 父进程没有调用wait()或waitpid()函数来等待子进程的结束
c. 网络原因有时会引起僵尸进程;
僵尸进程的危害:
僵尸进程会占用系统资源,如果很多,则会严重影响服务器的性能;
孤儿进程不会占用系统资源,最终是由init进程托管,由init进程来释放;
signal(SIGCHLD, SIG_IGN); // 忽略SIGCHLD信号,这是一个常用于提升并发服务器性能的技巧
因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。
如果将此信号的处理方式设置为忽略,可让内核把僵尸进程转交给init进程去处理,省去了大量僵尸进程占用系统资源。
如何杀死僵尸进程
重启服务器电脑,这个是最简单,最易用的方法,但是如果你服务器电脑上运行有其他的程序,那么这个方法,代价很大。
找到该defunct僵尸进程的父进程,将该进程的父进程杀掉,则此defunct进程将自动消失
命令: ps -ef | grep defunct_process_pid
详细说明vmstat输出结果的含义
内存工具:
[root@centos7 ~]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 130304 615164 1004 543000 0 0 8 1 36 57 1 2 97 0 0
vmstat命令:虚拟内存信息
vmstat [options ] 【delay [count]】
vmstat 2 5
proc:
r:可运行(郑云翔或等待运行)进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
swpd:交换内存的使用总量
free:空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap:
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s)
io:
bi:从块设备读入到系统的速率(kb/s)
bo:保存数据至块设备的速率
system:
in:interrupts 中断速率,包括时钟
cs:context switch 进程切换速率
system:
in:interrupts 中断速率,包括时钟
cs:context switch 进程切换速率
cpu:
us:Time spent running non-kernel code
sy:Time spent running kernel code
id:Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa:Time spent waiting for IO. 2.5.41前,包括in idle.
st:Time stolen from a virtual machine. 2.6.11前,unknown.
选项:
-s:显示内存的统计数据
[root@centos7 ~]#vmstat --help
Usage:
vmstat [options] [delay [count]]
Options:
-a, --active active/inactive memory 显示活跃和非活跃内存
-f, --forks number of forks since boot 显示从系统启动至今的fork数量
-m, --slabs slabinfo 显示slabinfo
-n, --one-header do not redisplay header 只在开始时显示一次各字段名称。
-s, --stats event counter statistics 显示内存相关统计信息及多种系统活动数量。
-d, --disk disk statistics 显示磁盘相关统计信息。
-D, --disk-sum summarize disk statistics
-p, --partition <dev> partition specific statistics 显示指定磁盘分区统计信息
-S, --unit <char> define display unit 显示内存的统计数据。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-w, --wide wide output 宽输出
-t, --timestamp show timestam
-h, --help display this help and exit
-V, --version output version information and exit 显示vmstat版本信息。