这些时间,一直在想自己的毕业设计的实现。本来做了一个简单的。但是和自己的计划的内容相差太远了。结合网络的知识,加上编程。我想做的毕业设计有以下内容
1:自定义协议传输文件
2:高效率传输
3:用户体验良好
4:扩展性能良好
5:层次结构明显
计划使用的编程语言:Linux下使用C++和Java,Windows下使用C++和C#。
C++主要做传输层业务和文件的合并业务。而在Linux下,其实可以全用C++,因为本来用C#和Java的目的其实就是写界面。但是我想弄一个有点技术含量的,所以并没有想要在Linux下要界面,给他一个配置文件。但是这样对我的Linux下编程能力是个很大的考验。
但是这次的毕业设计主要还是在Windows 下,演示,答辩。所以还是先处理Windows下的问题。
技术解决方案:
1.文件监控
2.协议定义
3.数据传输,使用UDP,目的是
1)高效
2)方便UDP打洞
3) 减少服务器的负荷
4)使网络资源节约
但是使用UDP就会遇到问题,
1)确认用户在线
2)数据包无序,无确认
解决方案:
1)在定义时间内,每单位时间,向服务器发一次“Hello”包,表示自己的存在
2)UDP是无序的,但是可以将收到的包,首先缓存在一个存储空间,在文件包完整后,由一个业务,将其组织成一个完整的文件
3)UDP无确认,可以在自定义的协议内加确认和校验。比如现在发到底130个包,但是第69个包一直没有收到,如果当68号包收到10s后,将从新 请求这一个数据包,客户端将重新发送。在之后的数据如果还收到这个包,则直接在过滤层将其抛掉。
4.提高效率:
1)客户端开放三个连续的端口,第一个端口是用于接受和发送一些基本的信息,比如登录,文件的前探包(自定的,就是在每一次发送或者请求文件时,将发送一个 包,用于建立一条通道。)第二个端口是发送文件,第三个端口是接受文件。这样可以使客户端的接受和发送两不误。直接的影响是网络的带宽等的限制,软件 的影响不大。
2)分布应用端也是一个端口是固定的监听基本信息。一旦有具体的文件请求,建立一个通道,直接在这个通道内发送数据,不再经过总的那个端口。这样可以提高 效率。一旦使用完毕,系统将收回通道,等到下一次分配。
但是现在遇到一个问题是关于UDP的内网打洞。因为这个打洞要的是对等的NAT,而且现在有一个问题是讲过NAT之后,传出去的数据包还能获得客户端的监听端口吗?因为这些端口是随机分配的。如果可以,那样就可以解决。如果不能就需要在登录的时候就处理,在协议中直接携带端口到服务器。可以在客户端封装协议的时候,直接将端口封装进协议。这样就可以解决通过NAT传输后变化端口。但是这样有一个问题,通过NAT之后,比如我第一个端口是3330,但是第二个端口是33301,第三个是33302,首先发了一个请求包是通过3330端口发送的,这样NAT是分配的是3330的对应的端口,而建立33301的通道就不知道到底NAT会如何分配通道。
解决方案,可以在协议中携带第一个端口,但是当通道建立好还是直接想第一个端口发送,发送的内容是过滤层的通道建立地址,这样当客户端第一个端口接收到数据,就可以按照请求的需求,通过第二或者第三个端口,想过滤服务器发送一个通道确认包,过滤端就可以获得NAT后的地址。这样就可以把通道建立起来。就可以不使用UDP打洞。用UDP通道还有一个好处好像是可以绕过防火墙之类的。