刚开始做视频网站,要选择什么来加速?
目前加速用的比较多的方式有两种,一个是CDN加速,一个是P2P加速。CDN加速的话就是购买供应商相应的CDN加速服务,国内很多服务器运营商都有做这种业务。这个的好处就是在建立连接的时候比较快,不过缺点就是你人数多了之后可能要增加这个节点数或者带宽,而且这个费用是按月计费的。
还有就是自己搭建p2p的服务器,搭建自己的服务器(也可以不用搭建服务器,直接服务端用cdn,或者http服务器),然后使用BT技术开发自己的客户端软件。这种方式有点有很多:
A)节省服务器带宽:这个是p2p众所周知的优点,这里就不多加赘述了。
B)可以多源下载:这个是人们往往忽略的,经常有人问我说:如果只有一个人下载,此时p2p是不是就没什么好处了。其实这个也是不对的。就算只有一个人下载,这个用户如果用普通http,一般是从单个服务器下载,如果遇到这个服务器比较慢,他只能忍受。但如果是p2p的系统,p2p后端可以有多台服务器,比如你购买10几台美国服务器,带宽又便宜,又不限流量,这种模式下,下载是从10几台服务器一起下载,速度还是要快,而且就算一台服务器宕机,也一点不影响下载,这个其实也是p2p的一个很大的好处。服务器运维时,上下线对用户没有任何影响。
C)天然的防盗链:p2p协议如果不用标准的BT协议,是完全可以自定义一些私有传输协议的。这种协议,用户几乎无法去盗链你的资源,除非他自己写一个一样协议的p2p软件,所以这方面优势比http好太多。
D)用户下载速度比HTTP快:因为多源下载,所以自然速度就比单服务器模式速度可以快。
E)成本低:不同于http模式,p2p的服务器不一定放优质机房,可以只少量放机房。很多服务器可以用美国的低价服务器,1G带宽一个月就1000多人民币,这价格秒杀很多国内机房。2008年以前,我还见过有人是租一些民房,放一些普通电脑,用来做p2p加速。特别是找一些带宽上传便宜的地区,因为很多民用带宽在很多地区1年只有几百块就能拿到的。
F)安全和校验:P2P传输可以用私有协议、文件内置了hash指纹校验防篡改数据,这这安全性非常高。几乎文件没有篡改的可能。
前言
STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。
TURN,首先在RFC5766中定义,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中继穿透NAT:STUN的扩展
简单的说,TURN与STURN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。
ICE的全称Interactive Connectivity Establshment(互动式连接建立),由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。
STUN和TURN服务器和ICE可以参考阅读: P2P技术详解(三):P2P技术之STUN、TURN、ICE详解
本文介绍如何通过DOCKER搭建STUN和TURN服务器,步骤如下
1:创建Dockerfile,内容如下:
FROM ubuntu:1404
MAINTAINER Patxi Gortázar <patxigortazar@gmailcom>
RUN apt-get update && apt-get install -y \
curl \
libevent-core-20-5 \
libevent-extra-20-5 \
libevent-openssl-20-5 \
libevent-pthreads-20-5 \
libhiredis010 \
libmysqlclient18 \
libpq5 \
telnet \
wget
RUN wget http://turnserveropen-sysorg/downloads/v4422/turnserver-4422-debian-wheezy-ubuntu-mint-x86-64bitstargz \
&& tar xzf turnserver-4422-debian-wheezy-ubuntu-mint-x86-64bitstargz \
&& dpkg -i coturn_4422-1_amd64deb
COPY /turnserversh /turnserversh
ENV TURN_USERNAME test
ENV TURN_PASSWORD test
ENV REALM kurentoorg
ENV NAT true
EXPOSE 3478 3478/udp
ENTRYPOINT ["/turnserversh"]
2:创建turnserversh,内容如下
#!/bin/bash
set-e
if[$NAT="true"-a-z"$EXTERNAL_IP"];then
#Try to get public IP
PUBLIC_IP=$(curl http://169254169254/latest/meta-data/public-ipv4)||echo"No public ip found on http://169254169254/latest/meta-data/public-ipv4"
if[-z"$PUBLIC_IP"];then
PUBLIC_IP=$(curl http://icanhazipcom)||exit1
fi
#Try to get private IP
PRIVATE_IP=$(ifconfig|awk'/inet addr/{print substr($2,6)}'|grep -v 127001)||exit1
exportEXTERNAL_IP="$PUBLIC_IP/$PRIVATE_IP"
echo"Starting turn server with external IP:$EXTERNAL_IP"
fi
echo'min-port=49152'>/etc/turnserverconf
echo'max-port=65535'>>/etc/turnserverconf
echo'fingerprint'>>/etc/turnserverconf
echo'lt-cred-mech'>>/etc/turnserverconf
echo"realm=$REALM">>/etc/turnserverconf
echo'log-file stdout'>>/etc/turnserverconf
echo"user=$TURN_USERNAME:$TURN_PASSWORD">>/etc/turnserverconf
[$NAT="true"]&&echo"external-ip=$EXTERNAL_IP">>/etc/turnserverconf
exec/usr/bin/turnserver"$@"
3:使用docker build 创建镜像,执行结果如下
[root@www]# docker build -t teststurn_1
Sending build context to Docker daemon 4096kB
Step 1/11 : FROM ubuntu:1404
---> 6e4f1fe62ff1
Step 2/11 : MAINTAINER Patxi Gortázar <patxigortazar@gmailcom>
---> Using cache
---> 4460f9f84053
Step 3/11 : RUN apt-get update && apt-get install -y curl libevent-core-20-5 libevent-extra-20-5 libevent-openssl-20-5 libevent-pthreads-20-5 libhiredis010 libmysqlclient18 libpq5 telnet wget
---> Using cache
---> 05ed9ced48a5
Step 4/11 : RUN wget http://turnserveropen-sysorg/downloads/v4422/turnserver-4422-debian-wheezy-ubuntu-mint-x86-64bitstargz && tar xzf turnserver-4422-debian-wheezy-ubuntu-mint-x86-64bitstargz && dpkg -i coturn_4422-1_amd64deb
---> Using cache
---> d82ed28fdac9
Step 5/11 : COPY /turnserversh /turnserversh
---> Using cache
---> 1d37a488282c
Step 6/11 : ENV TURN_USERNAME test
---> Running in bfd88f08db42
Removing intermediate container bfd88f08db42
---> cf8af0504b95
Step 7/11 : ENV TURN_PASSWORD test
---> Running in b8ef33b7c213
Removing intermediate container b8ef33b7c213
---> 32a832f23169
Step 8/11 : ENV REALM kurentoorg
---> Running in bbe129edf5b3
Removing intermediate container bbe129edf5b3
---> 21fdfe34689b
Step 9/11 : ENV NAT true
---> Running in 5bdfe8555d5e
Removing intermediate container 5bdfe8555d5e
---> dc7fc896841c
Step 10/11 : EXPOSE 3478 3478/udp
---> Running in 67aaa1966f68
Removing intermediate container 67aaa1966f68
---> a12646ed45ff
Step 11/11 : ENTRYPOINT ["/turnserversh"]
---> Running in b8fc2ff09265
Removing intermediate container b8fc2ff09265
---> f5e5acad0f81
Successfully built f5e5acad0f81
Successfully tagged teststurn_1:latest
执行完后可以看到自己创建的镜像名称为teststurn_1
4:启动docker的镜像,并开启端口3478
docker run -d -p 3478:3478 -p 3478:3478/udp teststurn_1
启动后需要等待一两分钟才能测试顺畅
5:测试服务器效果
打开 https://webrtcgithubio/samples/src/content/peerconnection/trickle-ice/ 并输入自己的本机IP和端口,分别测试两种协议服务是否生效
实现P2P的方式很多,NAT系列,花生系列、零遁系列都可以实现,如后者就是P2P通信,数据不走服务器。安全、稳定、可靠。接法也很简单。有两种模式,有LAN模式和WAN模式两种可供选择,接好后简单的配置就能实现异地P2P组网。
基于p2p的即时聊天和文件传输软件
摘 要
随着计算机网络技术的飞速发展,人们对于网络的依赖性也越来越大。通过网络的即时通信也越来越受到人们的喜爱,比如说现在非常流行的QQ即时通信软件就解决了人们在网络中交流的需求。
基于p2p的即时聊天和文件传输软件,是基于tcp/ip协议中的tcp和udp协议完成的一个能够完成即时通信和传输文件的软件,该软件实现了局域网内的通行,在不需要使用公网的情况下,使用该软件作为通信和传输文件的工具,既简单又安全。
该软件采用了通信模型中的p2p模型,使用java语言实现,实现原理较简单功能较单一,界面美化度较低。是一款简单的即时通信和文件传输软件。
关键词: 计算机网络 ; p2p ; tcp ; udp ; 通信和文件传输软件
目 录
1 引言 1
11 课题背景 1
12 国内外现状 1
13 本课题研究的迫切性 1
14 本文的主要工作 1
2需求分析和开发工具 1
21需求分析 1
22开发工具 2
3系统总体结构设计 3
31 基本简介 3
32 系统功能模块设计 3
33 功能模块介绍 4
4系统流程与实现 5
41 系统设计流程 5
411 即时聊天功能的流程设计5
412 文件传输功能系统实现6
42实现 8
5 测试 10
结 论 13
参考文献 13
1 引言
11 课题背景
网络的发展促进了通信的发中,通信的发展反过来让网络发展的更大更快,通信作为我们日常生活中不可或缺的东西,正在改变着人们的生活。比如说QQ即时通信软件就为人们的生活和学习带来了极大的方便。但是人们有时需要和与自己同一个局域网内的用户通信而通信的内容不通过公网来保证通信的安全,防止黑客或者一些心怀不轨的人通过非法的手段获取到通信的内容。因为一旦信息泄露了就有可能带来不可估量的损失。在这种情况下,基于p2p的即时聊天和文件传输的软件就产生了。
12 国内外现状
网络的普及也让一些人获得了获取了更多的信息。通过窃听,篡改,重放等攻击
的手机来阻止,或者是窃取别人的有用信息,这种事在一些大型的公司里曾经就发生过。现在一些大型的公司自己会去开发适合自己公司的即时通信软件来防止此类的安全事件出现,因此基于p2p的即时聊天和文件传输的应用开发现在仍然受到关注。
13 本课题研究的迫切性
基于p2p的即时聊天和文件传输软件的实现能够帮助我们了解基于p2p的软件的实现原理和过程,为我们以后开发一些大型的p2p的软件提供了技术上的保证。同时该软件能够用于局域网的通信和传输文件,具有一定的实际意义。
14 本文的主要工作
本文主要介绍了基于p2p的即时聊天和文件传输的软件的实现原理和实现的过
程,针对软件的原理和过程进行深入的讲解。同时本文可以作为基于p2p的即时聊天和文件传输的软件的使用说明书,通过具体而详细的阐述,让大家更容易的理解基于p2p的即时聊天和文件传输的软件的实现原理和实现的过程。
2需求分析和开发工具
21需求分析
由于国内外的安全现状不容乐观,人们通信的时的信息很容易会被黑客们获取,为
了在局域网中安全简单的痛信,人们就开发了基于p2p的即时通信和文件传输软件。该软件能够实现在局域网内和其他人通信,从而保证了通信的安全,让人们拥有更加安全和简单的痛信环境。同时,由于该软件是使用java语言开发,具有平台无关性。能够在不同的操作系统的平台下完成即时通信和文件传输的功能。
22.p2p的即时聊天和文件传输软件的功能
p2p的即时聊天和文件传输软件有以下功能:
(1)局域网内点对点通信,
能够同一时间和多个人,在不同的ip和端口上实现通信
(2)简单文件传输
能够传输1M以上的文件
(3)能够在多个平台下实现通信
Java平台无关性
22开发工具
开发环境 java
开发工具 Myeclipse
TCP协议的工作流程下图所示:
UDP协议的工作流程下图所示:
3系统总体结构设计
31 基本简介
p2p的即时聊天和文件传输软件采用tcp和udp协议,使用java语言实现基于p2p的
即时聊天和文件传输的功能。同时,由于采用java语言实现具备了在多种平台下运行的优点。该软件主要包括两大部分,聊天部分和文件传输部分。聊天部分采用了udp协议,文件传输部分采用了tcp协议。
32 系统功能模块设计
p2p的即时聊天和文件传输软件实现了以下功能
(1)即时聊天功能
(2)文件传输功能
(3)记录查询聊天内容
33 功能模块介绍
即时聊天功能采用udp协议实现。聊天时用户必须输入通信对方的ip和端 口号 ,对
方只需要知道消息发送方的端口号,就能够收到信息。对方收到信息后,同样必须输入ip才能回复消息给对方。通信模型如下图
聊天功能实现模型图
文件传输功能是采用tcp协议实现的,tcp协议的面向连接,可靠性,面向字节流
等优点,以及差错控制,流量控制等特点,保证了文件传输的可靠性。整个流程是,文件发送方首先选择文件,在选择文件后,先发送文件的名称和大小给接收者。接收这如果同意接收文件则由接收者作为客户端向发送端发起连接,连接建立后,发送端开始传送文件给接收端。实现模型如下图所示
文件传输功能
4系统流程与实现
41 系统设计流程
411 即时聊天功能的流程设计
采用DUP协议设计即时聊天功能,在即时聊天功能中,设计了一个发送端和一个接收端,发送端和接收端处于同一个平台中,为了使通信双方能够造一次连接中进行多次通信在接收端采用了多线程,实现多次通信。
在通信建立的时候,通信的发起方首先填写通信的ip地址和port端口,然后发送消息给接收者。接受者需要在同样的端口上等待发起者的信息。
发送端:
发送端工作流程图
接收端:
接收端工作流程图 412 文件传输功能系统实现
使用TCP协议实现文件传输功能,在文件传输开始时,由发送方给接收方发送一个消息,消息内容为待发送文件的文件名和长度。接收端收到后判断是不是传送的文件,如果是传送的文件接收方择是否接收文件。然后开始传输文件,文件传输完成后,自动关闭服务器端和客户端。
发送端:
接收端:文件传输发送端工作流程
N
42实现
基于p2p的即时通信和文件传输软件的实现是采用窗体的形式。在实现过程中设计到几点主要的功能
首先即时通信功能的发送端的实现,首先创建DUP的socket套接字和UDP
数据报包
在数据包中写入消息发送到接收端。
主要实现代码:
public void send() throws Exception{
DatagramSocket ds2=new DatagramSocket();
DatagramPacket dp2=new DatagramPacket(strmsggetBytes(),
strmsggetBytes()length,InetAddressgetByName(ip),port);
ds2send(dp2);
ds2close();
}
接收端,还是创建DUP的socket套接字和UDP数据报包,然后接收数据。 DatagramSocket ds=new DatagramSocket(port);//udp的socket
DatagramPacket dp=new 套接字
DatagramPacket(buf,buflength);//udp数据报包
dsreceive(dp);
传送文件的实现过程:
发送文件的窗体采用另一个frame完成,在frame中完成了,选择和发送文件
sendmessage sm = new
sendmessage("file"+filepathgetText()toString(),
mainFrameipgetText(),IntegerparseInt(mainFrameportgetText()toString()));
smsend();
ServerSock ss=new
ServerSock(IntegerparseInt(mainFrameportgetText()toString()),filepathgetText()toString());
ssstart();
选择文件后,发送端使用UDP发送文件名和文件大小给接收端。如果接收端确认,就开始传输文件
接收后,显示的接收和拒接的信息,以供接收端接收
if(new String(buf)substring(0, 4)equals("file")){ mainFramejieshoufilesetText("收到文件:"+str+"是否接收?");
mainFramejieshouwenjiansetEnabled(true); mainFramejieshouwenjiansetEnabled(true);
mainFramejieshouwenjiansetText("接收"); mainFramejujuesetText("拒绝"); }
接收端点击接受后,创建clientsocket去连接服务器端,然后服务器开始传送文件
new Client(jfcgetSelectedFile()getPath())
接收数据
public DataInputStream getMessageStream() throws Exception {
try {
getMessageStream = new DataInputStream(new
BufferedInputStream(socketgetInputStream()));
return getMessageStream;
} catch (Exception e) {
eprintStackTrace();
if (getMessageStream != null)
getMessageStreamclose();
throw e;
} finally {
}
写入到文件
while (true) {
int read = 0;
if (inputStream != null) {
read = inputStreamread(buf);
}
passedlen += read;
if (read == -1) {
peak;
}
5 测试
软件界面,发送端和接收采用一个软件进行通信。
发送端:
接收端:
文件发送端
文件接收端
结 论
基于p2p的即时聊天和文件传输的软件有效解决了局域网内通信的问题,实现了局域网内即时聊天和文件传输。在软件实现的过程充分运用了在网络编程中学习的TCP和UDP的socket编程,并把二者有效的结合。通过这次课程设计,也掌握了文件传输和聊天的过程中的java实现。在设计过程中查阅了相关的java API和一些实现即时聊天和文件传输的例子,从中学习到了很多书本上没有的知识。为自己在以后的软件开发中积累了一些经验。
同时软件的设计和实现过程中也存在很多问题。比如,人机交互界面的设计不是很合理,在文件传输时就不能做其他的事情。没有运用多线程实现等等。这些问题说明了我在平时的学习中还需要合理有效的运用所学知识去设计和实现。
参考文献
[1]甘刚Linux/NUIX网络编程[M].北京:中国水利水电出版社,2008。
[2] 叶树华.网络编程实用教程[M].北京:人民邮电大学出版社,2010。
[3] 杜佳荣, 马建红, 滕振宇.Java网络编程技术与实践[M].北京:清华大学出版社,2008。
拨号上网的两台机器互联失败,因为拨号上网的IP地址会更改的,基本上拨一次号更换一下IP地址
建议用独立固定IP的服务器来运作 。
这个也是为什么大家都用服务器,放在专属的网通电信机房,而不放在自己办公室的原因是一样的
因为办公室的网络是拨号上网,IP会变,所以没有办法控制、
希望能帮助你,有服务器相关需求可以联系我 陈秋稳
网速慢的原因有很多,可能是病毒木马、p2p下载软件、共享上网、宽带线路老化、不同网络环境等。本文将为大家介绍网速慢的解决办法。
0条评论