[授权发表]Shell编程范例之网络操作

11 篇文章 1 订阅
10 篇文章 0 订阅

by falcon

最初发表:泰晓科技 – 聚焦嵌入式 Linux,追本溯源,见微知著!
原文链接:Shell编程范例之网络操作
评论说明:为更好地聚合大家的讨论,请到上面原文的评论区回复。


前言

之前已经介绍了shell编程范例之数值、布尔值、字符串、文件、文件系统、进程等的操作。这些内容基本覆盖了网络中某个独立机器正常工作的“方方面面”,现在需要把视角从单一的机器延伸到这些机器通过各种网络设备和协议连接起来的网络世界,分析网络拓扑结构、网络工作原理、了解各种常见网络协议、各种常见硬件工作原理、网络通信与安全相关软件以及工作原理分析等。

不过网络相关的问题确实太复杂了,这里不可能介绍具体,因此如果想了解更多的细节,还是建议参考相关的资料,例如后面的参考资料。但是Linux是一个网络原理学习和实践的好平台,不仅因为它本身对网络体系结构的实现是开放源代码的,而且各种相关的分析工具和函数库数不胜数,因此,如果你是学生,千万不要错过通过它来做相关的实践工作。

网络原理介绍

我们的网络世界

在进行所有的介绍之前,来让我们直观地感受一下那个真真实实存在的网络世界吧。当我在Linux下通过WEB编辑器写这篇blog时,一边用mplayer听着远程音乐,等累了时则打开兰大的网络TV频道开始看看凤凰卫视……这些“现代化”的生活,我想,如果没有网络,将变得无法想象。

下面来构想一下这样一个网络世界的优美图画:

我一边盯着显示器,一边敲击着键盘,一边挂着耳机。

我的主机电源灯灿烂得很,发着绿光,这个时候我很容易想象主机背后的那个网卡位置肯定有两个不同颜色的灯光在闪烁,这个告诉我,它正在与计算机网络世界打着交道。

就在实验室的某个角落,有一个交换机上的一个网口的网线连到我的主机上,这个交换机接到了一个局域网的网关上,然后这个网关再接到了信息楼的某个路由器上,再转接到学校网络中心的另外一个路由器上……

期间,有一个路由器连接到了这个blog的服务器上,而另外一个则可能连到了那个网络TV服务器上,还有呢,另外一些则连接到了电信网络里头的某个音乐服务器上……

下面用dia绘制一个简单的“网络地图”:

image

在这个图中,把一些最常见的网络设备和网络服务基本都呈现出来了,包括本地主机、路由、交换机、网桥,域名服务器,万维网服务,视频服务,防火墙服务,动态IP地址服务等。其中各种设备构成了整个物理网络,而网络服务则是构建在这些设备上的各种网络应用。

现在的网络应用越来越丰富多样,比如即时聊天(IM)、p2p资源共享、网络搜索等,它们是如何实现的,它们如何构建在各种各样的网络设备之上,并且能够安全有效的工作呢?这取决于这背后逐步完善的网络体系结构和各种相关网络协议的开发、实现和应用。

网络体系结构和网络协议介绍

那么网络体系结构是怎么样的呢?涉及到哪些相关的网络协议呢?什么又是网络协议呢?

在《计算机网络——自顶向下的方法》一书中非常巧妙地给出了网络体系结构分层的比喻,把网络中各层跟交通运输体系中的各个环节对照起来,让人更通俗易懂。在交通运输体系中,运输的是人和物品,在计算机网络体系中,运输的是电子数据。考虑到交通运输网络和计算机网络中最终都可以划归为点对点的信息传输。这里考虑两点之间的信息传递过程,得到这样一个对照关系,见下图:

image

对照上图,更容易理解右侧网络体系结构的分层原理(如果比照一封信发出到收到的这一中间过程可能更容易理解),上图右侧是TCP/IP网络体系结构的一个网络分层示意图,在把数据发送到网络之前,在各层中需要进行各种“打包”的操作,而从网络中接收到数据以后,就需要进行“解包”操作,最终把纯粹的数据信息给提取出来。这种分层的方式是为了传输数据的需要,也是两个主机之间如何建立连接以及如何保证数据传输的完整性和可靠性的需要。通过把各种需要分散在不同的层次,使得整个体系结构更加清晰和明了。这些“需求”具体通过各种对应的协议来规范,这些规范统成为网络协议。

关于OSI模型(7层)比照TCP/IP模型(4层)的协议栈可以从下图(来自网络)看个明了:

image

而下图(来自网络)则更清晰地体现了TCP/IP分层模型。

image

上面介绍了网络原理方面的基本内容,如果想了解更多网络原理和操作系统对网络支持的实现,可以考虑阅读后面的参考资料。下面将做一些相关的实践,即在Linux下如何联网,如何用Linux搭建各种网络服务,并进行网络安全方面的考量以及基本的网络编程和开发的介绍。

Linux下网络“实战”

如何把我们的Linux主机接入网络

如果要让一个系统能够联网,首先当然是搭建好物理网络了。接入网络的物理方式还是蛮多的,比如直接用网线接入以太网,用无线网卡上网,用ADSL拨号上网……

对于用以太网网卡接入网络的常见方式,在搭建好物理网络并确保连接正常后,可以通过配置IP地址和默认网关来接入网络,这个可以通过手工配置和动态获取两种方式。

范例:通过dhclient获取IP地址

如果所在的局域网有DHCP服务,那么可以这么获取,N是设备名称,如果只有一块网卡,一般是0或者1。

$ dhclient ethN
范例:静态配置IP地址

当然,也可以考虑采用静态配置的方式,ip_address本地主机的IP地址,gw_ip_address是接入网络的网关的IP地址。

$ ifconfig eth0 ip_address on
$ route add deafult gw gw_ip_address

如果这个不工作,记得通过ifconfig/mii-tool/ethtool等工具检查网卡是否被驱动起来了,然后通过lspci/dmesg等检查网卡类型(或者通过主板手册和独立网卡自带的手册查看),接着安装或者编译相关驱动,最后把驱动通过insmod/modprobe等工具加载到内核中。

用Linux搭建网桥

网桥工作在OSI模型的第二层,即数据链路层,它只需要知道目标主机的MAC地址就可以工作。Linux内核在2.2开始就已经支持了这个功能了,具体怎么配置看看后续相关参考资料吧。如果要把Linux主机配置成一个网桥,至少需要两个网卡。

网桥的作用相当于一根网线,用户无须关心里头有什么东西,把它的两个网口连接到两个主机上就可以让这两个主机支持相互通信。不过它比网线可厉害多了,如果在起上配置防火墙,就可以隔离连接在它两端的网段(注意这里是网络,因为它不识别IP),另外,如果这个网桥有多个网口,那么可以实现一个功能复杂的交换机了,而如果有效组合多个网桥,则有可能实现一个复杂的可现实现流量控制和负载平衡的防火墙系统了。

用Linux做路由

路由工作在OSI模型的第三层,即网络层,通过router可以配置Linux的路由,当然,Linux下也有很多工具支持动态路由的。相关的资料在网路中铺天盖地,由于时间关系,这里不做介绍,自己找找合适的去看吧。

用Linux搭建各种常规的网络服务

你需要什么服务呢?给你的局域网弄个DHCP服务器,那就弄个吧,看看参考资料;如果想弄个邮件发送服务器,那就弄个sendmail或者exim4吧,如果再想弄个邮件列表服务器呢,那就装个mailman,如果想弄个接收邮件的服务器呢,那就安装个pop3服务器吧,如果想弄个web站点,那就弄个apache服务器,如果想弄上防火墙服务,那么通过iptables工具配置netfilter就可以,what's more?如果你能想到,Linux上应该都有相应的实现。

Linux下网络问题诊断与维护

如果出现网络问题,不要惊慌,逐步检查网络的各个层次:物理链接、链路层、网络层直到应用层,熟悉使用各种如下的工具,包括ethereal/tcpdump, hping, nmap, netstat,netpipe,netperf,vnstat,ntop等等。

关于这些工具的详细用法和网络问题诊断和维护的相关知识,看看后续资料吧。

Linux下网络编程与开发

如果想自己做一些相关的网络编程开发呢,比如实现一个客户端/服务器架构的应用,那么就可以采用linux下的socket编程了,如果想写一个数据包抓获和协议分析的程序呢,那么可以采用libpap等函数库了,如果想实现某个协议呢,那就可以参考相关的RFC文档,并通过socket编程来实现了。

这个可以参考相关的Linux socket编程等资料。

后记

本来积累了很多相关的技巧,但是因为时间关系,暂且不详述了,更多细节你可能能够从本blog中搜索到,或者直接到网络中找找。

到这里,整个《shell编程范例序列》算是很粗略地完成了,你可以从这里访问到这份范例序列的列表。不过“范例”却缺少实例,特别是这一节。因此,如果有时间我会逐步补充一些实例,并在sf.net上维护一份范例列表的。

如果有任何疑问和建议,欢迎在后面回帖交流。

参考资料

  • 计算机网络——自上而下的分析方法
  • Linux 网络体系结构(清华大学出版社出版)
  • Linux 系统故障诊断与排除 第13章 网络问题(人民邮电出版社)
  • 在Linux下用ADSL拨号上网
  • Linux下无线网络相关资料收集
  • Linux网桥的实现分析与使用
  • DHCP mini howto
  • 最佳的75个安全工具
  • 网络管理员必须掌握的知识
  • Linux上检测rootkit的两种工具: Rootkit Hunter和Chkrootkit
  • 数据包抓获与ip协议的简单分析(基于pcap库)
  • RFC
  • HTTP协议的C语言编程实现实例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # --------------------------------------------------------- 3 4 # Suppose I have a large number of jobs that need to be run, with 5 #+ any data that is to be treated in files of a given name pattern in a 6 #+ directory. There are several machines that access this directory, and 7 #+ I want to distribute the work over these different boxen. Then I 8 #+ usually nohup something like the following on every box: 9 10 while true 11 do 12 for n in .iso.* 13 do 14 [ "$n" = ".iso.opts" ] && continue 15 beta=${n#.iso.} 16 [ -r .Iso.$beta ] && continue 17 [ -r .lock.$beta ] && sleep 10 && continue 18 lockfile -r0 .lock.$beta || continue 19 echo -n "$beta: " `date` 20 run-isotherm $beta 21 date 22 ls -alF .Iso.$beta 23 [ -r .Iso.$beta ] && rm -f .lock.$beta 24 continue 2 25 done 26 break 27 done 28 29 # The details, in particular the sleep N, are particular to my 30 #+ application, but the general pattern is: 31 32 while true 33 do 34 for job in {pattern} 35 do 36 {job already done or running} && continue 37 {mark job as running, do job, mark job as done} 38 continue 2 39 done 40 break # Or something like `sleep 600' to avoid termination. 41 done 42 43 # This way the script will stop only when there are no more jobs to do 44 #+ (including jobs that were added during runtime). Through the use 45 #+ of appropriate lockfiles it can be run on several machines 46 #+ concurrently without duplication of calculations [which run a couple 47 #+ of hours in my case, so I really want to avoid this]. Also, as search 48 #+ always starts again from the beginning, one can encode priorities in 49 #+ the file names. Of course, one could also do this without `continue 2', 50 #+ but then one would have to actually check whether or not some job 51 #+ was done (so that we should immediately look for the next job) or not 52 #+ (in which case we terminate or sleep for a long time before checking 53 #+ for a new job).

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值