写在前面
在互联网+的时代,网络显得越发重要,如果现在你一顿不吃饭可能还没事但是一个小时没网络,估计你都要疯了。那么网络到底是个啥呢?看不见又摸不着。拿着一台电脑怎么和网络建立连接呢?那么下面要讲解的内容或许可以给你解决个大概。
闲聊网络
如果让你修一栋房子你会一层一层的往上修,并且规划好一层用来开商铺,二层用来开超市,上面一层用来干嘛等等,其实网络也是一样,把一个虚拟的环境进行分层而定,因此就有了我们现在熟知的四层和七层网络模型,这里你可能又会问了,为什么还会有四层和七层之分呢,其实呢早期的网络只有四层,也即是我们现在用得最多的网络结构,但是后来为了让人们能够更加详尽的认识到网络,因此就把网络划分为更加详细的七层模型,所以就有了四层与七层之分,不过在实际使用中仍然使用四层,七层模型大多用于学习。
TCP/IP网络模型是由美国国防部在ARPANET网络中创建的网络体系结构,从上往下共有四层,因此也是我们常说的TCP/IP四层结构,其模型从下往上依次是网络接口层、网际层、传输层、应用层。
- 网络接口层主要提供了网卡等网络硬件设备以及驱动程序,还定义了各种物理网络的底层互联协议,如Ethernet、令牌环网、帧中继网络、分组交换网络等。;
- 网际层主要定义了各主机之间跨多个网络的路由连接,完成寻址和路由等功能;
- 传输层主要是完成各主机的端到端的数据传输;
- 应用层则是为客户提供各种丰富的应用。
为了能够更好的了解网络,那么ISO的七层参考网络模型就是必须的,因为该模型更加详尽细致的划分了网络,并定义了每层所要完成的功能特性,从下往上依次是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
- 物理层主要是规定了物理设备的机械电气特性,为上层提供一个可用的物理环境;
- 数据链路层将物理层提供的可能出错的物理连接改造成逻辑上无差错的数据链路,并对物理层的原始数据进行帧封装。也就是负责在两个相邻的节点间无差错地传送以帧为单位的数据流;
- 网络层主要负责网络寻址,在两个主机之间建立连接;
- 传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还处理端到端的差错控制和流量控制问题;
- 会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话;
- 表示层定义数据传输以何种格式进行表示,还能够为应用程序提供特定的数据处理功能。包含协议转换、数据加密、数据解密、数据压缩;
- 应用层定义了应用程序可用于请求网络服务的接口,而不是直接指应用程序本身。
上述内容就是我们常说的网络的两种分层体系结构,数据通过传输时从上往下一层一层的封装到达对端主机后,从下往上一层一层的解封装,最终得到传输的数据。
了解了网络的分层结构后,为了更好的管理网络以及主机,我们通常会对主机进行一些基本的操作,如配置IP地址、网关地址等,这样我们的主机才能连接上互联网。IP命令是比ifconfig命令更加强大的一个网络管理类命令,能够显示和管理主机、路由以及路由策略等。其用法为:
ip [ OPTIONS ] OBJECT { COMMAND | help }
此处的OBJECT常用的有link、address、route、netns。
ip link 子命令主要用于配置网络设备:
- ip link set name INTERFACE_NAME 重命名接口;
- ip link set dev INTERFACE_NAME up|down 启用或提供某网卡;
- ip link set mtu NUMBER 设置MTU的大小,默认为1500;
- ip link show 显示设备属性;
ip netns主要用于管理网络的名称空间:
- ip netns list:列出所有的netns;
- ip netns add NAME:创建指定的netns;
- ip netns del NAME:删除指定的netns;
- ip netns exec NAME COMMAND:在指定的netns中运行命令;
ip address用于管理主机地址:
- ip addr add IFADDR dev IFACE:添加指定接口的IP地址;
- ip addr delete IFADDR dev IFACE:删除指定接口的IP地址;
- ip addr list [IFACE]:显示接口的地址;
- ip addr flush dev IFACE:清空指定接口的地址;
ip route用于管理主机的路由表:
- ip route add TYPE PREFIX via GW [dev IFACE]:添加路由表,此处 TYPE PREFIX的可以是主机路由、网络路由或者默认路由;
- ip route del TYPE PRIFIX:删除指定类型的路由表;
- ip route show TYPE PRIFIX:显示指定类型的路由表;
我想通过上面的讲解,如果此时你拿着一个即便是Linux系统的电脑肯定也能接到网络中了,为了更好的管理服务,此处还要提供一个类似于netstat的命令,它就是ss命令,ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容,但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。ss命令的用法也非常简单:
ss [options] [FILTER]
此处的选项:
- -t:tcp协议相关的连接;
- -u:udp协议相关的连接;
- -w:raw socket相关的连接;
- -l:监听状态的连接;
- -a:所有状态的连接;
- -n:数字格式;
- -p:相关的程序及其PID;
- -e:扩展格式信息;
- -m:内存用量;
- -o:计时器信息
常见的FILTER则有 [ state TCP-STATE ] [ EXPRESSION ]:
- TCP-STATE有:LISTENING、ESTABLISEHD、FIN_WAIT_1、FIN_WAIT_2、SYN_SENT、SYN_RECV、CLOSED等有限状态机;
- EXPRESSION则有dport和sport;
这么讲述可能有点晕乎乎的,那么就来两个例子您可能看的更清楚:
示例1:ss -tan ‘( dport = :22 or sport = :22 )’ 表示只显示源端口和目标端口是22的网络进程信息,注意此处的格式为固定格式,括号内各字段之间都有空格。
示例2:ss -tan state ESTABLISHED 表示只显示状态为ESTABLISHED的进程信息。
这里提到了进程的概念,您可能又要犯迷糊了,其实进程就是运行中程序的一个副本,进程有守护进程和前台进程之分,守护进程是在系统引导过程中启动的进程,而前台进程是通过终端启动的进程。在以后的使用中经常需要查看进程的运行情况,因此最简单的进程的查看就必不可少了。进程的管理也有非常多的工具,这里列出几个常用的管理工具htop、vmstat命令。
htop命令和top命令非常类似,但是htop命令较后者功能更加强大,基本功能用于显示进程信息,其用法为:
htop [-dus]
- -d #:指定延迟时间间隔;
- -u UserName:仅显示指定用户的进程;
- -s COLUME:以指定字段进行排序显示;
在键入htop命令后,在显示页面通过键入页面下面的字符还可以灵活的操作:
- F1:查看htop使用帮助说明,其中有对一些子命令的说明;
- F2:对htop进行设定,可以更改CPU,MEM,SWP显示格式等信息;
- F3:搜索进程;
- F4:进程过滤器;
- F5:以树状结构显示进程;
- F6:选择排序方式;
- F7:减少nice值,提高对应进程的优先级;
- F8:增加nice值,降低对应进程的优先级;
- F9:对进程传递信号;
- F10:结束htop;
当然此处只是粗略的提了一下,更强大的功能还需要您结合上述内容实现。说完了htop命令,下面就来聊一聊vmstat命令,vmstat可以展现给定时间间隔的服务器的各个状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况以及IO读写情况等信息。其使用方法为:
vmstat [delay [count]]
可以指明采样的时间间隔delay值和采样的次数count值,但是如果此处的采样次数没给,vmstat会根据采样间隔一直采样显示,如果两个都没给定,那么只显示一次采样值。采样的显示内容分为procs,memory,swap,io,system,cpu段信息,每段信息都有固定的意义,其中:
- procs段中的r:等待运行的进程的个数;CPU上等待运行的任务的队列长度;
- procs段中的b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度;
- memory段中的swpd:交换内存使用总量;
- memory段中的free:空闲的物理内存总量;
- memory段中的buffer:用于buffer的内存总量;
- memory段中的cache:用于cache的内存总量;
- swap段中的si:数据进入swap中的数据速率(kb/s);
- swap段中的so:数据离开swap的速率(kb/s);
- io段中的bi:从块设备读入数据到系统的速度(kb/s);
- io段中的bo:保存数据至块设备的速率(kb/s);
- system段中的in:interrupts,中断速率;
- system段中的cs:context switch, 上下文 切换的速率;
- cpu段中的us:用户CPU时间;
- cpu段中的ussy:系统CPU时间;
- cpu段中的id:空闲 CPU时间;
- cpu段中的wa:等待IO的CPU时间;
- cpu段中的st:被偷走的CPU时间;
shell脚本时间
我们都知道Linux系统中shell脚本是非常非常重要的,使用脚本可以很方便的完成繁琐的功能,并且系统上的很多服务也都是使用脚本完成控制的,因此学习脚本是必不可少的环节。刚刚接触脚本,也不要实现太复杂的功能,试想一个场景,统计一下你在的网段中有多少人在线,即有哪些IP地址被分配出去了。很多人都非常聪明,连上路由器看一下就可以知道了啊,但是现在如果你不知道路由器密码咋整呢?使用脚本在这里就变得非常简单了,我们只需要使用前面学过的ping命令就可以很容易的判断当前哪些IP已经被使用了,话不多少,直接上结果。
运行结果如下:
或者使用util也能实现上述功能,
运行结果如下:
其实本题还有很多种方法实现,上面的while和until实现刚好是条件相反的时候执行,while是条件为真时执行,而until则是条件为假,即条件不满足的时候执行。更多更好的方法希望读者朋友能够实现。
写在最后
学习是一个漫长的过程,很多时候都是三分钟的激情,因此学习要克服懒惰,贵在坚持,特别是这种实操类型的学习不能完了就完了,如果是这样那真是只有完了。要一遍一遍不断的练习,不断的实践,同一个问题从多维度多方向解答,就像上面的问题,其实还有很多种实现方法,即便是使用while实现,内容也可以有很多种写法,只有每次这样不辞艰辛的练习,打闹基础知识,才能在后期快速的成长。
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90977