网络基础模型
OSI七层模型
OSI(Open System interconnection)是由国际标准化组织ISO制定的开放式系统互联参考模型。它是一个逻辑上的定义,一个规范,并把模型分为了7层。
*OSI模型优点:
<1>.降低复杂性: 一旦网络发生故障,可迅速定位故障所处层次,便于查找和纠错;
<2>. 在各层分别定义标准接口,使具备相同对等层的不同网络设备能实现互操作,各层之间则相对独立,一种高层协议可放在多种低层协议上运行
<3>. 加快发展速度
<4>. 便于研究和教学
物理层(physical):
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。数据链路层 data link layer :
定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。网络层 network layer:
在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。传输层 transport layer:
定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段会话层 session layer:
通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)表示层 presention layer:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
应用层 application layer: 是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
TCP/IP四层模型
TCP/IP(Transmission Control Protocol/Internet Protocol)是一个Protocol Stack,它还包括许多协议(如:TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等),组成了TCP/IP协议栈。TCP/IP协议栈分为四层,IP位于协议栈的第二层(对应OSI的第三层),TCP位于协议栈的第三层(对应OSI的第四层)。
- TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- TCP/IP和OSI模型的分层的对应关系
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
TCP协议
TCP协议工作在TCP/IP模型中的传输层,并且面向连接的、全双工的协议。而且他还具有半关闭、错误检查、将数据打包成段排序、确认机制、数据恢复重传、拥塞控制等特性。
传输层通过port号,确定应用层协议
TCP协议port:共16位,0-65535(即0000 0000 0000 0000 - 1111 1111 1111 1111);IANA(互联网数字分配机构)把port定义成一下几种:
1-1023:系统端口或特权端口,仅root可用。
1024-49151:用户端口或注册端口,但要求不严格
49152-65535:动态端口或私有端口,客户端程序随机使用的端口;其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
-
服务器(server)端常用端口:存储于/etc/services 文件中
- TCP包头
- TCP标记位
- URG 紧急指针,为1时有效
- ACK 确认位
- PSH 1为立即上传不在内核缓存
- RST 1为重新建立连接
- SYN 同步位
- FIN 终止位
- TCP三次握手
- TCP四次挥手
有限状态机FSM(finite state machine)
CLOSED 没有任何连接状态
LISTEN 侦听状态,等待来自远方的TCP端口的连接请求
SYN-SENT 在发送连接请求后,等待对方确认
SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
ESTABLISHED 代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送传输连接请求
TIME-WAIT 完成双向传输连接关闭,等待所以分组消失
CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认
LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所以分组消失
CLOSING 双方同时尝试关闭传输连接等待对方确认
iproute家族命令
1. ip命令
ip [ OPTIONS ] OBJECT { COMMAND | help }
-
注意:OBJECT={ link | addr | netns | route };OBJECT可以简写,各子命令也可以简写
<1> ip link: 网络设备配置ip link show #显示设备属性 ip link set #修改设备属性
...
ip link set:
dev NAME #指明要管理的设备,dev关键字可以省略;默认设置
up 和 down #启用和关闭
multicast on 或 multicast off #启用或禁用多播功能
name NAME #重命名接口
mtu NUMBER #设置MTU的大小;默认为1500
netns PID #ns为namespace,用于将接口移动到指定的网络名称空间
<2> ip netns:
ip netns :
add NAME #创建指定的netns
del NAME #删除指定的netns
list #列出所有的netns
exec NAME COMMAND #在指定的netns中运行命令
示例:
[root@localhost ~]# ip netns add mynet
[root@localhost ~]# ip netns list
mynet
[root@localhost ~]# ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:19:fc:03 brd ff:ff:ff:ff:ff:ff
3: ens37: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:19:fc:0d brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# ip link set ens37 netns mynet
[root@localhost ~]# ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:19:fc:03 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# ip netns exec mynet ip link show
1: lo: mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: ens37: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 00:0c:29:19:fc:0d brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# ip netns del mynet
<3> ip addr: 管理接口上的IP地址
ip address add IFADDR dev IFACE #额外添加地址
[label NAME] #为额外添加的地址指明接口别名
[broadcast ADDRESS] #广播地址;会根据ip和netmask自动计算
[scope SCOPE_VALUE] #设置范围值
global:全局可用
link:接口可用
host:仅本机可用
...
ip address del IFADDR dev IFACE #删除指定的IP地址,用法同add一样
...
ip addr {show | list} [IFACE] #显示(指定)接口的地址
...
ip addr flush dev IFACE #清空指定接口的ip地址
<4> ip route : 实现路由表的管理
ip route { add | del | change | append | replace } ROUTE ip
ip route add TYPE PREFIX via GW [dev IFACE] [src SOURCE_IP]
示例:
[root@localhost ~]# ip route show
[root@localhost ~]# ip route add 172.18.0.0/16 via 10.0.0.201
[root@localhost ~]# ip route show
192.168.1.0/24 dev eth4 proto kernel scope link src 192.168.1.108 metric 1
172.18.0.0/16 via 10.0.0.201 dev eth3
[root@localhost ~]# ip route del 172.18.0.0/16
[root@localhost ~]# ip route show
192.168.1.0/24 dev eth4 proto kernel scope link src 192.168.1.108 metric 1
[root@localhost ~]# ip route flush to 192.168.1.0/24 #清空指定路由表中的路由信息
[root@localhost ~]# ip route list # 显示路由表
ss命令:another utility to investigate sockets
研究套接字的另一个实用程序,是为了取代netstat命令
选项:
-t:TCP协议相关连接,连接均有其状态(FSM 有限状态机)
-u:UDP相关连接
-w:raw socket相关 (裸套接字)
-l:处于监听状态,等待别人访问
-a:所以状态
-n:以数字格式显示IP和PORT
-e:扩展格式
-p:显示相关的进程及PID
-m:内存用量
-o:计时器信息
FILTER:= [ state TCP-STATE ] [ EXPRESSION ] #过滤器
常用组合:
ss {-tan | -uan | -tnl | -unl | -tunlp}
htop命令
使用htop命令前先要安装 :
yum -y install htop
安装后直接执行htop命令即可[图片上传失败...(image-4f346c-1529312758120)]
htop界面支持交互式命令:
u:选择显示指定用户的进程
l:显示光标所在进程所打开的文件列表
s:显示光标所在进程执行的系统调用
a:绑定进程到指定的CPU
#: 快速定位光标值PID为#的进程上
t/F5: 以层级结构显示个进程的状态
htop支持的一些选项:
-d #:延迟时长
-u USERNAME:仅显示指定用户的进程
-s COLUMN: 根据指定的字段进行排序
每一行代表的含义:
1:CPU1的负载率
2:CPU2的负载率
Mem:物理内存的使用情况
Swp:交换分区的使用情况
Tasks:进程的总个数
load average:系统在1,5,15分钟的平均负载
PID: 每个进程的ID
USER: 进程所属的使用者
PRI: Priority的简写,进程的优先级,越小优先级越高
NI: Nice的简写,值越小越早被运行
VIRT: 进程需要的虚拟内存大小,而非使用的虚拟内存大小
RES: 进程当前使用的内存大小,不包括swap
SHR: 进程与其他进程共享的内存大小;可以通过RES-SHR计算出实际所占物理内存大小
S: 进程的状态
CPU%: cpu使用率
MEM%:内存使用率
TIME+: cpu使用时间的累加
vmstat命令:Report virtual memory statistics
虚拟内存统计报告
vmstat [options] [delay [count]]
vmstat reports information about processes, memory, paging, block IO, traps, disks and cpu activity.
[root@localhost ~]# 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 0 407052 2108 440872 0 0 21 29 66 55 0 1 99 0 0
Procs:
r: The number of runnable processes (running or waiting for run time).等待运行进程个数
b: The number of processes in uninterruptible sleep. 处于不可终断睡眠态进程个数
Memory
swpd: the amount of virtual memory used. 交换内存使用总量
free: the amount of idle memory. 空闲的物理内存总量
buff: the amount of memory used as buffers. 用于buffer的内存总量
cache: the amount of memory used as cache. 用于cache的内存总量
Swap
si: Amount of memory swapped in from disk (/s).数据进入swap中的数据速率(kb/s)
so: Amount of memory swapped to disk (/s).数据离开swap的速率(kb/s)
IO
bi: Blocks received from a block device (blocks/s).从块设备读入数据到系统的速率(kb/s)
bo: Blocks sent to a block device (blocks/s).保存数据至块设备的速率(kb/s)
System
in: The number of interrupts per second, including the clock. 中断速率
cs: The number of context switches per second.上下文调换速率
CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)用户控件进程占用百分百
sy: Time spent running kernel code. (system time)内核空间进程占用百分比
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.空闲时间进程占用
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.等待IO完成时间所占百分比
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown被虚拟化程序偷走的时间所占百分比
常用选项:
vmstat -s #显示内存统计数据
...
示例
[root@localhost ~]# vmstat 3 2
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 0 407764 2108 440992 0 0 16 22 58 48 0 0 99 0 0
0 0 0 407640 2108 440992 0 0 0 0 64 49 0 0 100 0 0
#每三秒显示一次统计数据,共显示两次
[root@localhost ~]# vmstat -s
999720 K total memory
148700 K used memory
280952 K active memory
163408 K inactive memory
407920 K free memory
...
#显示内存统计数据
bash脚本编程练习:
使用until和while分别实现192.168.0.0/24 网段内,地址是否能够ping 通,若ping通则输出“success!”,若ping不通则输出“fail!”
#!/bin/bash
#
ip=192.168.0.
declare -i i=1
while [ $i -lt 255 ];do
ping -c 1 $ip$i&>/dev/null
if [ $(echo $?) -eq 0 ];then
echo "success!"
else
echo "fail!"
fi
let i++
done
...
#!/bin/bash
#
ip=192.168.0.
declare -i i=1
until [ $i -gt 255 ];do
ping -c 1 $ip$i &>/dev/null
if [ $(echo $?) -eq 0 ];then
echo "success!"
else
echo "fail!"
fi
let i++
done
...
#!/bin/bash
#
ip=192.168.1.
for i in {1..254};do
ping -c 1 $ip$i &> /dev/null
if [ $(echo $?) -eq 0 ];then
echo "success!"
else
echo "fail!"
fi
done