技术天地
T e c h n o l o g y W o r l d
基于Linux的网络通信模型的
设计与实现
王 鸽 刘钊远
西安邮电大学
【摘 要】随着 Linux 操作系统的广泛推广及应用,网络系统的安全也成为研究热点。网络系统安
全在很大程度上取决于管理者及其所采取的安全措施 , 系统管理员可以通过对防火墙的设置和检测 ,
从而达到加强网络安全的目的。为了提高多用户下服务器的通信效率,本文采用多进程并发模型,并
使用 socket 套接字来实现网络通信,同时通过对防火墙的设计在 Linux 下实现全程动态包过滤,提高
网络传输安全性,更好地发挥了 Linux 的实时性,并且保障了多用户/ 服务器之间的连接和数据传输
的可靠和稳定性。
【关键词】进程通信 多进程 并发模型
1 引言
L i n u x 操 作 系 统 具 有 高 效 、 稳 定 、 兼 容 性
好 等 特 点 , 可 以 运 行 在 多 种 硬 件 平 台 上 , 目 前
Linux在企业及工程中也广泛应用,基于它的实
时 性 和 稳 定 性 等 特点,被用在大型的视频会议
汇接系统中,支持大容量客户对服务器的实时会
议。基于Linux的防火墙在对网络安全的保障下主
要实现几个功能:一是在Linux下实现全程动态包
过滤功能,通过分析数据包的地址、协议、端口
对网络连接当前状态进行访问控制,从而提高系
统的性能和安全性。二是配备了日志记录系统和
查询工具,用于记录系统管理、系统访问及针对安
全策略的网络访问情况。三是制作防火墙过滤数据
库,并且管理员可以能动地对该数据库进行设置。
在Linux环境下开发安全并且高性能的网络通信程
序很好地发挥了Linux的网络特性。Socket套接
字提供了访问下层通信协议的系统调用,它是介
于应用层和传输层之间的编程接口[1]。本文主要
设计和实现三层C/S模式的网络通信功能,基于
Linux下的并发服务器设计克服了跨地域会议的
不便及与会成员数量受限等缺点。
2 网络通信的应用背景
2.1 电话会议汇接系统架构
由于Linux的稳定性和实时性等优点,目前
广泛应用于大型网络通信系统中。本文设计的模
式应用于企业版的电话会议汇接系统中,在不改
变用户平时打电话的习惯下接入该系统线路和通
信设备。如图1,当用户需要发起会议时,可使
用客户端安装的软件选择会议成员,通过打电话
的方式举行会议,同时可进行在线视频对话,支
持用户间传送文件和视频,发送短消息。NET服
务器负责将用户要传输的数据进行中转,属于中
转服务器,文件服务器、视频服务器等对文件及
2013 年 3 月 | 保密科学技术 |
33
技术天地
T e c h n o l o g y W o r l d
文件
服务器
传统电话网
汇接平台
NET服务器
INTERNET网
短消息
服务器
防火墙
图1 系统结构
视频进行存储。该系统结合了Linux的特性,实
现大容量客户间的会议及通信,充分发挥了实时
性的特点。
2.2 系统设计模型
本 文 通 过 对 电 话 会 议 系 统 原 理 的 理 解 , 来
实现客户端、NET服务器及文件服务器之间的通
信。采用Socket网络编程,并发式服务器的架构
来设计程序,通过TCP/IP协议来传输数据。NET
服务器后级增加防火墙,所有视频、音频和指令
数据全部走HTTP隧道来穿越防火墙,开放80端
口,对数据包加HTTP包头[2]。从系统的安全性考
虑,NET服务器选用具有强大的处理能力的双核
PowerPC嵌入式处理器,并带有多个高速网络接
口。对于内网来说,NET是服务器,来侦听和处
理客户端的请求;对于外网来说,NET充当客户
端角色,对文件服务器发送连接请求,即所谓的
三层C/S模式结构,如图2所示。
当 用 户1 想 对 用 户2 发 起 会 议 时 , 先 向NET
34 | 保密科学技术 | 2013 年 3 月
文件服务器
否
用户2是否在线
将传送给2的文件转发
是
NET服务器
用户1先向NET发送连接请求
通知有会议邀请
用户1想向用户2
发起会议邀请
用户2向NET
发送请求
图2 设计模型
服务器发送连接请求,成功后会向NET发送数据
包 , 包 括 目 的 客 户 信 息 等 。 此 时 ,NET 会 有 一
个在线成员列表来进行查找。如果用户2在线,
NET会对用户2发送信息告知它用户1的会议请
求,用户2同意则进行会议,同时可以在线发送
视频、文件等。若用户2不在线,这时NET会反
馈给用户1,用户1将要发给用户2的文件先发到
NET服务器,服务器则将文件转发到文件服务器
进行存储。当用户2再次上线后会对NET发送连
接请求,这时NET将用户2上线的信息发送给文
件服务器,文件服务器将NET转发的文件再次发
回到NET,再转发给用户2,这样就实现了三层
之间的基本数据传输。
2.3 网络通信模型实现
网络化的应用程序在开始任何通信之前都必
须要创建套接字。Socket可以看成在两个程序进
行 通 信 连 接 中 的 一 个 端 点 , 一 个 程 序 将 一 段 信
息写入Socket中,该Socket将这段信息发送给另
外 一 个Socket , 使 这 段 信 息 能 传 送 到 其 他 程 序
中。生成套接字主要有3个参数:通信的目的IP
地址、使用的传输层协议(TCP或UDP)和使用
的端口号[3]。通过将这3个参数结合起来,与一个
Socket绑定,应用层就可以和传输层通过套接字
接口,区分来自不同应用程序进程或网络连接的
技术天地
T e c h n o l o g y W o r l d
通信,实现数据传输的并发服务。具体创建流程
如图3所示。
3 通信协议
服务器
Socket()
Bind()
Listen()
Accept()
阻塞,等待客户连接请求
连接建立
服
务
请
求
服务响应
Recv()
处理服务请求
Send()
Close()
客户机
Socket()
Connect()
Send()
Recv()
Close()
图3 C/S模式创建流程
服务程序编写的基本步骤如下:
创 建 套 接 口 (socket 函 数 ) → 绑 定 套 接 口
(bind函数)→设置套接口为监听模式,进入被
动接受连接请求状态(listen函数)→接受请求,
建立连接(accept函数)→为每个客户创建子进
程fork()→读/写数据(recv/send函数)→
终止连接(close函数)。程序是通过将进程的创
建和启动置于循环中来实现的。
客户端程序编写步骤如下:
创建套接口(socket函数)→请求连接(connect
函数)→发送服务请求(send函数)→接受服务响
应(recv函数)→关闭连接(close函数)。
3.1 TCP/UDP服务流程
由上部分socket套接字类型,有两种Internet
应用程序服务:一种面向连接的TCP协议,另一
种面向无连接的UDP协议。
TCP在连接双方发送数据之前,都需要首先
建立一条连接。在建立连接的时候,客户端首先
向服务器申请打开某一个端口,然后服务器端发
回一个ACK报文通知客户端请求报文收到,客
户端收到确认报文以后再次发出确认报文来确认
刚才服务器端发出的确认报文,此时连接建立已
完成 [4]。这就叫做三次握手。如果再加上TCP的
超时重传机制,那么TCP就完全可以保证一个数
据包被送到目的地。TCP有一个特别的概念叫做
half-close,这个概念是说,TCP的连接是全双工
(可以同时发送和接收)连接,因此在关闭连接
的时候,必须关闭传和送两个方向上的连接[5]。
在UDP 模 式 下 , 客 户 程 序 没 有 把 套 接 字 固
定连接到一个指定的远程端点上,而是在每次发
送数据包时指定远程目的地。因而UDP具有相当
的灵活性,客户程序可以在它要求发送时才决定
和哪个服务器交互。UDP在传递数据时并不保
持发送端和接收端间的连接状态,即不对接收和
发送缓冲区、拥塞控制、数据到达顺序等参数进
行跟踪,因而UDP传送的数据包可能出错甚至丢
失,其可靠性无法得到保障[6]。尽管如此,UDP
在DNS解析、IP电话、实时视频会议、可存储的
音频视频流等应用程序中仍大受欢迎。其原因在
于:(1)相对于TCP,面向无连接的数据传送
不带时间延迟,速度自然要快;(2)UDP不对
发送端和接收端间的诸多参数进行跟踪,使得它
有能力支持更多的处于活动状态的客户,灵活性
强;(3)从数据段结构对比中可以发现,UDP
的数据包头部开销比TCP小得多;(4)由于没有
拥塞控制机制,UDP发送数据的速度仅仅受限于
应用程序产生数据的速度、源端的性能(CPU、
2013 年 3 月 | 保密科学技术 |
35
技术天地
T e c h n o l o g y W o r l d
时钟速度等)以及物理设备可以达到的带宽。
本设计采用TCP面向连接协议传输,以确保
数据可靠稳定传输。
3.2 数据传输
由于TCP协议是面向字节流的协议,并且每
一个子进程都要同时对多个描述符进行读写,子
进程之间还要进行频繁的数据传输,这样就会产
生数据的混乱,采用二次接收方式并在传输层和
应 用 层 之 间 加 入 安 全 服 务 层 的 方 式 实 现 网 络 数
据流的组织[7]。首先作为服务器接收客户端数据
时,对于每一个数据段进行两次接收,第一次接
收两个字节,这两个字节中保存了整个数据段的
长度,然后根据接收过来的数据计算出剩余字段
的总长度,进行二次接收[8]。发送数据时,将整
个数据段作为一个整体进行发送,这样,接收和
发送过程中保证了数据的完整性。长度字段对应
用层的数据进行了划分,对TCP的字节流能够有
效组织,也为进一步判定服务类型打下了基础。
协议包的格式如图4所示。
数据段
长度
源地址
(2字节)
(2字节)
(2字节)
(1字节)
(多字节)
目的
地址
服务
类型
服务
扩展
应用层数据
(小于1024
字节)
校验和
(2字节)
图4 TCP/IP数据包传输格式
整 个 协 议 包 格 式 类 似 于 隧 道 的 方 式 进 行 封
装 [9],对于应用层数据部分,可以根据不同的需求
进行不同级别的加密,实现通信数据的安全性。
源地址和目的地址分别表示报文的来源和目
的地,目的地可以是客户端或者内网服务器[10]。
服务类型字段表示客户端请求的服务类型,对于
不同种类的服务数据包,进行识别并处理,保障
了内部网络的安全,在安全服务层上实现了不同
36 | 保密科学技术 | 2013 年 3 月
服务的识别,提供服务的转换。0代表客户端之
间传送的数据,不需要经过内网服务器,根据目
的地址对该报文进行直接转发。
4 结语
通过大量的调试和对比,基于Linux的并发
服务器的设计提高了系统的实时性,在大容量客
户情况下,能确保数据可靠、稳定的传输,很好
地将Linux的特性和网络通信结合起来。
END
参考文献:
[1] [美]理查德·史蒂文斯,贝尔·芬纳,鲁道夫.UNIX网
络编程(第一卷套接口API)[M].杨继张,译.北京:
清华大学出版社, 2011.
[2] [美]理查德·史蒂文斯.UNIX网络编程(第二卷
进程间通信)[M].杨继张,译.北京:清华大学出版
社, 2009.
[3] 许小蕾,苏厚勤.分层系统Socket应用软件的设计
与实现[J].计算机应用与软件,2009,26(01):173-175.
[4] 葛福鸿,张丽萍.基于Socket技术的聊天软件设计
与实现[J].电脑编程技巧与维护,2012(05):55-57.
[5] 郭东升,田秀华. Linux环境下基于Socket的网络
通信[J].软件导刊,2009(01):116-118.
[6] 科默·史蒂文.TCP/IP客户—服务器编程与应
用[M].赵刚,林瑶,蒋慧,译.北京:清华大学出版社,
2004.
[7] 牛立华.浅析用Socket API实现的网络通信[J].
计算机时代,2002(08):192-194.
[8] 秦凯,戴曙光.利用VC++/C编程实现Windows
与Linux的网络通信[J].仪表技术,2009(02).33-37.
[9] 孙琼.嵌入式Linux应用程序详解[M].北京:人民
邮电出版社, 2006.
[10] 王丰锦,邵新宇.基于Socket和多线程的应用程
序间通信技术的研究[J].计算机应用,2000,20
(06):65-67.