subject_16231.htm

来自「一些关于vc的问答」· HTM 代码 · 共 126 行

HTM
126
字号
<p>
序号:16231 发表者:任我行 发表日期:2002-09-26 16:13:11
<br>主题:Internet上两个局域网中的机器,是否可以直接通信
<br>内容:如果可以怎么实现!谢谢大家参与讨论。oicq应该就是通过这种方法实现的聊天
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:Redspider 回复日期:2002-09-27 16:43:39
<br>内容:我猜测应该是udp mapping,局域网里的机器必须先给公网上机器发一个udp报文,proxy会截获它并为它分配一个udp port,外界就可以通过这个proxy ip + proxy port与局域网中的机器通讯。但我做试验的结果不大稳定。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:任我行 回复日期:2002-09-27 16:56:36
<br>内容:proxy怎么为它分配udp port,由操作系统做的吗?我怎么能得到这个端口。可否写一下你的测试程序,或是发到我的信箱zhangzhen@bba.com.cn,非常感谢你的回答。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Redspider 回复日期:2002-09-27 17:36:19
<br>内容:proxy实际上是被当作网关的,所有到外网的ip包都是首先发到它那儿,它自然有机会做这些工作。要得到端口,你必须在公网上先放个机器,开一个udp socket,占一个port,然后lan上的机器就往这个公网ip+port发一个udp的包,如果公网上的机器收到的话(因为还有报文丢失的情况),通过getpeername就能得到proxy的ip和port。<BR><BR>试验的程序因为很短,所以早就弄丢了,不过也仅仅只是个udp收发的程序,并且在收到报文时显示对方的ip和port,没什么特殊性的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Tuu Puu 回复日期:2002-09-28 08:48:26
<br>内容:oicq那不是直接通讯,是先发到腾讯的服务器再转的。你试试“二人世界”,那个直接的,在两个局域网中会失败,或者给对方发送一个文件看看,也没戏。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Redspider 回复日期:2002-09-28 09:03:18
<br>内容:二人世界、文件传输和普通聊天信息的收发是不同的,是基于TCP的,而且也不经过服务器。想象一下,几十万人同时在线,要是经过服务器再转,恐怕腾讯的机房要起火了。两个LAN中机器当然是无法建立直接的TCP连接的。所以才要用到UDP。<BR><BR>聊天信息在对方离线或者发后没收到回应报文,才会交给服务器中转,这时消息上会加上一行“通过服务器中转”的信息
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:任我行 回复日期:2002-09-28 09:25:27
<br>内容:1.7 QQ采用何种通信协议<BR><BR>  QQ采用标准的TCP/IP协议为通信协议。<BR>  TCP/IP协议中又分为TCP协议和UDP协议,TCP协议是面向连接的协议,它比较安全、稳定,但是效率不高,占用资源较多。UDP协议是无连接方式的协议,它的效率高,速度快,占资源少,但是其传输机制为不可靠传送,必须依靠辅助的算法来完成传输控制。QQ采用的通信协议以UDP为主,辅以TCP协议。由于QQ的服务器设计容量是海量级的应用,一台服务器要同时容纳十几万的并发连接,因此服务器端只有采用UDP协议与客户端进行通讯才能保证这种超大规模的服务。 <BR>  QQ客户端之间的消息传送也采用了UDP模式,这不同于国外的ICQ在客户端之间采用TCP进行通讯的模式。因为国内的网络环境非常复杂,而且很多用户采用的方式是通过代理服务器共享一条线路上网的方式,在这些复杂的情况下,客户端之间能彼此建立起来TCP连接的概率较小,严重影响传送信息的效率。而UDP包能够穿透大部分的代理服务器,因此我们在开发QQ的时候选择了UDP作为客户之间的主要通信协议,因此网友会觉得用QQ传送信息要比ICQ及其它采用TCP协议的ICQ类软件快。当然,UDP协议优点突出,缺点也很明显:UDP包的传送是不可靠的传输,它不象TCP一样有包重传等机制,因此采用UDP协议的信息在传送过程中很容易丢失,这样就需要辅助的算法实现包重传机制以保证信息不会丢失,而QQ服务器的负荷非常重,因此在QQ 99b 0425之前我们只是在客户端到客户端之间传送消息时采用了这个辅助的机制,当消息在客户间直接传送无法到达时就需要通过服务器来中转,由于服务器端在老版本的时候迫于负荷过重的压力没有对主动发往客户端的信息进行传输控制,因此在老版本的时候容易造成通过服务器中转的信息丢失的现象。在QQ99c 0725之后我们单独设立出了几台专用的服务器采用包重传机制来中转消息(仅限于99c之间传递的消息),确保通过服务器转发的消息也能够发送到对方的QQ。<BR><BR><BR>以上载自腾讯主页,它的第二段中说两个客户端是没有通过服务器,是UDP连接。<BR>redspider:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先谢谢你的回答,你在第二次的回答中"你必须在公网上先放个机器,开一个udp socket,占一个port,然后lan上的机器就往这个公网ip+port发一个udp的包",那么我就要在这台公网的机器中做一个转发的程序了,是这个意思吗?<BR>tempask:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也谢谢你的回答,但是腾讯说他的oicq是两个客户端直接相连的 。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Tuu Puu 回复日期:2002-09-28 09:39:00
<br>内容:我认为不可能,两个都在局域网中udp也无法跨越,无法寻址(只能看到网关地址),你可以按腾讯说的来理解。在这方面udp和tcp没有本质区别,你再弄弄看吧<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Tuu Puu 回复日期:2002-09-28 09:41:56
<br>内容:另外上面提到proxy,那样就不是直接发送接收,有中间点,有中间点自然可以,它可以剥出内部地址信息(从接收到的包中)直接打入到回复包中,这样就可以回去(这个是tcp/ip底层处理,不用自己做程序来管理控制)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:任我行 回复日期:2002-09-28 10:08:35
<br>内容:不知是否可以真正实现,所以拿出来讨论,你上面提到的转发,我认为是操作系统来完成的,而不是TCP/IP底层做的。不知我说的是否正确。比如局域网中的qq要和腾讯服务器连接,他首先和局域网中的服务器建立socket连接,然后服务器再和腾讯服务器建立连接,这样数据就可以准确的发送到局域网中的各个机器了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Redspider 回复日期:2002-09-28 10:14:25
<br>内容:是得到客户机上的通信地址,并转发给其它客户机。这个通信地址实际是指向proxy上的。<BR><BR>举例:<BR><BR>lan1上的机器A,192.168.0.10,其代理服务器pa为202.96.0.10<BR>lan1上的机器B,192.168.1.11,其代理服务器pb为202.96.1.11<BR><BR>server为202.96.2.20<BR><BR>A向S的某个固定端口发一个udp包,该包被pa截获,并为其分配一个端口20400,将udp包中的源地址和源端口改为202.96.0.10和20400,再发给S,S就得到A的通信地址: 202.96.0.10 : 20400<BR><BR>同样的方式得到B的通信地址,202.96.1.11: 20102,然后S再将A的通信地址发给B,即将信息202.96.0.10+20400发向202.96.1.11: 20102,pb将完成转发。<BR><BR>此后B可以向A的通信地址202.96.0.10+20400发udp报文,A可以直接收到。<BR><BR>也就是说,服务器的作用是获取双方的代理地址和端口并转达该信息。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Redspider 回复日期:2002-09-28 10:18:19
<br>内容:代理服务器(如wingate、sygate)负责完成这种报文替换的工作,前提是lan上的机器必须把代理服务器当作网关,这样代理程序将可以通过底层方式直接接管网卡报文的收发,在得到要求自己转发的报文时,它会将该报文提取出来,如tcp/udp/icmp等不同类型,采用不同的方式替换掉报文中的源地址和源端口信息,同时本地也要分配一些转发资源。<BR><BR>和ip协议栈没关系。也不是os做的(除非windows那样专门提供这样的功能,如nt + ms proxy )。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Tuu Puu 回复日期:2002-09-28 10:25:39
<br>内容:是可以,但是如果没有腾讯服务器你就不可能通过它和另一个在局域网中的通讯(你本身也在局域网中),反之如果你或对方有独立ip,无独立ip段端配置上对方的ip就能通讯,而不需要设置什么服务器,按我的理解这才叫直接通讯,而不是象腾讯这样
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Tuu Puu 回复日期:2002-09-28 10:27:22
<br>内容:只想问下对“直接通信”的理解了?好像几个人对这个看法很不一样
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:任我行 回复日期:2002-09-28 10:36:35
<br>内容:谢谢你们的回答,我的本意就是redspider所说的那个答案,我有时间试一试看看行不行,
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Redspider 回复日期:2002-09-28 10:40:34
<br>内容:如果你把它当作概念上的一个名词,那就随你自己定义了。重要的是其实际含义。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Tuu Puu 回复日期:2002-09-28 10:46:07
<br>内容:扯,肯定要依赖第三台机器才能通讯那能叫直接通信?qq那肯定要它的服务器,否则你拿它给我通个信看看
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Redspider 回复日期:2002-09-28 10:59:44
<br>内容:在服务器完成地址交换之后,客户机之间的通讯的确是不再需要中心服务器的。至于代理服务器,自然是少不了的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Tuu Puu 回复日期:2002-09-28 11:01:38
<br>内容:那还是,你的意思是说如果我给两台机器,然后用级联线连起来,两边tcp配通,能通讯,给你两个qq,因为没有"服务器完成地址交换"就无法通讯?这样也能叫能直接通讯,那就这样了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Redspider 回复日期:2002-09-28 11:08:33
<br>内容:看来你喜欢跟人斗嘴,不陪你了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:和风 回复日期:2002-12-24 16:35:48
<br>内容:谢谢Redspider的精彩解答!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?