Skip to content
我的计算机网络课程设计
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
bin
ping2
pingScan
pythonHTTPServer
simpleChat
socks5Proxy
.gitignore
README.MD

README.MD

计算机网络课程设计


目前我正在寻找暑假实习,欢迎访问 r.hi-hi.cn 查看我的简历

网络代理服务器的设计与实现

功能需求

实现一个简易的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)
  • 支持中文目录名和文件名

You can’t perform that action at this time.