网络代理服务器的设计与实现
功能需求
实现一个简易的 proxy 程序。proxy 程序的功能:能够做“二传手”的工作。它自身处在能同时连通外界目标服务器和我的机器的位置上。我的机器把请求发送给它,它接受请求,把请求原封不动的抄下来发送给外界目标服务器;外界目标服务器响应了请求,把回答发送给它,它再接受回答,把回答原封不动的抄下来发送给我的机器。这样,我的机器实际上是把它当作了目标服务器(由于是原封不动的转抄,请求和回答没有被修改)。而它则是外界目标服务器的客户端。
相关知识
SOCKS5 是一个代理协议,它在使用
TCP/IP 协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问 Internet 网中的服务器,或者使通讯更加安全。SOCKS5
服务器通过将前端发来的请求转发给真正的目标服务器,
模拟了一个前端的行为。在这里,前端和 SOCKS5 之间也是通过 TCP/IP 协议进行通讯,前端将原本要发送给真正服务器的请求发送给 SOCKS5 服务器,然后 SOCKS5 服务器将请求转发给真正的服务器。Go 语言是由 Google 开发的一个开源项目,目的之一为了提高开发人员的编程效率。
Go 语言语法灵活、简洁、清晰、高效。它对的并发特性可以方便地用于多核处理器
和网络开发,同时灵活新颖的类型系统可以方便地编写模块化的系统。go 可以快速编译,
同时具有垃圾内存自动回收功能,并且还支持运行时反射。Go 是一个高效、静态类型, 但是又具有解释语言的动态类型特征的系统级语法。
Socks5 协议中文文档(RFC1928)
http://blog.chinaunix.net/uid-26548237-id-3434356.html
socks5 代理默认支持多种身份验证机制. 由于课程设计时间限制,故目前只实现了无验证需求
经过测试可以支持作为 Chrome 浏览器的代理.并支持 Chrome 的通过代理发送的 DNS 查询请求.
设计原理
- 客户向代理方服务器发出请求信息
- 代理方应答
- 需要代理方接到应答后发送向代理方发送目的 ip 和端口
- 代理方与目的连接
- 代理方将需要代理方发出的信息传到目的方,将目的方发出的信息传到需要代理方。代理完成。
代理 TCP 连接
- 向服务器的 1080 端口建立 tcp 连接。
- 向服务器发送 05 01 00 (此为 16 进制码,以下同)
3 .如果接到 05 00 则是可以代理 - 发送 05 01 00 01 + 目的地址(4 字节) + 目的端口(2 字节),目的地址和端口都是 16 进制码(不是字符串!!)。 例 202.103.190.27 -7201 则发送的信息为:05 01 00 01 CA 67 BE 1B 1C 21 (CA=202 67=103 BE=190 1B=27 1C21=7201)
- 接受服务器返回的自身地址和端口,连接完成
- 以后操作和直接与目的方进行 TCP 连接相同。
代理 UDP 连接
- 向服务器的 1080 端口建立 udp 连接
- 向服务器发送 05 01 00
- 如果接到 05 00 则是可以代理
- 发送 05 03 00 01 00 00 00 00 + 本地 UDP 端口(2 字节)
- 服务器返回 05 00 00 01 + 服务器地址 + 端口
- 需要申请方发送 00 00 00 01 + 目的地址 IP(4 字节)+ 目的端口 + 所要发送的信息
- 当有数据报返回时 向需要代理方发出 00 00 00 01 + 来源地址 IP(4 字节)+ 来源端口 + 接受的信息
注:此为不需要密码的代理协议,只是 socks5 的一部分,完整协议请 RFC1928
系统实现&功能特性
备注:题目所述为 http 代理,http 代理实现较为简单, 所以这里选择实现了一个 socks5 代理
socks5 代理默认支持多种身份验证机制. 由于课程设计时间限制,故目前只实现了无验证需求
经过测试可以支持作为 Chrome 浏览器的代理.并支持 Chrome 的通过代理发送的 DNS 查询请求.
这个程序的开发语言选用的是 Google 的 golang,并没有选择常用的 c,c++,java
出于性能考虑没有使用脚本语言.
为了实现跨平台没有选用 c,c++. Java 由于需要虚拟机也没有选用.
- 支持不完整的 socks5 协议(不支持身份验证)
- 对大文件和多用户处理良好
- 可以跨平台 linux/win/arm…
Tracert 与 Ping 程序设计与实现
功能需求
参照附录 2,了解 Tracert 程序的实现原理,并调试通过。然后参考 Tracert 程序和教材 4.4.2 节,编写一个 Ping 程序,并能测试本局域网的所有机器是否在线,运行界面如图 1 所示的 QuickPing 程序。
系统实现
Ping2
这是对 Linux 下的工具 ping 的一个简单模仿
Usage of ./ping2:-host="www.baidu.com": usage: -host=baidu.com-times=3: usage: -times=3
实现语言: golang , 支持平台 *nix, win, arm…
注意在 *nix 下使用需要 root 权限运行
使用说明
bin git:(master) sudo ./ping2
2015/01/08 14:52:19 Ping www.baidu.com
2015/01/08 14:52:19 IP: 180.97.33.108
2015/01/08 14:52:19 Runing Ping data [8 0 247 255] [0 0 0 0]
2015/01/08 14:52:19 Recv data [69 0 0 28] [59 75 64 0] [49 1 221 28] [180 97 33 108] [192 168 155 3] [0 0 255 255] [0 0 0 0]
2015/01/08 14:52:19 Time spend ms 97
2015/01/08 14:52:19
2015/01/08 14:52:20 Ping www.baidu.com
2015/01/08 14:52:20 IP: 180.97.33.108
2015/01/08 14:52:20 Runing Ping data [8 0 247 255] [0 0 0 0]
2015/01/08 14:52:20 Recv data [69 0 0 28] [59 158 64 0] [49 1 220 201] [180 97 33 108] [192 168 155 3] [0 0 255 255] [0 0 0 0]
2015/01/08 14:52:20 Time spend ms 91
2015/01/08 14:52:20
2015/01/08 14:52:21 Ping www.baidu.com
2015/01/08 14:52:21 IP: 180.97.33.108
2015/01/08 14:52:21 Runing Ping data [8 0 247 255] [0 0 0 0]
2015/01/08 14:52:21 Recv data [69 0 0 28] [60 35 64 0] [49 1 220 68] [180 97 33 108] [192 168 155 3] [0 0 255 255] [0 0 0 0]
2015/01/08 14:52:21 Time spend ms 114
pingScan
这是一个简单快速的在线主机扫描工具
实现语言: golang , 支持平台 *nix, win, arm…
功能特性
- 可以快速探测局域网内的在线主机
- 拥有极快的扫描速度,可以超过 nmap
- 可以命令行指定 ping 超时时间,以及没有新结果的等待时间
- 可以及其方便的指定 IP 段. 如 10.1.1-12.1-255 代表 10.1.1.1->10.1.12.255 之前的所有 IP
并发扫描采用 golang 自带的 goroutine 实现(类似于协程),而不是通常的多线程实现,可以同时发起上万请求而不会向使用线程一样占用大量 CPU.
在 Linux 系统下通过修改一些参数即可实现万级并发,详见
http://blog.csdn.net/guowake/article/details/6615728
使用说明
bin git:(master) sudo ./pingScan --help
Usage of ./pingScan:-ip="10.1.12.1-255":-n=255: Number of requests to perform-t=3000: Millisecond of ping timeout-w=3: Second wait after no ans
效果如下
bin git:(master) time fab pingScan_test
[localhost] local: go build cs/ok/pingScan
[localhost] local: sudo ./pingScan -ip="10.1.8.1-255" -n=300 -t=3000 -w=2
10.1.8.1-255
now: 10.1.8.1
all:255 over:44 pre:0.000000
all:255 over:44 pre:0.000000
timeout 2
ip:10.1.8.1 success:true
ip:10.1.8.112 success:true
ip:10.1.8.111 success:true
ip:10.1.8.110 success:true
ip:10.1.8.109 success:true
ip:10.1.8.104 success:true
...
###########################
success:44 error:0
Done.
fab pingScan_test 0.40s user 0.17s system 20% cpu 2.846 total
网络聊天程序的设计与实现
功能需求
参照附录 1,了解 Socket 通信的原理,在此基础上编写一个聊天程序。
功能特性:
- 实现语言: golang , 支持平台 *nix, win, arm…
- 可以实现群聊,点对点聊天
- 客户端可以使用 netcat
- 使用说明, 运行服务器
./simpleChat --port 9000
- 然后 客户端运行
nc localhost 9000
- 就会提示输入昵称,确定之后就可以进入聊天室
- 输入/name msg 可以发送消息 msg 给昵称为 name 的用户
- 其它任意字符则为群发
- 任一用户下线或者上线其它用户都会接收到通知.
服务器运行效果:
bin git:(master) fab simpleChat_test
[localhost] local: go build cs/ok/simpleChat
[localhost] local: ./simpleChat
2015/01/08 15:28:20 simpleChat run on 0.0.0.0:6666
2015/01/08 15:28:20 please type "nc serverip youport" to connect it
2015/01/08 15:28:20 for example: nc localhost 6666
TRACE: 2015/01/08 15:28:23 chat.go:117: New user asd 127.0.0.1:46206
TRACE: 2015/01/08 15:28:23 chat.go:82: brodCast New user asd 127.0.0.1:46206
TRACE: 2015/01/08 15:28:25 chat.go:63: asd: das
TRACE: 2015/01/08 15:28:25 chat.go:82: brodCast asd: das
TRACE: 2015/01/08 15:28:26 chat.go:63: asd: asd
TRACE: 2015/01/08 15:28:26 chat.go:82: brodCast asd: asd
TRACE: 2015/01/08 15:28:26 chat.go:63: asd: asd
TRACE: 2015/01/08 15:28:26 chat.go:82: brodCast asd: asd
客户端运行效果:
~ nc localhost 6666
Input you name:asd
You name:asd
You ip:127.0.0.1:46206
type "/name msg" to chat
type "msg" to broadcast
Online user 0:
das
asd: das
asd
asd: asd
asd
asd: asd
^C
简单 Web Server 程序的设计与实现
相关知识
WWW 的工作基于客户机/服务器计算模型,由 Web 浏览器(客户机)和 Web 服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,HTTP 协议的作用原理包括四个步骤:连接,请求,应答,关闭应答。在课程设计中,系统开发平台为 Ubuntu,程序设计语言采用 Python。
Python(英语发音:/paθn/), 是一种面向对象、解释型计算机程序设计语言,由 Guido van
Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。常见的一种应用情形是,使用 Python 快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如 3D 游戏中的图形渲染模块,性能要求特别高,就可以用 C++ 重写。
HTTP 协议是应用层的协议,定义了服务器端和客户端之间文件传输的沟通方式。HTTP 协议用于从 WWW 服务器传输超文本到本地浏览器的传送协议。由于 HTTP 协议支持的服务不限于 WWW,还可以是其它服务,它允许用户在统一的界面下,采用不同的协议访问不同的服务。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等[3]
设计原理
根据上述 HTTP 协议的作用原理,实现 GET 请求的 Web 服务器程序的方法如下:
- 创建 ServerSocket 类对象,监听端口 8080。这是为了区别于 HTTP 的标准 TCP/IP 端口 80 而取的
等待、接受客户机连接到端口 8080,得到与客户机连接的 socket - 创建与 socket 字相关联的输入流 instream 和输出流 outstream
- 从与 socket 关联的输入流 instream 中读取一行客户机提交的请求信息,请求信息的格式为:GET 路径/文件名 HTTP/1.1
- 从请求信息中获取请求类型。如果请求类型是 GET,则从请求信息中获取所访问的 HTML 文件名。没有 HTML 文件名时,则以 index.html 作为文件名
- 如果 HTML 文件存在,则打开 HTML 文件,把 HTTP 头信息和 HTML 文件内容通过 socket 传回给 Web 浏览器,然后关闭文件。否则发送错误信息给 Web 浏览器
- 关闭与相应 Web 浏览器连接的 socket 字,如果浏览器支持 KeepAlive,则保持连接直到超时
系统实现&功能特性
- 项目名称 pythonHTTPServer
- 实现语言 python(此实现大量参考 Python 标准库的设计)
- 跨平台 linux/win/arm…
- 使用方式:
python server.py --port 10001 --www "./"
- 默认端口:
:8000
- 默认 www 目录: 当前目录
- 支持协议版本为 HTTP1.1
- 目前支持 GET.
- 支持识别 index.html index.htm
- 支持列目录
- 支持 404 400 等错误
- 支持识别 url 中的 #,?
- 防止目录遍历漏洞.(通过 …/…/之类的 url)
- 支持中文目录名和文件名
网络代理服务器的设计与实现相关推荐
- 计算机网络课程设计之网络代理服务器的设计与实现
前言 本实验因为时间有限,写的比较草率... 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2 ...
- 7、网络代理服务器的设计与实现
一.设计题目 7.网络代理服务器的设计与实现 二.设计内容 实现一个简易的 proxy 程序.proxy 程序的功能:能够做"二传手"的工作.它自身处在能同时连通外界目标服务器和我 ...
- 计算机网络课程设计之网络嗅探器的设计与实现
前言 本实验难点是在于Windows下的raw socket有太多的限制,因此用winpcap编程功能更加强大,但是根据指导书要求要用原始套接字,原始套接字在Linux系统下也十分强大,结尾附上Lin ...
- 关于高性能服务器底层网络通信模块的设计方法
高性能服务器底层网络通信模块的设计方法 在对I/O完成端口进行底层封装的基础上,本文提出一种具有高性能的.可扩展性的通用网络通信模块设计方案.该方案采用多种系统性能优化技术,如线程池.对象池和环形缓存 ...
- 网络系统结构和设计的基本规则(Basic rules for network system architecture and design)
网络系统结构和设计的基本规则(Basic rules for network system architecture and design) PSTN ( Public Switched Teleph ...
- 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一3.3.3 供应实验室...
本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第3章 ,第3.3.3节,[美] 克里斯托弗·库塞克(Christopher K ...
- 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.2 内存...
本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第1章 ,第1.2.2节,[美] 克里斯托弗·库塞克(Christopher K ...
- 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.1.1 确定参数...
本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第1章 ,第1.1节,[美] 克里斯托弗·库塞克(Christopher Kus ...
- 架构风格与基于网络的软件架构设计
原文链接 https://blog.csdn.net/on_1y/article/details/60358117 架构风格与基于网络的软件架构设计 如今许多服务都采用了 RESTful API, 而 ...
最新文章
- 一位刚刚成功上岸的智能车队员对于参赛经历总结与对比赛的建议
- 利用svg技术实现在线动画演示
- python源码多平台编译_ubuntu编译python源码的坑
- 天平称重【递归解法】
- Asp.Net操作Cookie总结
- 【2017年第1期】专题导读:大数据与信用评价系统
- 大数据之-Hadoop3.x_MapReduce_Combiner概述---大数据之hadoop3.x工作笔记0118
- 二分图的匹配(未完)
- 0910下eclipse 语言包的插件安装
- dedecms采集侠问题
- Java 程序员常用资源网站集合
- SQL 2008R2 误删除数据恢复方法(一)
- vue防止用户恶意点击按钮
- 计算机开机显示器不亮,电脑开机显示器不亮,小编教你电脑显示器不亮怎么解决...
- 单片机c语言给变量赋值,单片机c语言变量的定义和赋值
- Seeding(深度优先遍历)
- 机器人底盘的核心技术及应用案例
- 磁场变化会影响计算机吗,磁场会影响电脑正常运行吗
- C#手机号码段生成 前7位补全后4位
- Matlab镜像建模产生啸叫信号,基于MATLAB有噪声语音信号的处理最终稿(样例3)...