HTTP

2024-10-20

HTTP(共10篇)

HTTP 篇1

摘要:HTTP Basic Authentication是HTTP中一种常用的认证方式, 这种认证方式是以用户名和口令为基础的, 这种场景的特点是客户端每次访问应用时, 都在请求头部携带认证信息, 一般就是用户名和密码, 因为basic认证会传递明文。所以最好使用HTTPs传输数据。

一、HTTP Basic Authentication定义

HTTP Basic认证是通过HTTP协议中的Authorization头来传递认证相关信息的, 而其中的Basic认证就是其中一种认证, basic认证要求认证的用户名和口令对, 也就是例如这样的形式:myuser:mypassword这样的信息对 (myuser为用户名, mypassword为密码) , 而且用户名和口令对要放在HTTP的头域中传输。

二、HTTP Basic优点

1、HTTP是无状态的, 即使来自同一个客户端, 对同一个realm内资源的每一个访问还是会被要求进行认证。

2、客户端会缓存用户名和密码, 并和认证域 (authentication realm) 一起保存。所以, 如果对同一个域 (realm) 的其它资源进行访问, 不需要你重新输入用户名和密码。

3、登录信息会和认证域以及服务器名一起存储, 所以可以很好地和其他登录信息区分开来。

4、所有流行的网页浏览器都支持基本认证。

三、HTTP Basic编码实例

HTTPbasic执行过程:

1、我们先将用户名和密码拼接成一个字符串, 两者之间使用":"分隔。

2、然后使用commons-codec的Base64将这个字符串加密。在进行basic认证的时候Spring Security会使用commons-codec把这段字符串反转成用户名和密码, 再进行认证操作。

3、下一步为加密后得到的字符串添加一个前缀"Basic", 这样Spring Security就可以通过这个判断客户端是否使用了basic认证。

四、HTTPbasic应用

HTTP基本认证是最简单也是曾经使用过很长时间的一种认证方式。基本认证要求为每一个保护域 (realm) 提供一个用户名和密码进行认证。

1、客户端浏览器访问一个受HTTP基本认证保护的资源。

2、服务器返回401 (authentication required) 状态, 要求客户端提供用户名和密码进行认证。Response Header里面有一个属性WWW-Authenticate, 它的值比如:Basic realm="Restlet tutorial"。

3、客户端弹出一个窗口, 用于输入用户名和密码 (基本上所有的浏览器都提供对基本认证的支持, 它们都内建了一个用户名密码输入窗口) 。

4、输入用户名密码并确认之后, 客户端把%username%:%password%用Base64进行编码后通过Request Header:Authorization传送给服务器, 所以可以看到HTTP基本认证是明文传输, 安全风险很大。比如Authorization:Basic xxxxxxxxxx.

5、如果认证成功, 则返回相应的资源。如果认证失败, 则重新进行认证。

参考文献

[1]肖德琴.电子商务安全.高等教育出版社, 2009

[2]邱卫东.密码协议基础, 高等教育出版社, 2008

HTTP 篇2

懂得开车,就应懂用车。然而,有懒惰的车主甚至许久才会洗一次车,当好不容易把爱车拿去维修厂或4S店做一次保养时,底盘、轮胎、刹车系统等项目往往是重点检查项目。在日常的“三油(机油、变速箱油、刹车油)、三水(水箱冷却水、电瓶水及雨刮水)”的保养中,记者发现,不少粗心的车主(特别是新手司机)最容易忽视对前挡风玻璃的关注。

你是否忽视了爱车的“透明”性

近日,记者与一位朋友驾车同行时,这位朋友在行车过程中,想用玻璃水清洗一下灰尘密布和有虫尸的前挡风玻璃,结果按了半天雨刮器喷水按钮,才突然想起忘记添加玻璃水,于是只好一路“视线模糊”的行驶在路上。相信很多的车主都会有这样的经历和体会,特别是行车时如果看见挡风玻璃上沾染污物或虫尸,视觉立刻就会感到不舒服。广州本田一位4S店的维修技师黄师傅告诉记者,添加“玻璃水”是80%车主在日常保养中最容易忽视的细节,前挡风玻璃的保养更往往被车主遗忘。

那么,所谓玻璃水是什么?汽车挡风玻璃水俗称玻璃水(即车窗玻璃清洗液、雨刮水),是保养爱车最大的消耗品之一。一般来说,我国用品零售市场上的玻璃水可分三种:一种夏季常用的,在清洗液里增加了除虫胶成分,可以快速清除撞在挡风玻璃上的飞虫残留物;一种专为冬季使用的防冻型玻璃清洗液,保证在外界气温低于零下20℃时,依旧不会结冰冻坏汽车设施;一种是特效防冻型,保证在零下40℃时依旧不结冰,适合我国最北部的严寒地区使用。在广州这种南方地区,使用第一种玻璃水即可。

当您感觉车的前挡风玻璃透明度差了,这时候喷一喷玻璃水,就能够给你一个“明朗”的视野。特别是在夜间行车时,玻璃灰尘会散射光线,这时候就需要喷一喷玻璃水,让前挡风玻璃保持在最佳透明状态。此外,在灰尘较多的环境,以及在雨天跑高速路时,玻璃水的消耗会非常快。

玻璃水其实不简单

有的车主认为清洗前挡风玻璃其实很简单,用不着小题大做。师傅介绍,有车主会放弃购买一瓶10~20元左右的专用玻璃水,选择“偏方”——自制的玻璃水。他们将洗洁精、洗涤剂、洗衣粉等兑一点水来替代专用玻璃水,认为又便宜又省心;也有的车主直接用清水替代玻璃水。黄师傅指出这些做法存在着一定的隐患。

用水兑洗衣粉:洗衣粉水里会有一些沉淀物,时间长了,不仅会腐蚀橡胶管,而且会堵塞喷水口,严重情况下会损坏到电机。一般洗涤剂都呈碱性,对橡胶会有一定的腐蚀性,会加速催化雨刮器胶条的硬化,硬化的胶条刮擦挡风玻璃时,会加速挡风玻璃表面被刮毛、刮花。如果重新更换雨刮器,付出的费用将是玻璃水的几十倍价格。

用水代替玻璃水:这个风险相对小一些。但需要留意的是,普通的自来水同样含有较多杂质,时间长了,杂质会依附在橡胶管内,影响正常的喷水。长期使用可能会使玻璃表面与雨刮器之间摩擦力加大,玻璃产生划痕。师傅表示,清水只能简单地清洗灰尘,对车窗上附着的脏污、虫尸,并没有彻底清洗的能力。

小贴士

DIY加玻璃水并不难

为爱车添加玻璃水,最省事的办法是委托洗车店或者维修厂帮忙添加。算一下账,让美容店加一次约10元左右,所支付的费用肯定比自己买一瓶玻璃水DIY添加来得贵些。黄师傅告诉记者,如果专门为添加玻璃水而跑一趟4S店或者美容店其实不值得,添加玻璃水的活儿,车主完全可以DIY自行解决。车主只需去市场上用10~20元购买一瓶车用玻璃水,按照指示加入即可,并没有太多“技术含量”。

提示1:第一步要稀释。

一般购买回来的玻璃水均需要稀释使用,只需按照说明书上的指示操作即可。

提示2:注意玻璃水容量。

汽车的玻璃水容量大约是1.5L左右,因此选择稀释玻璃水的容器用1.25L到1.5L的就可以了。可以用矿泉水瓶替代。

提示3:不要加太满。

自己添加玻璃水的时候,要注意不要加过满,如果容器口有一些泡沫,不需担心,并不影响使用。

提示4:玻璃水也有冬夏之分。

一般来说,在南方地区使用增加了除虫胶成分的玻璃水即可。如果爱车需要在北方过冬,则需要使用防冻型玻璃水。这一点,习惯了南方气候的司机去到北方时常会忽略。

汽车用玻璃水是什么成分的?看论坛中有几种配方,成分也就是防冻液+清洁剂+水+酒精等:

1、取大可了瓶一个。

2、家中没人爱喝的白酒(高中低度均可,五粮液、茅台更好)。

3、质量好点的餐洗净(不伤手的那种,连手都不伤,就不怕腐蚀车了,市场的玻璃清洁剂就怕这点不过关)

4、纯净水

5、一滴蓝墨水,着色用,可省。步骤

1、将白酒半瓶到入可了瓶。

2、加半勺餐洗净

3、加入纯净水,不要太满。

4、摇均匀即可。实验

本品放入冰箱内-20度,两小时左右,略有结冰现象。使用

1、在-10度左右,夜晚室外停放15小时,没有冻。

2、洗玻璃时由于有酒精,挥发的很快。洗后风挡玻璃非常干净,还有一种餐洗净的香味和淡淡的酒香。

3、如果酒后驾车被查,冲JC喷一下,说不定可蒙混过关!!

特别要注意的是乙醇(酒精)的加量并非越多越好。大家可参考《中学教师化学手册》上的这个比例,结合当地的最低气温来配置。

乙醇添加量

溶液冰点

6%

-2.0℃ 14%

-5.0℃

17%

-6.1℃

20.2%

-7.5℃,24.8%

-10.6℃

27%

-12.2℃

注意:本文所提到的百分比浓度全部为体积分数浓度。

附 搜罗的一些配方,给同学门参考:

购买普通玻璃水,效果达不到标准,还可能会造成喷头堵塞。买高级的,花费会较高。综上,我认为DIY玻璃水,可以让我们得到实惠!并且效果也可以很好!A:春天,风沙大,雨多,所以玻璃水主要功效就是清洁风挡。准备2.5升可乐瓶一个,一定要冲洗干净!(关键是去掉糖分!)

纯净水2升,医用95%酒精250ML(药店有售)洗涤剂1-2可乐瓶盖(洗涤剂质量要好)充分互溶后可直接使用。加洗涤剂主要是去沙土,应为洗涤剂的泡沫能很快的将泥土去掉。酒精能加速水分蒸发,使玻璃迅速清洁。加入以上这些,可能不满,可直接加1升左右纯净水。

B:夏天,秋天。有雨,不一定很脏,但是昆虫多打在风当时,清水不容易将其清除,因为虫胶也比较难处理。所以要加入更多的溶剂。

同样,2.5升可乐瓶,2升纯净水,95%医用酒精500ML,洗涤剂1瓶盖足矣!酒精这种有机溶剂还是很不错的!去虫胶的效果很好。要是在市区,可以将不满的水壶加纯净水加满,但是高速不建议降低浓度,影响效果!

HTTP 篇3

2 系统实现

2.1 接口动态加载

为方便动态加载接口逻辑,每个接口都使用独立类实现,通过Java注解和反射机制实现动态加载。注解定义如下,用于描述接口信息:

@Retention(RetentionPolicy.RUNTIME)

public @interface InterfaceConfig{

public String name(); // 接口名称

public int size() default 0; // 接口最大并发数

public long timeOut() default 30*1000;} // 接口执行超时时间

这里通过注解描述了接口名称、最大并发数、超时时间等,然后通过Java的反射机制动态加载接口信息。代码片断如下:

ConcurrentHashMap> configMap=newConcurrentHashMap>();

Set> classes = PackageUtilAdv.getClasses(CLASS_PATH);// 获取CLASS_PATH下所有类文件

for(Class clazz : classes) {

if(clazz.isAnnotationPresent(InterfaceConfig.class)) {// 获取接口类对应的注解信息

Annotation annotation = clazz.getAnnotation(InterfaceConfig. class);

InterfaceConfig descr = (InterfaceConfig)annotation;

Mapprop=new HashMap();

int concurrentSize = descr.size();

prop.put("InterfaceConfig", descr);

prop.put("interfaceClass", clazz);

configMap.put(descr.name(), prop);}}

2.2 接口调用过程

当用户端请求到达接口代理时,由代理类调用实际的接口逻辑并返回结果,代码如下:

private JSONObject invokeProcess(Map map, String interfaceName, HttpServletRequest request, HttpServletResponse response) throws Exception {// 接口对应实际的Class

Class clazz = (Class) map.get("interfaceClass");

Object obj = objectMap.get(interfaceName);

if (obj == null) {

obj = clazz.newInstance();

objectMap.put(interfaceName, obj);}

// 调用接口实现的doProcess方法执行接口逻辑

Method m=clazz.getMethod("doProcess",newClass[]{HttpServletRequest.class, HttpServletResponse.class});

JSONObject data = (JSONObject) m.invoke(obj, new Object[]{request, response});

return data;}

3 性能测试

在Linux下部署并测试程序,监听8090端口,如图3.1所示。

HTTP 篇4

在某个B/S系统中通过页面上报用户名、电话等数据,现有一个Excel文件,含有大量用户数据,系统没有提供批量录入的功能,也不能直接上传Excel文件,一条条的录入费时费力,体现不出信息系统的优势。

解决批量录入的方法有两个:一是在系统中增加批量录入功能;二是在客户端利用现有的录入功能实现批量录入。如果系统是自己开发的,则可以用方法一实现,而该B/S系统非自己开发,因此考虑用方法二实现。

用户通过网页和服务器进行交互的过程是通过HTTP协议进行的,因此可以利用Socket编程模拟HTTP会话过程,在程序中重复提交数据的过程就可以实现批量上传。模拟HTTP会话过程的关键是保持会话,即在数据包头部附带相应的Cookie。在登录过程中,服务器会返回一系列的Cookie值,保存这些Cookie值,在提交数据时,需要用到这些Cookie值。

软件采用C#实现,先抓取用户通过网页和服务器交互的所有数据包,分析交互过程中的数据包,将数据包分为两个部分,一是登录过程的数据包,二是上传数据的数据包。然后利用Socket模拟HTTP会话过程:和服务器建立连接,依次发送数据包,接收服务器的响应,依据响应进行相应的处理。下面将介绍具体的实现过程,注意处理好Cookie和用户数据。

2 分析HTTP会话数据包

分析HTTP会话数据包生成两个文件,packets.txt和packets Index.txt(与程序中用到的文件名一致),在程序中作为模拟HTTP会话过程的基本数据。

通过Wireshark抓包软件抓取用户在网页操作过程中的所有数据包,以txt格式存储数据包(packets.txt)。Wireshark抓包的配置如图1所示,在Interface后选择合适的网卡;在Capture Filter中选择HTTP,点击start就可以开始抓包,然后打开登录页面登录服务器,打开上传数据页面,上传数据,操作完毕后停止抓包,将抓到的数据包存为packets.txt。

在Wireshark中可以直接查看数据包中的ASCII字符,每个数据包头部都是ASCII字符,可以根据头部内容确定每个数据包的作用:客户端的请求,获取页面、图片、样式、脚本等;客户端提交数据;服务器端的响应,是否含有Cookie等。在模拟HTTP会话的过程中,可以不考虑实际数据包中的图片、样式、脚本等文件的处理,以提高程序性能。分析剩下的数据包,形成一个索引文件packets Index.txt,将客户端和服务器的每次交互过程(即一次请求响应过程)中的数据包序号、Cookie、服务器响应结束标志等作为一个数据块存储,文件的格式如图2所示。第一行为块编号,从1开始编号;第二行为本次HTTP请求中发送数据包在packets.txt中的序号,多个则以逗号分隔;第三行开始为本次HTTP请求中返回的Cookie,以逗号分隔;第四行是本次接收数据的结束标记;第五行为空行,块结束。

3 编程实现

3.1 定义结构体

首先定义结构体Block State、my Const Struct、my Const,其中Block State对应索引文件中的一个数据块,my Const Struct对应常量处理中用到的数据,my Const将所有常量集中在一起。

3.2 定义类成员

3.3 初始化数据

3.4 登录过程

3.5 批量提交数据

3.6 函数one Block Http

4 结语

用Socket模拟HTTP会话,利用已有的页面提交功能实现了数据的批量提交,该方法具有通用性,在应用到其他需要批量提交的系统时,只需依据具体HTTP会话过程分析生成packets.txt和packets Index.txt两个文件就可以。

摘要:基于B/S系统上传数据的功能,用Socket模拟HTTP会话过程,批量处理上传数据。

关键词:Socket,模拟HTTP会话,批量处理法

参考文献

[1]马骏.C#网络应用编程.人民邮电出版社,2010.

常见的HTTP状态以及含义 篇5

当网站出现问题的时候,页面就会自动反馈HTTP状态,作为网站的优化人员,我们必须了解这些状态的含义,还要学会应对这些。常见的HTTP状态包括200、404、301、302以及500等,为了大家能更了解HTTP的状态以及含义,宜昌百慕达网络科技的工作人员给我们做了简单的介绍。

200 :页面正常访问时的返回HTTP状态。当一个页面返回200状态码时,则表示告诉浏览器或者搜索引擎,该页面是可以正常到达的。

404 :页面找不到时,返回的HTTP状态。SEO处理中如果想自定义404页面,需要做到的是确保访问错误页时返回状态为404,这样搜索引擎才知道,这个页面是找不到了。而通常很多站长朋友们之所以对文章开头提到的认为“404页面自动跳转到首页会有问题”,原因通常是因为404页面跳转时设置不当,返回了200状态码又没有发现,结果搜索引擎抓取错误页时看到的是200状态,就认定网站上出现了大量的与首页相同页面,这种情况,被降权是显然的了。有些站长图省事,直接在IDC提供的虚拟主机后台设置404页面,并在页面上放置了类似或者js方式的windwo.location跳转,结果是返回200状态。

301 :页面永久重定向时返回的HTTP状态。目前公认的最正确的跳转方法,并且可以起到权重传递作用。一般在程序作跳转时先发送301状态即可。如PHP中发送:header(“HTTP/1.1 301 Moved Permanently”);ASP中发送Response.Status=“301 Moved Permanently”

302 :页面临时跳转时返回的状态。现在普遍认为使用302跳转容易被搜索引擎视为作弊,据传是早期302跳转被滥用而留下的后遗症。落叶不能算很老的站长,没见过被滥用啥样子,不过呢,302跳转更多的是作为功能性跳转,基本目前的每一个网站程序中都会用到,如添加一篇文章,自动跳转回列表页;操作成功/失败提示自动跳转等。ASP中的response.redirect跳转,PHP中的普通header跳转返回的都是302状态。这些跳转,一般是在网站后台操作时的功能性跳转,不会对SEO产生影响。但如果作为前台页面跳转,那就值得斟酌了。

500 :页面代码出错时返回的状态。通常站长朋友们经常遇到标题中提示“内部服务器错误”,其实这种情况大多数是因为访问的网站或者页面ASP或者PHP等出现代码错误,如语法错误、数据库连接错误等,而恰好服务器环境关闭了出错信息的输出提示,所以在出错时,站长看到的就是500状态的“内部服务器错误”。很多朋友在遇到这个问题时,搜索一翻,发现好多很专业的很专业的不知所云的文章,说了一大堆啥问题啥问题,而实际结果发现,就是PHP文件某行代码少了个分号。

HTTP 篇6

关键词:安卓,手机移动客户端,套路,HTTP通信,HttpClient文档

1 应用概述

随着移动网络基础设施的建设, 手机不可否认地逐渐成为重要的信息载体。不仅如此, 随着智能手机在性能和系统功能方面的不断提升和完善, 其在信息平台中的地位逐步赶超桌面系统。对于手机平台, 信息采集能力和互联网连接能力正是其优势及发展趋势之所在, 对于当前主流的手机平台:安卓和IOS, 一方面, 其采集信息的手段方便快捷; 另一方面, 手机的网络连接能力也随着基础设施的建设和升级变得越来越强大。

而实际上, 手机移动客户端的业务框架是在已有业务框架 (B/S) 上的扩展, 其主要扩展了移动设备通过无线网络接入互联网的环节。其常见应用的业务如图1所示。

图1中, 手机移动客户端通过无线网络接入互联网, 进而实现与服务端的通信。文中的手机移动客户端APP以安卓实机 (安卓2.3.6) 为验证环境; 服务端以Tomcat 6为应用程序服务器, 采用J2EE+Spring MVC 3.0框架。其界面如图2所示。

2 关键技术及技巧

作为B/S架构应用的扩展, 手机移动客户端也通过HTTP与服务端进行通信, 按照数据流向可分为: 推送 (POST) 和获取 (GET)。也就是说, 对于手机移动客户端, 需要自行实现桌面浏览器的信息推送和获取功能。

移动客户端所推送或获取的内容主要分为两种: 文本和文件。但无论是文本还是文件, 都必须按照HTTP的规范进行编码, 即HTTP实体。在HTTP客户端通信方面, 安卓平台引入了Apache HttpClient包, 并在其基础上进行了扩展。表1是几种常见的HTTP实体类型, 完整说明请查阅安卓开发平台关于HttpClient的文档。

手机移动客户端通信要做的内容可以归纳为三步: 第一步, 将推送内容或请求参数按照适用的HTTP实体进行编码;第二步, 执行HTTP Client的方法将HTTP实体内容传送给服务端; 第三步, 从服务端返回的实体中获取执行结果。

而服务端要做的内容也可以归纳为三步: 第一步, 从请求实体中获取参数; 第二步, 执行相关操作; 第三步, 将执行结果按HTTP实体编码并回应给客户端。

2.1 信息推送

在HTTP客户端, 对于文本内容, 以URL编码形式实体进行编码; 对于文件内容, 则需以多部分实体进行编码。两者都可采用HttpClient的推送 (POST) 方法。

在服务端, 以Controller的形式提供接口, 用于分解客户端传入的实体内容, 并拼凑成SQL语句, 通过JDBC将数据内容插入 (创建记录主体时是插入) 或更新 (上传文件是更新列) 到后台数据库, 最后根据执行结果 (成功与否) 以字符串实体 (内容采用JSON编码) 的形式回应给客户端。图3是移动客户端向服务端进行信息推送的交互示意图。

2.2 信息获取

在HTTP客户端, 内容请求参数的推送都以URL编码形式实体进行编码; 对于获取内容, 文本内容将按照字符串实体解码, 文件内容将按照多部分实体解码。发送内容请求也采用推送方法。

在服务端, 以Controller的形式提供接口, 用于分解出客户端的实体内容, 调用预编译SQL语句 (语句块标识及参数通过客户端传入) 或拼凑成SQL语句 (对于文件下载), 通过JDBC将数据内容从后台数据库中取出来, 并将结果以字符串实体 (对于结果集) 或多部分实体 (BLOB字段) 的形式回应给客户端。图4是移动客户端从服务端进行信息获取的交互示意图。

2.3 通信设置

通信设置主要包括服务器IP和服务端口, 为了做到方便灵活, 可以考虑使用首选项Activity (PreferenceActivity) 来实现对通信选项的设置。其界面如图5所示。

3 服务端接口设计

3.1 信息推送接口

按照推送内容可分为两种: 文本信息 (“键-值对”) 和文件的上传。

3.1.1 文本推送接口 (model/ins.do)

文本推送接口包含3个参数, 如表2所示。

通过表2可以看出, 通过上述3个参数, 即可拼凑出SQL的插入语句 (INSERT), 以实现往数据表中插入记录。

3.1.2 文件推送 (上传) 接口 (util/upload.do)

文件推送 (上传) 接口包含5个参数, 如表3所示。

通过表3可以看出, 通过上述5个参数, 即可拼凑出SQL的更新语 句 (UPDATE), 以实现往数据 表BLOB列中插入文件内容块。

3.2 信息获取接口

按照获取内容可分为两种: 文本信息 (JSON数组或JSON对象) 和文件的下载。

3.2.1 文本获取接口 (engine/dataset.do)

文本获取接口包含6个参数, 如表4所示。

表4中参数“ds_id”为数据集标识, 其内容是一段带有参数的SQL选择语句 (SELECT), 通过传入的参数来生成完整的SQL语句, 服务端通过执行该SQL语句来获取结果集并以JSON格式返回。

3.2.2 文件获取 (下载) 接口 (util/download.do)

文件获取 (下载) 接口包含4个参数, 如表5所示。

通过表5可以看出, 通过上述4个参数, 即可拼凑出SQL的选择语句 (SELECT), 以从BLOB列中读取文件二进制流内容。

4 功能实现

4.1 文本内容的推送

4.1.1手机移动客户端

手机移动客户端通过HttpClient的推送方法 (Post) 即可实现文本内容的推送, 如代码1所示。

代码1中, 先将参数按URL编码形式实体 (UrlEncodedFormEntity) 进行编码 , 再通过POST方法发送HTTP请求 ,进而读取服务端回应实体内容 (其以JSON格式编码)。

需要注意的是, 移动客户端采用的字符编码为utf-8, 服务端要与其一致 (下同)。

4.1.2 服务端

服务端通过request对象获取客户端传入的参数 (实体内容分解的工作已经由J2EE框架完成), 然后拼凑成插入的SQL语句, 通过JDBC执行该SQL语句, 并以JSON格式回应执行结果 (JSON字符串进行实体的编码也由J2EE框架完成)。代码2是服务端进行文本内容推送的接口定义。

需要注意的是, Tomcat应用程序服务器默认的字符编码不是utf-8, 为了使其与客户端一致, 则需要在对配置文件server.xml中的“Connector”标签添 加属性“URIEncoding” ,并其值为utf-8。

代码2中, 如果推送成功, 服务端返回的内容是 {result:"success"}; 如果推送失败, 返回的内容则是 {result:" <错误消息>"}。

4.2 文件上传

4.2.1 手机移动客户端

相比文件内容的上传, 文件上传的主要差异在于对推送内容的编码: 移动客户端需要使用多部分实体 (MultipartEntity) 将文本内容和文件流进行混合编码。代码3是移动客户端上传文件的关键代码。

代码3中, 先将参数按照多部分实体 (MultipartEntity)进行编码, 再通过POST方法发送HTTP请求, 进而读取服务端回应 (以JSON格式编码)。

4.2.2 服务端

服务端通过request对象获取客户端传入的内容, 根据边界字符串分解出各部分的内容, 并自行建立一个“变量名-变量值”的哈希表; 再根据参数值拼凑成更新BLOB列的SQL语句, 将文件内容块写入到该列中, 即实现文件内容的上传。代码4是服务端上传文件的接口定义。

相比代码2, 代码4中不能直接根据参数名来获取参数值, 而是先需要将参数名和参数值 (包括文件名和文件内容块) 从整个内容块中解析出来, 并建立“键-值”的哈希表,才能通过参数名来获取参数值。文件的上传实际上就是更新BLOB列, 所以其需要提供宿主记录的主键ID名和ID值 (即先插入记录中的文本部分, 再进行BLOB字段的更新)。

值得注意的是, 该文件上传接口中定义了上传内容的大小阈值 (16MB), 如果上传内容超过了该值, 则会造成缓冲溢出, 解析错乱。所以需要客户端也要进行同步的限制。

4.3 文本内容的获取

4.3.1 手机移动客户端

手机移动 客户端也 可以通过HttpClient的推送方 法(“POST”, 也可以使用 “GET”) 来发送数据 请求 , 代码5是手机移动客户端获取文本内容 (记录集) 的关键代码。

不难看出, 代码1与代码5基本相同, 差异之处仅仅在于返回值类型: 前者为JSON对象 (操作结果), 后者为JSON数组 (结果集)。

4.3.2 服务端

服务端通过request对象获取客户端传入的参数, 然后根据预编译的SQL语句块标识来获取SQL语句块, 并使用参数来替换占位符, 最后通过JDBC执行该SQL语句, 并以JSON格式回应结果集。代码6是服务端文本内容 (结果集) 获取接口的定义代码。

从代码6可知, 返回结果集包含多条记录, 每条记录的形式为:{列名1:" <列值1>,列名2:" <列值2>" ,列名3:" <列值3>,……}。在客户端可通过列名来获取记录中该列的值。

4.4 下载文件

4.4.1 手机移动客户端

获取文本与下载文件的差异仅仅在于对服务端回应内容的读取方式: 前者读取内容为文本, 可以逐行读取; 后者读取内容为文件流, 需要逐字节进行读取。代码7是移动客户端下载文件的关键代码。

通过代码5和代码7对比可知, 获取文本与下载文件的请求方式相同, 仅是读取服务端返回内容的方式不同而已,前者是按行读取文本, 后者是逐字节进行读取, 且存储为本地文件。

4.4.2 服务端

服务端通过request对象获取客户端传入的参数, 然后拼凑成读取BLOB列的SQL语句, 将文件内容块从该列的I/O流中读取, 即实现文件内容的下载。代码8是服务端文件下载接口定义代码。

代码8中, 文件的下载就是从BLOB字段中读取文件块内容, 所以其需要提供宿主记录的主键ID名和ID值 (即先读取记录中的文本部分, 再进行BLOB字段的读取)。

另外, 读取的内容将保存为本地文件, 所以需要为该移动客户端APP预选设置好临时文件夹, 而且设计好临时文件的命名规则。

4.5 工程设置

由于在该应用中需使用多部分实体 (MultipartEntity) 的规范 (该定义没有纳入安卓平台), 且涉及网络访问等需求,所以在工程中必须有相应的设置, 具体如下:

(1) 需引入httpmime包 (安卓平台已经包含HttpClient的包)。

(2) 须在工程清单文件中声明互联网访问等使用权限。

5 结语

从手机移动客户端应用的场景和技巧出发, 结合安卓平台的技术特性, 对手机移动客户端在HTTP通信方面的功能实现和相关技巧进行了详细的阐述, 并结合实际案例对关键功能的实现代码进行了分析。

HTTP 篇7

本课题主要研究如何从万维网中抓取带有持续Cookie (persistent cookie) 的POST文本数据。现以Windows7的32位系统作为测试平台, 以eclipse Mars.1为开发平台, 研究一个快速抓取POST文本数据的方法。

HTTP协议概述

HTTP协议, 即超文本传输协议 (Hyper-text transfer protocol) , 是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP是一个应用层协议, 由请求和响应这两种报文组成。请求方法有8中类型, GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT和OPTIONS等。其中GET和POST是最常见的两种请求方式。GET是以实体的方式得到由请求URI所指定资源的信息, 如果请求URI只是一个数据产生过程, 那么最终要在响应实体中返回的是处理过程的结果所指向的资源, 而不是处理过程的描述。POST则用来向目的服务器发送请求, 要求它接受背负在请求后的实体, 并把它当作请求队列中请求URI所指定资源的附加新子项, POST被设计成用统一的方法实现下列功能:

对现有资源的解释;

向电子公告栏、新闻组、邮件列表或类似讨论组发信息;

提交数据块;

通过附加操作来扩展数据库等。

POST请求报头信息分析

请求报头允许客户端向服务器端传送请求的附加信息以及客户端自身的信息。例图1介绍了一个典型的POST请求报头, 它主要包含以下字段:Accept字段表示浏览器支持的MIME (Multipurpose Internet Mail Extensions) 类型;AcceptEncoding字段表示浏览器有能力解码的编码类型;AcceptLanguage字段表示浏览器所支持的语言类型;Connection字段表示客户端与服务器连接的类型;Content-Type字段表示网络文件的类型和网页的编码格式;Cache-Control字段指定了请求遵循的缓存机制;User-Agent字段表示浏览器版本信息;X-Requested-With字段的值为XMLHttp Request表示请求是Ajax异步请求, 值为nul表示请求是传统同步请求;Host字段表示请求的服务器网址;Cookie字段是一些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端商的数据。

POST文本数据抓取方案设计

抓取POST文本数据的基本流程如图1。首先, 需要读取字符串url, 并根据字符串url建立URL类的实例post URL, 此后需要建立post URL连接, 这将返回一个Http URLConnection类的对象connection, 此时并没有创建实际的网络连接。其次, 要给对象connection设置连接属性, 其中, 首先要调用set Request Method方法将请求方式设置为POST;其次需分调用set Do Output和set Do Input方法将参数都设置为true, 这是因为POST请求的参数是放在http正文内;此后, 需要调用set Request Property方法, 该方法有两个参数分别是key和value, 参数key可参考表1中第一列的数据来设置, 参数value的值与表1中第二列的数据类似, 针对来自不同的源的POST网页可依照抓包代理工具中捕获的POST请求报头信息来设置key和value的值。设置好连接属性后, 就可以调用connection对象的connect方法来打开到post URL引用的资源的通信链接。应该注意的是, 设置连接属性必须在打开连接之前, 否则将会发生错误。最后, 建立字符输入流对象读取文本数据并保存到本地, 流程结束。

若要批量抓取POST文本数据, 需要对图1中描述的方案的流程进行改进。在给对象connection设置连接属性这一步骤中, 有一个字段为Cookie。Cookie分为非持续Cookie (nonpersistent cookie) 和持续Cookie (persistent cookie) 。如果没有给Cookie设置过期时间, 则Cookie会在关闭浏览窗口时消失, 这样的Cookie被称为非持续Cookie。非持续Cookie一般被保存在内存里。如果设置了Cookie的过期日期, 则它将被一直保存直到过期位置, 这样的Cookie被称为持续Cookie。火狐浏览器的持续Cookie被保存在数据库cookies.sqlite中, 过期日期由expiry字段记录。获取持续Cookie的方法有以下两种:

连接数据库cookies.sqlite, 选择表moz_cookies, 读取name、value和expiry字段的值;

建立Web Driver类的对象打开浏览器, 建立并打开url链接后获取cookie的name、value和expiry字段的值。

第一种方法在数据库cookies.sqlite中表格的数据没有加密的情况下可通过Class.for Name (org.sqlite.JDBC) 连接SQLite的JDBC来实现。第二种方法的原理是在打开浏览器并打开url链接时保存服务器向客户端发送的Cookie。显然, 第二种方法比第一种方法更加通用。因此, 本课题采用第二种方法来获取Cookie, 流程图见图2。

采用图2中描述的方法可以完整地得到Cookie的name和value, 又根据持续Cookie有过期日期的特性, 设计出了批量抓取POST文本数据的流程图, 见图3。当保存好当前抓取到的文本数据后, 并在抓取下一个页面前, 需要判断当前日期是否在Cookie的过期日期之前。若为真, 说明此前得到的Cookie仍然有效, 可继续使用;若为假, 需要刷新网页重新抓取Cookie和过期日期。由于在获取Cookie的过程中打开了firefox浏览器, 因此抓取完预计的所有页面后, 需要关闭浏览器, 到此整个流程结束。

实验结果

调试好各模块的程序后, 需配置好URL和文本的保存路径。以中国裁判文书网为例, 运行程序, 见表2所示的统计结果。

结束语

本文介绍了抓取POST文本数据的详细步骤, 在执行抓取文本程序的过程中, 曾出现过返回502 Bad Gateway的HTTP状态消息的情况。这是由于服务器从上游服务器收到一个无效的响应。此种情况可通过记录抓取进程的方式解决, 在再次执行程序时就不会出现抓取重复文本的错误。通过反复的实验, 验证了此种抓取方式的可行性, 并且操作简单。

HTTP 篇8

Web的应用层协议HTTP是Web的核心。HT-TP在Web的客户程序和服务器程序中得以实现。运行在不同端系统上的客户程序和服务器程序通过交换HTTP消息彼此交流。HTTP定义这些消息的结构以及客户和服务器如何交换这些消息。Web页面(Web Page)也称为文档,由多个对象构成。对象(Object)仅仅是可由单个URL寻址的文件,例如HTML文件、JPG图像、GIF图像、JAVA小应用程序、语音片段等。大多数Web页面由单个基本HIML文件和若干个所引用的对象构成。HTTP定义Web客户(即浏览器)如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户。

1 HTTP协议

超文本传输协议(HTTP)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。本程序实现的是一个轻量级的Web服务器[1]。

(1)HTTP请求由3部分组成,分别是:请求行、消息报头、请求正文。

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF。其中Method表示请求方法;Request-URI是一个统一资源标识符;HT-TP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)[2]。

(2)HTTP响应由3个部分组成,分别是:状态行、消息报头、响应正文。

状态行格式是:HTTP-Version Status-Code Reason-Phrase CRLF,其中HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由3位数字组成,第1个数字定义了响应的类别,且有五种可能取值[3]:

2 HTTPSVR程序分析

HTTPSVR是一个简单的Web服务器,具有图形界面,可以指定端口和Web主目录,且可以生成Web访问的日志,它由一个无限循环构成:接收来自客户端的请求,根据HTTP协议解析并处理请求,然后发送应答至客户端。

2.1 HTTPSVR主要工作流程图

HTTPSVR功能强大,具有丰富的图形界面,主要的工作流程如图1所示[5]。

首先通过CListenSocket::OnAccept(int nErrorCode)函数生成CRequestSocket类,监听到连接请求时,Accept函数创建新的套接字pRequest并返回句柄,AsyncSelect函数监听80端口的FD_READ和FD_CLOSE两个事件,当传入FD_READ事件时,准备接收,并且触发OnReceive()函数,如果传入FD_WRITE事件,发送数据的时候,OnSend()函数就会触发。

当有数据到达时,执行ReqSock.cpp中的void CRequestSocket::OnReceive(int nErrorCode)函数。代码int nBytes=Receive(m_buf.GetData(),m_buf.GetSize())将tcp层上传的数据包存放在请求和应答报文的缓冲区m_buf中。

接下来使用swich语句对3种请求状态(REQ_REQUEST,REQ_HEADER,REQ_BODY)进行处理,当请求状态m_reqStatus==REQ_DONE,调用StartResponse()开始构造应答报文。

当StartResponse()构造应答报文结束后,利用AsyncSelect(FD_WRITE|FD_CLOSE);调用void CRequestSocket::OnSend(int nErrorCode)函数发送缓冲区m_buf中的数据[6]。

2.2 异步非阻塞类CAsyncSocket

CAsyncSocket的Create()函数,除了创建了一个Socket以外,使用WSAAsyncSelect()将这个Socket与该窗口对象关联,以让该窗口对象处理来自Socket的事件(消息),然而CSocketWnd收到Socket事件之后,只是简单地回调CAsyncSocket::OnReceive()CAsyncSocket::OnSend(),CAsyncSocket::OnAccept(),CAsyncSocket::OnConnect()等虚函数。所以CAsyncSocket的派生类,只需要在这些虚函数里添加发送和接收的代码。使用CAsyncSocket时,如果使用Create缺省创建socket,则所有网络I/O都是异步操作,进行有关网络数据传输时需要用到以下函数:OnAccept,OnClose,OnConnect,OnOutOfBandData,OnReceive,OnSend[7]。

2.3 HTTPSVR关键类分析

void CListenSocket::OnAccept(int nErrorCode)创建新的CRequestSocket,并监听80端口,请求到达时返回套接字,并通过AsyncSelect(FD_READ|FD_CLOSE)调用void CRequestSocket::OnReceive(int nErrorCode)函数接收数据。

void CRequestSocket::OnReceive(int nError-Code)[8]实现httpsvr的所有主要功能,包括接受浏览器的请求,根据Http协议解析请求报文,构造应答报文,将处理后的数据发送回浏览器。Receive(m_buf.GetData(),m_buf.GetSize())函数接收来自浏览器的请求数据包,switch语句根据不同的状态处理。浏览器的请求状态m_reqStatus为REQ_REQUEST时,使用while循环进行处理。ProcessLine()函数对接收到报文的每一行进行解析,然后初始化m_pRequest类。Swich语句结束后调用StartResponse()根据m_pRequest中的解析结果构造应答报文,最后函数AsyncSelect(FD_WRITE|FD_CLOSE)调用OnSend函数进行发送。

void CRequestSocket::OnSend(int nErrorCode)调用int nBytes=Send(m_buf.GetData(),m_cbOut)函数发送缓存中的数据,并对可能出现的错误进行处理,或者关闭或者重新进行发送。

void CRequestSocket::ProcessLine(void)根据请求状态m_reqStatus的不同作出处理,完成对CRequest*m_pRequest的初始化。

BOOL CRequestSocket::StartResponse(void)[9],该函数用于构造应答报文(将构造好的应答报文缓存在m_buf中,用void CRequestSocket::OnSend(int nErrorCode)发送m_buf),并根据不同的Method(GET,HEAD,POST)构造应答报文。例如当Method为GET时,表示浏览器需要浏览网页,就用FindTarget(strFile);在默认目录底下进行查找,如果存在则打开报文,并使用StuffHeading()构造http协议要求的头部,然后使用StartTargetStuff();将刚才打开的网页内容填充到m_buf中,等待发送,构造完毕后再返回BOOL CRequestSocket::StartResponse(void),然后调用AsyncSelect(FD_WRITE|FD_CLOSE);该函数调度void CRequestSocket::OnSend(int nErrorCode)对缓存m_buf中的数据进行发送。

BOOL CRequestSocket::FindTarget(CString&strFile),由于浏览器发送过来的请求都是网络地址格式的,所以该函数将网络地址格式转为windows文件系统的路径格式。例如发送:GET/default.html,经过本函数转换之后变为c:WebPagesdefault.html(httpsvr默认根目录为c:WebPages)。

void CRequestSocket::StartTargetStuff(void),该函数读取客户端请求浏览的网页文件内容到m_buf中,等待进一步发送。

UINT CGIThread(LPVOID pvParam)[10],该函数以线程的方式运行,调用相应的GCI函数处理,并输出结果到一个临时文件。该线程处理完毕后,再由BOOL CRequestSocket::StartResponse(void)将临时文件发给浏览器。

3 HTTPSRV程序执行过程

3.1 运行函数

程序由MFC中的文件APPMODULE.CPP的_tWinMain函数开始执行,执行该文件的return AfxWinMain函数。

3.2 链接服务器

由WINMAIN.CPP文件中的int AFXAPI AfxWinMain函数来创建工作线程pThread对httpsvr进行初始化工作,调用HttpSvr.cpp文件中的BOOL CHttpSvrApp::InitInstance方法对HTTP服务器进行初始化,然后运行线程的主函数,最后在THRD-CORE.CPP文件中运行int CWinThread::Run函数,开始服务器的循环。

在循环中,首先调用Listen.cpp中的void CListenSocket::OnAccept方法,生成CRequestSocket,将其设置用于监听8080端口。设置端口为8080,将Web服务文件夹地址Root Dir指向root所在地址。此时显示结果如图2所示。

3.3 请求客户

在ReqSock.cpp文件中,根据响应状态m_reqStatus的不同,对接收到的数据包进行不同的响应处理。当browser发送第一个数据包时,响应状态m_reqStatus被设置为REQ_REQUEST,之后,对REQ_RE-QUEST数据包的每一行进行处理,根据http的协议使用ProcessLine方法对m_pRequest进行初始化,完成以上操作之后,调用判断StartResponse方法来构造应答报文,运行AsyncSelect函数,之后其调用void CRequestSocket::OnSend方法将缓存m_buf的应答报文发送给客户端,如图3所示。

当点击submit,返回页面如图4所示。

4 结语

通过对该HTTP服务器程序的分析,熟悉了HTTP服务工作流程,对Socket有更深的了解,可以创建异步Socket的方法。本文对所给的具有图形界面HTTP服务器程序源代码进行分析和调试,介绍程序实现的主要功能,运行过程以及程序中各类实现的功能。当然,这个程序实现的只是一个轻量级的服务器,其功能相对比较简单。熟悉了基于HTTP协议服务器创建的基本原理,以后就能在此基础上实现功能更加丰富的服务器。

摘要:绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。为了分析基于HTTP协议服务器程序以及浏览器与服务器的交互过程,以一个简单的基于HTTP协议中服务器程序为实例,探讨怎样使用多线程与异步操作的理论,运用WinSock编程来逐步解析HTTP协议的服务器程序的核心部分,这样既可达到避免调用线程阻塞的目的,又可提高服务器程序的可响应性。

关键词:HTTP,HTTP协议,服务器,WinSock

参考文献

[1]叶强.超文本传输协议:HTTP/1.0[J].科技情报开发与经济,2004(8):66-68.

[2]肖戈林.HTTP协议技术探析[J].江西通信科技,2001(1):39-41.

[3]FIELDING R,GETTYS J,MOGUL J,et al.RFC 2068hypertext transfer protocol-HTTP/1.1[J].MIT/LCS,UCIrvine,1999(1):37-38.

[4]徐健,王涛.HTTP/1.1的分析[J].西南师范大学学报:自然科学版,2004(2):47-48.

[5]蒋东兴.网络程序设计大全[M].北京:清华大学出版社,1999.

[6]TANENBAUM A S.计算机网络[M].潘安民,译.北京:清华大学出版社,2004.

[7]李腊元,李春林.计算机网络技术[M].北京:国防工业出版社,2004.

[8]蔡皖东.HTTP协议的传输机制与超文本链的研究[J].微电子学与计算机,1997(4):53-55.

[9]王艳平,张越.Windows网络与通信程序设计[M].北京:人民邮电出版社,2006.

HTTP 篇9

会话初始协议 (SIP) 是一个应用层的控制协议, 它可以建立、修改和结束多媒体会话。SIP消息采用文本方式, 具有简单、易扩展的特点。SIP是在IP应用的基础上提出来的, 它起源于超文本传送协议 (HTTP) , 采用请求/响应模型对实体的行为进行规范描述。同时在命名方式上采用统一资源定位符 (Uniform Resource Locators, URL) 方式, 因此可以最大程度地继承现有的HTTP寻址方法[1]。随着应用的多样化, 在不违背RFC3261的前提下, 因特网工程任务组 (IETF) 提出了很多新的消息或消息头字段, 以满足不同需求[2]。

RFC3261提出了分别适用于网络层、传输层和应用层的SIP安全解决方案, 例如IPsec、TLS、S/MIME和SIPS。与此同时, 针对SIP消息安全, 国内外学者做了很多研究。文献[3]提出了基于ECC的SIP认证方案, 在理论上解决了数据安全传输的问题, 但是现有的SIP安全设备并没有涵盖ECC加密算法, 实际实施起来困难重重。文献[4]设计了一种改进的HTTP摘要认证方案, 实现了双向身份认证和密钥协商的功能, 但其在加密算法的安全性上存在较大的问题。首先是摘要算法SHA-1 (安全散列算法) 已有被破译的可能, 其次是加密密钥的长度不够。文献[5]提出了检测任何违反SIP规范的SIP异常或非法消息的框架, 在某种程度上减少了SIP系统所面临的入侵威胁。由于SIP的结构性规则很多, 提取足够充足的检测条件是必然的选择。

本文对现有的SIP安全方案进行了分析与讨论, 针对应用层上SIP消息传送时面临网络侦听的安全问题, 检测SIP非法消息, 结合密文隐写系统和HTTP摘要认证机制, 扩展SIP消息的认证头域, 在文献[5,6,8,9]的基础上, 经过改进得到一种适用于现有设备的基于HTTP的检测-认证方案。

2 方案设计

2.1 SIP检测模块

在认证之前, SIP消息首先通过检测程序, 辨别其是否是“恶意的”。请求和应答都可能含有消息体, 但是SIP代理服务器不检查消息体, 因此消息体中的内容只对用户代理有意义。SIP消息在网络中路由时, 代理服务器需要的所有信息都包含在起始行Start-Line (请求行、状态行) 和SIP标题头中。本模块主要检测SIP消息的起始行和SIP头字段。

基本思想是构建一个通用的检测非法SIP消息的模块, 即该模块能容易地应用于任意SIP消息中。这个通用检测模块的检测规则[1,5,7]如下:

Start-Line中除了SP和结束使用的CRLF外, 不允许使用回车或换行字符;

SIP_METHOD! = NULL;

SIP_VERSION == SIP/2.0;RFC3261规定SIP的版本必须为SIP/2.0。

MESSAGE_HEADER! = NULL且任何SIP消息头符合通用范式;

MESSAGE_HEADER=field-name:field_value* (;parameter-name=parameter-value)

本方案设计一个多线程的消息检测模型来提高效率, 采用Tomita算法[9]在检测过程中的具体操作如图1所示。从输入消息的左端将一个未处理过的终结符移入栈顶, 并等待更多的信息到来之后再做决定;根据上下文无关语法的ABNF (Augmented Backus-Naur Form, 扩展的巴科斯-诺尔范式) 规则, 并使用LR分析法 (最左归约-最右推导) 将该规则左边的符号取代与规则右边相匹配的栈顶符号;对栈中符号和输入符号串进行处理, 若输入串处理完毕, 且栈中只剩下一个符号S, 则分析成功, 结束;若栈中并非只有一个符号S, 或输入串中的符号未处理完毕, 也无法进行任何归约操作, 则分析失败, 结束。

2.2 改进的HTTP摘要认证模块

检测模块初步过滤掉非法SIP消息后, 就进入了认证模块。认证模块包括两个子模块:加密子模块和密文隐写子模块, 如图2所示。

目前SIP终端和软交换设备都不支持PGP和S/MIME加密, 且SHA-1算法和MD5算法都有被破解的报道。本模块考虑到大部分网络部署都支持三重DES算法 (Triple Data Encryption Standard, 3DES) 和RSA (一种以发明者的名字命名的算法, 其发明者是Ron Rivest, Adi Shamir 和Leonard Adleman) 算法, 且至今未见3DES和RSA算法被破译的报道[8], 因此我们建议采用3DES算法作为摘要算法, RSA算法用于保护共享密钥的安全传输。在公钥系统中, 发送方用私钥加密共享密钥, 接收方用发送方的公钥解密。

SIP消息头字段与HTTP摘要认证 (HTTP Digest authentication) [8]中的认证头字段相似, 用户与服务器之间采用改进的HTTP摘要认证方案进行双向认证。改进的HTTP摘要认证方案在以下方面进行了相关扩展:

(1) 对auth-param参数的扩展

auth-param参数用来封装文本编码的stega_message数据包, 其通用格式以BNF语法描述如下:

stega-param=“stega_packet”“=“<”>stega-packet<”>

stega-packet=

此外, 在承载stega_message消息后, 消息类型要将认证类型设置为“stega”。下面是一个封装了stega_message数据包的Proxy-Authenticata头域:

Proxy-Authenticate:stega-realm=“practicerealm.com”,

Stega_packet=“Join few standards let to host on all weapons inside the hardship the sign at Isaiah...to own the same hands...right the planned meet free. ”

(2) 对摘要算法的扩展

对于“algorithm”域来说, 如果该域没有指定摘要算法, 则默认为3DES算法。

algorithm=“algorithm”“=” (“3DES”|“3DES-sess”|token)

则, E (data) =3DES (data)

KD (secret, data) =E (concat (secret, “:”, data) )

即摘要就是对secret与data通过冒号连接在一起的结果进行3DES运算, 而“3DES-sess”则允许其它第三方服务器参与鉴别。E (data) 表示对数据“data”调用3DES算法获取字符串。S-E (secret, data) 表示对数据“data”和“secret”调用stega_algorithm算法和3DES加密算法获取字符串。即

S-E (secret, data)

=stega_algorithm (KD (secret, data) )

=stega_algorithm (E (concat (secret, “:”, data) ) )

3 实验结果

本文作者利用VB.NET对应用的加密算法进行了实现。主要采用以传输控制协议/网际协议 (TCP/IP) 为基础的Socket技术来处理跨网络的数据传输与网络联机, 局域网络上传输的数据都经过3DES加密算法加密之后成为密文。客户端和服务器端加密子模块的测试结果分别如图3、4所示。

测试环境配置了Windows2003系统的服务器、Windows XP系统的PC机。主要测试数据:双向身份认证时, 客户端会在新的请求Proxy-Authorization中向服务器提供认证其身份的response值, 以及服务器确认了对客户端的认证后, 响应Proxy-Authenticate中所包含的用于证明服务器身份的response值。

客户端将response值发送给服务器, 服务器能够顺利解密, 与SIP消息中的Digest algorithm、realm、username和 password进行比对, 确认后认证成功。测试结果证明了客户端与服务器之间实现双向身份认证的能力。下一步要做的是继续完成密文隐写系统的测试。

4 结束语

本文改进了应用于SIP的HTTP摘要认证的应用层安全机制:对接收到的SIP消息进行解析的同时进行一定程度的检测, 筛选掉可能存在的非法SIP消息;对SIP认证头域进行相应扩展, 实现服务器端与客户端的双向身份认证和摘要消息的3DES加密。这一方案具有较高的加密比特强度, 保证了应用层的安全性能;将消息摘要的密文转换为具有自然语言统计特性的文本, 降低了被破译的可能。

摘要:由于现有的认证机制不能有效解决会话初始协议 (SIP) 消息传送时网络侦听的问题, 因此SIP网络传输时存在易遭受异常消息攻击、数据包被侦听、密文被分析等诸多安全威胁。文章经比较分析、研究改进, 应用一个并行多进程的SIP非法消息检测流程, 扩展了SIP认证头域, 引进了密文隐写系统, 能有效保证应用层的安全。实验结果验证了该方案的有效性。

关键词:会话初始协议安全,检测,认证,密文隐写

参考文献

[1]IETF RFC3261-2002, SIP:Session Initiation Protocol[S].

[2]陆立, 张鹏生, 张华, 等.NGN协议原理与应用[M].北京:机械工业出版社, 2004.1-186.

[3]李士达, 胡?, 王兴秋, 等.一种基于ECC的SIP认证方案的提出与实现[J].计算机应用, 2007, 27 (2) :311-313.

[4]王宇飞.一种基于HTTP摘要认证的SIP安全通信系统的实现[D].成都:电子科技大学, 2005.10-60.

[5]Dimitris Geneiatakis, Georgios Kambourakis, TasosDagiuklas, et al.A Framework for Detecting Mal-formed Messages in SIP Networks[J].IEEE, LAN-MAN, 2005, (9) :1-5.

[6]张岩.SIP协议及其安全机制的研究与实现[D].南京:东南大学, 2006.78-79.

[7]夏智娟.SIP协议的研究与实现[D].南京:南京理工大学, 2005.18-27.

[8]代秀娇.数据密码编码技术在网络通信中的研究及其应用[D].广州:中山大学, 2005.32-51.

HTTP 篇10

16年后首次更新

谈到推出HTTP2的原因, Mark Nottingham表示, 16年前推出的HTTP1已经不能适应现在的Web环境。例如:过去一个Web页面上的元素可能只有几十个, 而现在随着各种小图片的应用, 元素的数量达到了上百个。在这样的情况下, HTTP1的性能局限日渐凸显, 当用户同时建立很多连接时, 网络拥塞的现象就会产生, 用户体验大大降低。此外, HTTP1协议的头部包含了许多冗余信息, 进一步加大了传输时延。

针对上述问题, HTTP2进行了如下方面的改进:第一, 将HTTP头部进行压缩, 减少数据传输量, 具体做法是用头部压缩技术将所有请求封装在一个网络包里;第二, 通过连接复用技术实现在同一时刻只开通一个连接, 而不是多个连接, 以有效缓解网络拥塞。

作为一个发布不久的协议, HTTP2目前已经得到了一些浏览器的支持, 如Firefox和Chrome, 此外苹果已宣布下一代i OS会支持HTTP2, 微软在Edge浏览器中实现了HTTP2, 而安卓浏览器如果默认Chrome的话也会支持HTTP2。“在客户终端这一侧大约50%以上的浏览器都已经支持HTTP2。”Mark Nottingham表示。

5%~15%的Web性能提升

从目前的应用情况来看, 更加高效的HTTP2显著地提升了互联网性能。根据Mark Nottingham的调查, 部署HTTP2的企业普遍反映, HTTP2会带来5%~15%的Web性能提升。其意义在于, 帮助厂商提升用户黏性, 甚至于提升电商网站的订单转化比率。例如:Firefox在浏览器启用HTTP2之后, 立竿见影地看到10%左右的流量都是HTTP2的。

“部署HTTP2的意义在于, 改善现有Web上使用的协议, 为未来的创新和演进铺平道路。”Mark Nottingham预测, 未来会有更多的大型互联网公司采用HTTP2, 并带动更多的互联网公司转向HTTP2。

【HTTP】推荐阅读:

上一篇:住宅建筑节能改造技术下一篇:标准化管理公司管理

本站热搜

    相关推荐