发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
QQ的文字通信采用UDP通信方式,UDP的特点是发送后不管;缺点是不保证数据的到达、不保证数据的正确到达以及数据到达后的顺序性,但是优点在于即时性与编程的简单性。
对于单向发送数据(假设A->B),有以下几种情形:(以下内容中外网和公网是一个概念,内网和局域网是一个概念)
CASE1:A具有一个公网IP,B具有一个公网IP:很简单地,沿路的路由会毫无疑问地把A的消息转发至B,反之亦然;
CASE2:A在局域网内,B具有公网IP:仅考虑单向传输,数据传送难度和情况1相同;
CASE3:A在公网,B在局域网:
不如前两种情况容易实现。
考虑一下,你怎么才能知道B在局域网中的地址?B又在几层局域网之下?B的每一层路由从上一层分配到的内网IP又是多少?不要以为这是很特殊的情况,我们在清水河就是这种情况:一般寝室里有1个路由,假设我们从这个路由分配到的IP可能是192.168.1.8,然后这个路由又从宿舍楼的交换器上分配到的IP可能是113.54.140.10,然后不知道宿舍楼的交换机还有没有上层局域网,假设它就直接接入到公网IP 125.71.229.128(这是清水河校区的公网IP)。
然后讨论一下外网中的计算机怎么把数据发送到你的电脑:
A方案:端口映射:
路由器一般都有这个功能,假设你分配到的IP是192.168.1.8。
去路由器设置中的虚拟服务器设置中可以看到端口映射选项,如果你把80端口映射到你的IP,那么你搭建的web服务器(使用80端口)就可以被这个路由的上层网络访问了。
怎么访问呢,在路由器的上层网络所包含的任意一台主机(本楼的任意一台主机)上输入路由IP+端口113.54.140.10:80或者直接在浏览器里面输入路由IP就可以访问到你在路由器下这个局域网中搭建的web页面了;同理使用其他端口的应用也如此。然后我们对交换机做映射,把80端口映射给你的路由路由的IP 192.168.1.8,整个环节相当于:
访问125.71.229.128:80(寝室楼交换机接入公网的IP)->跳转至113.54.140.10:80(路由接入交换机的IP)->跳转至192.168.1.8:80(你的电脑接入路由的IP),然后获取到你的计算机的80端口的服务,外网的计算机就能看到你搭建在内网的web页面了。假设QQ的默认端口是1234,那么你就层层映射1234端口,同样的道理。
可事实上这种办法不适用QQ这种通信工具,原因如下:
a,设置麻烦;
b,映射一个端口只能供一个用户使用,而端口有限,其他应用程序的端口要求会受到侵犯;
c,降低你电脑网络环境的安全性,因为这相当于打开了一扇直通你电脑的门,而路由本身对外网的屏蔽性的优点被你舍弃了;
d,交换机可不是你想设置就能设置的;
e,再说QQ就不是这么做的
所以讨论下一种方法:
B方案:既然内网能没问题地连接上外网计算机,那么可以让内网计算机把它的网络路径情况都告诉给外网计算机,然后外网计算机把路径给写入IP报文里,让路由负责转发就是了。
可实际上因为IP报文里无法包含除了目标地址和源地址以外的信息,于是连内网计算机自己都不清楚自己到外网经过的路径的情况,更不用说外网计算机把这些信息写在它发送出的IP报文里了。
再说,路由的端口对外网都是默认关闭的。
C方案:内网穿透(NAT):
其实路由器有个功能,从内网发送出的数据经过的端口会在一定时间内保持打开状态,这段时间内外网可以从这个端口送入数据;
假设一个数据包经过了这样的路径:192.168.1.8:345->113.54.140.10:1234->125.71.229.128:2345,那么在一定时间内,如果有个数据包发送给125.71.229.128:2345,它就会沿原路相反方向被送到192.168.1.8:345。
CASE 4:A和B都在内网,这时候A和B都不知道对方的地址,那么就需要一个架设在公网的服务器来作为二者的沟通了。
这也就是后面自己编写QQ要用到的知识,如果涉及到文件和图片的传输,还涉及到端口预测和TCP连接的建立。因为只教大家写文字版的QQ,所以有这些就够了。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。