Skip to content

supertanglang/ComputerNetworkCourseDesign

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

63 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#计算机网络课程设计


#####目前我正在寻找暑假实习,欢迎访问 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连接
  6. 向服务器的1080端口建立udp连接
  7. 向服务器发送 05 01 00
  8. 如果接到 05 00 则是可以代理
  9. 发送 05 03 00 01 00 00 00 00 + 本地UDP端口(2字节)
  10. 服务器返回 05 00 00 01 +服务器地址+端口
  11. 需要申请方发送 00 00 00 01 +目的地址IP(4字节)+目的端口 +所要发送的信息
  12. 当有数据报返回时 向需要代理方发出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)
  • 支持中文目录名和文件名

About

我的计算机网络课程设计

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 61.0%
  • Python 39.0%