功能需求

实现一个简易的 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 查询请求.

设计原理

  1. 客户向代理方服务器发出请求信息
  2. 代理方应答
  3. 需要代理方接到应答后发送向代理方发送目的 ip 和端口
  4. 代理方与目的连接
  5. 代理方将需要代理方发出的信息传到目的方,将目的方发出的信息传到需要代理方。代理完成。

代理 TCP 连接

  1. 向服务器的 1080 端口建立 tcp 连接。
  2. 向服务器发送 05 01 00 (此为 16 进制码,以下同)
    3 .如果接到 05 00 则是可以代理
  3. 发送 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)
  4. 接受服务器返回的自身地址和端口,连接完成
  5. 以后操作和直接与目的方进行 TCP 连接相同。

代理 UDP 连接

  1. 向服务器的 1080 端口建立 udp 连接
  2. 向服务器发送 05 01 00
  3. 如果接到 05 00 则是可以代理
  4. 发送 05 03 00 01 00 00 00 00 + 本地 UDP 端口(2 字节)
  5. 服务器返回 05 00 00 01 + 服务器地址 + 端口
  6. 需要申请方发送 00 00 00 01 + 目的地址 IP(4 字节)+ 目的端口 + 所要发送的信息
  7. 当有数据报返回时 向需要代理方发出 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 服务器程序的方法如下:

  1. 创建 ServerSocket 类对象,监听端口 8080。这是为了区别于 HTTP 的标准 TCP/IP 端口 80 而取的
    等待、接受客户机连接到端口 8080,得到与客户机连接的 socket
  2. 创建与 socket 字相关联的输入流 instream 和输出流 outstream
  3. 从与 socket 关联的输入流 instream 中读取一行客户机提交的请求信息,请求信息的格式为:GET 路径/文件名 HTTP/1.1
  4. 从请求信息中获取请求类型。如果请求类型是 GET,则从请求信息中获取所访问的 HTML 文件名。没有 HTML 文件名时,则以 index.html 作为文件名
  5. 如果 HTML 文件存在,则打开 HTML 文件,把 HTTP 头信息和 HTML 文件内容通过 socket 传回给 Web 浏览器,然后关闭文件。否则发送错误信息给 Web 浏览器
  6. 关闭与相应 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)
  • 支持中文目录名和文件名

网络代理服务器的设计与实现相关推荐

  1. 计算机网络课程设计之网络代理服务器的设计与实现

    前言 本实验因为时间有限,写的比较草率... 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2 ...

  2. 7、网络代理服务器的设计与实现

    一.设计题目 7.网络代理服务器的设计与实现 二.设计内容 实现一个简易的 proxy 程序.proxy 程序的功能:能够做"二传手"的工作.它自身处在能同时连通外界目标服务器和我 ...

  3. 计算机网络课程设计之网络嗅探器的设计与实现

    前言 本实验难点是在于Windows下的raw socket有太多的限制,因此用winpcap编程功能更加强大,但是根据指导书要求要用原始套接字,原始套接字在Linux系统下也十分强大,结尾附上Lin ...

  4. 关于高性能服务器底层网络通信模块的设计方法

    高性能服务器底层网络通信模块的设计方法 在对I/O完成端口进行底层封装的基础上,本文提出一种具有高性能的.可扩展性的通用网络通信模块设计方案.该方案采用多种系统性能优化技术,如线程池.对象池和环形缓存 ...

  5. 网络系统结构和设计的基本规则(Basic rules for network system architecture and design)

    网络系统结构和设计的基本规则(Basic rules for network system architecture and design) PSTN ( Public Switched Teleph ...

  6. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一3.3.3 供应实验室...

    本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第3章 ,第3.3.3节,[美] 克里斯托弗·库塞克(Christopher K ...

  7. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.2 内存...

    本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第1章 ,第1.2.2节,[美] 克里斯托弗·库塞克(Christopher K ...

  8. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.1.1 确定参数...

    本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第1章 ,第1.1节,[美] 克里斯托弗·库塞克(Christopher Kus ...

  9. 架构风格与基于网络的软件架构设计

    原文链接 https://blog.csdn.net/on_1y/article/details/60358117 架构风格与基于网络的软件架构设计 如今许多服务都采用了 RESTful API, 而 ...

最新文章

  1. 一位刚刚成功上岸的智能车队员对于参赛经历总结与对比赛的建议
  2. 利用svg技术实现在线动画演示
  3. python源码多平台编译_ubuntu编译python源码的坑
  4. 天平称重【递归解法】
  5. Asp.Net操作Cookie总结
  6. 【2017年第1期】专题导读:大数据与信用评价系统
  7. 大数据之-Hadoop3.x_MapReduce_Combiner概述---大数据之hadoop3.x工作笔记0118
  8. 二分图的匹配(未完)
  9. 0910下eclipse 语言包的插件安装
  10. dedecms采集侠问题
  11. Java 程序员常用资源网站集合
  12. SQL 2008R2 误删除数据恢复方法(一)
  13. vue防止用户恶意点击按钮
  14. 计算机开机显示器不亮,电脑开机显示器不亮,小编教你电脑显示器不亮怎么解决...
  15. 单片机c语言给变量赋值,单片机c语言变量的定义和赋值
  16. Seeding(深度优先遍历)
  17. 机器人底盘的核心技术及应用案例
  18. 磁场变化会影响计算机吗,磁场会影响电脑正常运行吗
  19. C#手机号码段生成 前7位补全后4位
  20. Matlab镜像建模产生啸叫信号,基于MATLAB有噪声语音信号的处理最终稿(样例3)...

热门文章

  1. 9亿财产如何分配:大S与汪小菲离婚所感
  2. java 程序怎么设置中文_怎么让这个简单JAVA程序读写中文字符
  3. PAT做题过程中的一些方法技巧总结
  4. java多态app_Java 入门教程 - Java 多态 - IT学院 - 中国软件协会智能应用服务分会...
  5. 【阶段1】【定理证明】二项式定理证明
  6. listview增大条目间距
  7. strcmp, strncmp和memcmp的区别
  8. 笔记本分屏后鼠标卡顿问题解决
  9. hdu2907 凸包+简单搜索
  10. 直播 | 骞云科技DevOps实践