P2P流量监控Web平台的设计与实现

摘要

P2P点对点传输的不断增长占用大量骨干网带宽,影响关键业务的正常运行。本文首先介绍了主要的P2P协议识别技术,讨论了改进思路。然后安装了一个基于iptables和l7filter的P2P流量监控节点,并用AJAX和PHP编写了一个Web监控平台以便通过Web管理监控节点、在图形界面中查看P2P流量日志,组成了一套P2P流量监控系统。

关键词 P2P,流量,监控,网络,l7filter

ABSTRACT

Fast growth of Peer-to-Peer traffic are taking more and more backbone network bandwidth, and may slow down key businesses. In this paper, major P2P identification techniques and a way to enhance them are introduced at first. Then we set up a P2P traffic detection router based on iptables and l7filter. A Web application is designed and implemented with AJAX and PHP, so that a network administrator can manage the router or view router logs in this Web application. The router and the Web application make up a P2P detection system.

GPA计算器

2月14日,我发现我的网站流量陡然上升;当时,我以为网站受攻击了,但没有发现什么异常。 第二天一看统计,大量用户从校内网和饮水思源BBS站访问了我2月3日制作的一个小工具——上海交通大学本科生GPA计算器

谷歌访问统计

我很早就知道GPA的概念——学积点的加权平均;GPA是评选奖学金、出国申请的依据。 我也很想知道自己的GPA,然而GPA的计算涉及所有学科的成绩,计算起来非常复杂,即使使用BBS上找到了几个GPA计算工具,也需要一个个输入成绩和学分。 2月3日,我在选课系统上查看成绩单的时候想到,能否读取成绩单、自动计算GPA呢? 由于计算GPA需要知道入学以来每个学期的全部成绩,而选课系统每页只有一个学期的成绩,我又想到了教务处网站上的“本科修业情况查询”功能。

查出自己的修业情况,然后看HTML源代码,写出XPath表达式,两小时不到,我就做出了一个方便的GPA计算器——在Firefox里,在修业情况上按下CTRL+U查看源代码、CTRL+C复制,然后到计算器页面CTRL+V粘贴,鼠标一点,GPA就算出来了。 接下来几天,又修改程序,放弃XPath、改用getElementsByTagName,使得程序能支持IE浏览器;还做了些搜索引擎优化。

我没有宣传这个工具,只是网站首页有一个链接。 在搜索引擎收录后,校内网、饮水思源BBS站出现了多个介绍此程序的帖子,出国板还把它列入了置底帖。 然后,就出现了访问量陡然上升的情况。

生日圆梦

2008年2月12日,我的21周岁生日。

早在一年多以前,我就有一个梦想——观看一场上海著名的《ERA-时空之旅》超级多媒体梦幻剧。 苦于上网不便、不了解订票途径,一直没能如愿。 前几天春节、拿到了一些压岁钱,在电视广告“秀一个上海给世界看”的鼓舞下,访问 http://www.era-shanghai.com/ 再用Windows Live Messenger与客服联系,总算在网上预定了座位,今天和爸爸妈妈一起去看戏了。

共和新路上的上海马戏城是《ERA-时空之旅》的固定演出地点;自2005年9月27日开演以来,已经连续演出了近千场。 据搜狐新闻,该演出先期设计制作成本为3000万元、每天演出的运营成本达到7万元。 原先,我对它的了解仅仅是2007年东方卫视除夕晚会出现的“时空飞车”这个节目录像、以及8位摩托勇士;一个月前,又在《新民晚报》上看到了“晃板踢碗”节目表演者妻子的文章。

我站在上海马戏城门外

高架一路畅通,提前一个多小时到达了上海马戏城。 去售票处一看,计算机屏幕上显示着我的姓名及预定的数量;报上姓名,付款取票。 由于时间还早,我们去附近超市走了一圈。

dbMySQL数据源访问类

dbMySQL类,用于PHP访问MySQL数据库,而编程更加方便、安全性更高。

<?php
class dbMySQL {//数据源访问类
	private $conn;//连接
	private $prefix;//表名前缀
	private $sql=NULL;//上一条SQL语句
	private $result=NULL;//结果
	private $rows=0;//行数
	private $rows_got=0;//已提取行数
	//$db=new dbMySQL(主机,用户名,密码,数据库名,表名前缀,是否永久连接);
	function __construct($host,$username,$password,$dbname,$prefix='',$pconnect=TRUE) {//连接
		$connect_function=$pconnect?'mysql_pconnect':'mysql_connect';
		$this->conn=@$connect_function($host,$username,$password) or die('不能连接到MySQL数据源服务');
		mysql_query("SET NAMES 'utf8'",$this->conn);
		@mysql_select_db($dbname,$this->conn) or die('MySQL数据源中数据库不存在');
		$this->prefix=$prefix;
	}
	private function close() {//如果上一个结果存在,清除它
		if ($this->result!=NULL) mysql_free_result($this->result);
	}
	public function execute_sql($SQL) {//执行
		//echo $SQL;
		$this->close();
		$this->sql=$SQL;
		mysql_query($SQL,$this->conn);
		$err=mysql_error($this->conn); if ($err!='') die($err);
		$this->result=NULL;
		$this->rows=mysql_affected_rows($this->conn);
		$this->rows_got=0;
	}
	public function execute($SQL,$p=NULL,$prefix='###') {//带参数执行
		$s=str_replace($prefix,$this->prefix,$SQL);
		if ($p==NULL) { $this->execute_sql($s); return; }
		foreach ($p as $i => $v) {
			if (ctype_digit($i{0}) && !is_numeric($v)) die('SQL数值型参数错误 '.$i.'=>'.$v);
			$vv=ctype_lower($i{0})?"'".mysql_escape_string($v)."'":$v;
			$s=str_replace('?'.$i,$vv,$s);
		}
		$this->execute_sql($s);
	}
	//带参数执行、查询说明
	//数组$p "a"->"ppp"
	//SELECT * FROM j WHERE m=?a 解析为 SELECT * FROM j WHERE m='ppp'ִ
	//参数名称第一位是小写字母,作为字符型参数,编码并加单引号
	//参数名称第一位是数字,作为数字型参数,如果不是数字就出错
	//参数名称第一位是其他情况,直接带入SQL表达式
	//$prefix表示前缀占位符,默认###,FROM ###kk在前缀是pr_时解析为FROM pr_kk
	public function query_sql($SQL) {//查询
		//echo $SQL;
		$this->close();
		$this->sql=$SQL;
		$this->result=mysql_query($SQL,$this->conn);
		$err=mysql_error($this->conn); if ($err!='') die($err);
		$this->rows=mysql_num_rows($this->result);
		$this->rows_got=0;
	}
	public function query($SQL,$p=NULL,$prefix='###') {//带参数查询
		$s=str_replace($prefix,$this->prefix,$SQL);
		if ($p==NULL) { $this->query_sql($s); return; }
		foreach ($p as $i => $v) {
			if (ctype_digit($i{0}) && !is_numeric($v)) die('SQL数值型参数错误 '.$i.'=>'.$v);
			$vv=ctype_lower($i{0})?"'".mysql_escape_string($v)."'":$v;
			$s=str_replace('?'.$i,$vv,$s);
		}
		$this->query_sql($s);
	}
	public function read() {//提取一行为关联数组,如果已提取完则返回NULL
		if ($this->result==NULL) return NULL;
		if ($this->rows_got==$this->rows) return NULL;
		++$this->rows_got;
		return mysql_fetch_assoc($this->result);
	}
	public function num_rows() {//总行数
		return $this->rows;
	}
	public function eof() {//是否提取完了?
		return ($this->rows_got==$this->rows);
	}
}
?>

dbMySQL优点

  • 高安全性:强制检查类型、自动转义,避免SQL注入漏洞
  • 方便编程:面向对象语法,不必写mysql_fetch_assoc等长长的函数名
  • 方便编程:仿reader机制,直接从对象读出数据,不必再写$resultID
  • 支持表名前缀:允许在一个数据库中运行多个应用

dbMySQL样例代码

超声波水下扩频通信系统的设计

一、认识超声波

声音是一种压力波:介质分子有规律的振动,使周围的介质产生疏密变化,这就产生了声波。声音作为波的一种,可以通过傅立叶变换分解为不同频率不同强度正弦波的叠加。人耳可以听到的声音的频率范围是20Hz~20kHz,高于这个范围的波动称为超声波。通常认为,超声波的频率范围是20kHz~500kHz。狗和蝙蝠等动物可以听到高达160kHz的声音,因此超声波只是对人而言。

超声波的传播速度与在相同介质中普通声波的传播速度相同:0℃海平面的空气中是332m/s,水中是1450m/s,铁中是5000m/s。介质密度愈大,音速愈快。在空气中,音速会依空气之状态(如湿度、温度、密度)不同而有不同数值,如一万米高空之音速约为295m/s,每升高1℃音速增加0.607m/s。

超声波在介质中传播时,由于超声波与介质的相互作用,会产生以下四种效应:机械效应、空化作用、热效应、化学效应。

超声波的特点:传播方向性强、能量易于集中;能在各种不同介质中传播、可传播足够远的距离;与介质的相互作用适中、易于携带有关介质状态的信息。

从架构师的角度对blog管理系统项目的研发报告

关键字:软件工程,校内网,博客,blog,ASP.NET 3.5,LINQ,XML,ATOM

摘要:以下是本人2007年12月在《软件工程》课程中开发“blog管理系统"项目的研发报告,主要阐述了这个软件的设计过程以及用ASP.NET 3.5实现的部分细节。

小组成员——项目经理:蒋彦;架构设计师:石君霄;业务分析员:熊帆,严栋孜;程序员:张篪,张臣,孙俊卿,王成超,孙斌,陆黎青;测试员:罗慧骏,袁文俊。 本人任务:架构师

由于本人长期从事信息系统开发,经验丰富,因此全组一致推举我担当架构师一职,且完成了不少编程工作。由于工期紧张,这个程序并不符合yoursunny的质量标准,因此我放弃了署名权,且程序代码进入Public Domain、不受版权保护。

一、 需求分析

我的环保主义

环保这个话题,已经讨论了很多次。节约水电、收集废电池、不乱扔垃圾……但是,讨论后,有没有落到实处呢?据我看,没有。只讲空话、光说不做没有用,保护我们的地球,要从自己做起、从小事做起。

投票评出的浪费现象,改正了吗?

让我来回顾一下2007年4 、5月间,生活园区团工委 举办的"让节约走进生活"——创建节约型校园活动 。当时进行了一次网上投票,让网友投票评选自己认为最严重的校园浪费现象,评出了十大浪费现象。这些浪费现象现在还存在吗?

1. 学生活动好,传单满天飞

有所好转,现在很多学生活动,已经减少了传单的发放数量,而改为使用几张展板设摊。漫无目标的在街上散发传单,对活动的宣传效果有限;设摊,并使用音响宣传,效果更好。

.Net介绍 & Visual Studio 2008 下载地址

.Net Framework是微软主导设计的一个开发框架,它是COM的继承者。最新版本为3.5,而2.0和3.0版本已经通过自动更新安装在每一台 WinXP/2003机器上。微软的.Net Framework不是开源的,可以在WindowsNT和FreeBSD系统上安装;.Net Framework的一个开源实现是mono-project,可以在LINUX和Windows等系统上安装;这两种实现是几乎完全兼容的。

.Net是一个开放的框架,编程语言只需兼容CLS(Common Language Specification),即可用于.Net。其编译程序只有“前端”,即翻译成一种中间语言,这种中间语言是MSIL;而“后端”就是由安装在每一台机器上的Framework在运行时完成的,称为JIT(Just In Time)编译。.Net语言有C#、VB.NET、C++.NET、JScript.NET、MSIL汇编等,超过20种;程序员可以选择任何一款自己喜欢的语言进行开发,而无需担忧开发结果的兼容性——因为编译后都变成了MSIL这种中间语言;其中C#是为.Net度身定做的,如果你是初学者建议学习C#,此外VB.NET也是一种常用的语言。

Visual Studio 2008是.Net Framework 3.5的一个集成开发环境,这个开发环境由微软发布;.Net是一个开放的框架,因此也存在其他的集成开发环境;你甚至可以只安装Framework,而不安装任何集成开发环境。官方介绍与下载页面 http://msdn2.microsoft.com/en-us/vstudio/default.aspx。VS2008有多个版本,其中免费的精简版本称为Express版本。【原来这里有一个本地下载链接,由于有人使用迅雷下载,盗链严重,现已删除;请珍爱网络,远离迅雷!】

使用SelfSSL创建自签名的IIS证书

微软IIS 6.0 Resource Kit中的小工具SelfSSL可以创建自签名的IIS证书,用于测试目的。 所谓“自签名”,就是指该证书本身是一个根CA证书,同时又能作为服务器证书。 当然,这个根CA证书是默认不受信任的,所以只能用于测试,不能用于实际的公开站点。

步骤:

  1. 下载SelfSSL.exe,然后在Administrator下打开

    Microsoft SelfSSL Version 1.0, Do you want to replace the SSL settings for site 1 (Y/N)?

    对问题回答y并按回车,就会为IIS的默认Web站点创建一个自签名的证书

  2. 然后要在IIS里操作:右击Websites下的Default Web Site,选Properties,在Directory Security选项卡点击Server Certificate,然后按提示,指派一个现有证书

    IIS Certificate Wizard, Assign an existing certificate

  3. 选择刚才创建的证书

    IIS Certificate Wizard, Select a certificate

  4. 双击证书,可以查看证书内容,可以看到不受信任:

    Certificate Information

  5. 下一步选择HTTPS的端口,默认端口是443。

  6. 尝试用IE访问一下:

    Security Alert

    警告根证书不受信任(用在公开站点,给用户感觉就是“网站不安全”),点Yes

  7. 成功打开https协议的网站(注意状态栏的锁),我们成功了!

    website with padlock

注意:因为SSL加密的内容包含域名,所以无法在相同IP地址、相同端口,用域名区分开设多个SSL站点;这一点在IIS的帮助文档里写得很清楚。