zoukankan      html  css  js  c++  java
  • 成功进行了一次UDP打洞

    测试环境:
    服务端是公网固定IP;两个客户端A和B分别位于不同电脑不同宽带不同型号路由(一个家庭路由,一个企业路由),且路由没有经过特别的设置。
    测试没有什么特别的地方,只是依照网络资料进行实验。

    说明:
    当A端用UDP向服务端发送了一个包后,在服务端就得到A端来路的IP和端口:xxx.xxx.xxx.101:5841
    当B端用UDP向服务端发送了一个包后,在服务端就得到B端来路的IP和端口:xxx.xxx.xxx.105:12584

    *上面的IP和端口获取方式,C#用socket.RemoteEndPoint,VB的Winsock控件用RemoteHostIP和RemotePort属性

    这时A、B两端的路由就相当于是打开一个通道来给A、B向外通信。不光是服务端可以和A、B通信,由于通道已经打开了,那么:
    A就可以向B已经打开的通道(B=xxx.xxx.xxx.105:12584)直接发送信息。
    同理:
    B也可以向A已经打开的通道(A=xxx.xxx.xxx.101:5841)直接发送信息。

    *貌似A、B之间通信有一个先后顺序,我忘记了~,反正都发送试试就行了

    最后:UDP通信在一些情况下比TCP要“灵敏”一些(可能用词有点不妥,我也不知道该怎么形容)。
    比如有的时候宽带已经拨号成功了,TCP却怎么都连接不上服务器,浏览器打开网页也一样,要等很久的时间后TCP才能正常通信。
    而在TCP不能连接的这段时间,UDP却是正常的。
    但是使用UDP绝对不是一个省心的活:

    --需要设计一套合理的通讯包协议
    --数据不是有序的,分别发送几个数据包,有可能先发的数据后到
    --有丢包的可能,对信息完整性要求高的话,还需要重发处理
    --由于是无连接协议,要自己考虑心跳包通知在线状态判别
    --对适应性要求高的需要配合TCP交叉使用

    现在的网络环境都比较好,UDP发送的成功率能达到98、99%,甚至更高吧(我没有做足够大量的测试,只是感觉)。

    在当时复杂,不稳定的网络环境下,QQ竟然选择以UDP为主要的通信协议,而同期的ICQ和MSN等都以TCP为主,可以说马化腾当时的设计是激进而大胆的。
    模仿并不意味着追随和落后,重要的能够在一个旧框架下注入新的思维。这也应该是马成功的必然性之一吧。

  • 相关阅读:
    c语言博客作业04--数组
    C博客作业03--函数
    c博客作业02--循环结构
    C博客作业01--顺序分支结构
    我的第一篇博客
    java--购物车程序的面向对象设计
    c博客作业05--指针
    C博客作业04--数组
    C博客作业03--函数
    C博客作业02--循环结构
  • 原文地址:https://www.cnblogs.com/xiii/p/5052586.html
Copyright © 2011-2022 走看看