Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/wangkechun/computernetworkcoursedesign

我的计算机网络课程设计
https://github.com/wangkechun/computernetworkcoursedesign

Last synced: 7 days ago
JSON representation

我的计算机网络课程设计

Awesome Lists containing this project

README

        

# 计算机网络课程设计

---
##### 目前我正在寻找暑假实习,欢迎访问 [r.hi-hi.cn](http://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 则是可以代理
4. 发送 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)
5. 接受服务器返回的自身地址和端口,连接完成
6. 以后操作和直接与目的方进行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)
- 支持中文目录名和文件名

------------