网游中的网络编程3:在UDP上建立虚拟连接
目录
- 网游中的网络编程系列1:UDP vs. TCP
- 网游中的网络编程2:发送和接收数据包
- 网游中的网络编程3:在UDP上建立虚拟连接
- TODO
二、在UDP上建立虚拟连接
介绍
UDP是无连接的,一个UDPsocket可以被用做,与任意数量的计算机交换数据包。然而,在多人游戏中,我们只希望在一小部分建立起连接的计算中,交换数据包。
所以,我们需要做的第一步就是:在UDP上让两台计算机,建立起虚拟连接。
但是,首先,我们先深入到底层,弄清楚互联网是如何工作的。
互联网不是一系列的电话线
在2006年, Senator Ted Stevens做了一个互联网历史上,著名的一次演讲:
“The internet is not something that you just dump something on. It’s not a big truck. It’s a series of tubes”
当我第一次使用互联网的是:1995年,我在大学的计算机实验室中,我用Netscape浏览器上网,当时漫无目的的瞎逛。
我当时想:每次连上一个网站,就产生一些“真实的连接”,就像电话线。我十分惊奇,当我每次访问一个新的网站的时候需要花费多少钱?(作者当时认为,每次访问网站都是建立在一条通信线路之上,就像电话线,需要拉线)不会有人找上门,让我付这些线路的费用吧?
当然,这个想法现在看起来很傻。
没有直接的连接
互联中:没有一条通信电缆,直接通信的两台计算机。数据是由IP协议,通过数据包,从一个个电脑传递过来的。(就像传纸条)
一个数据包可能通过几个计算机才能到达目的地。你不能知道准确的传递过程(第一步,第二步。。。),这个过程是会变化的,是根据网络质量决定数据包的下一步走向。你可能发送过两个数据包A和B到同一个地址,它们可能走的是不同的路线。这个也是数据包无序的一个原因。
在Linux和Unix系统上(win可以用‘tracert’),可以使用‘traceroute’指令来查看数据包的传递线路和途径的主机名和IP地址。traceroute请参考
试一下traceroute指令:
traceroute: Warning: baidu.com has multiple addresses; using 220.181.57.217
traceroute to baidu.com (220.181.57.217), 64 hops max, 52 byte packets
1 192.168.1.1 (192.168.1.1) 4.727 ms 4.960 ms 4.144 ms
2 223.20.160.1 (223.20.160.1) 13.405 ms 6.047 ms 8.561 ms
3 218.241.252.185 (218.241.252.185) 4.735 ms 2.130 ms 7.771 ms
4 218.241.252.197 (218.241.252.197) 6.849 ms 5.335 ms 4.555 ms
5 202.99.1.217 (202.99.1.217) 4.025 ms 13.324 ms 3.761 ms
6 * 218.241.244.21 (218.241.244.21) 8.492 ms
218.241.244.9 (218.241.244.9) 5.389 ms
7 218.241.244.33 (218.241.244.33) 6.699 ms 4.851 ms 5.386 ms
8 * * *
注意:第八行是因为有ICMP防火墙,请求被拒绝了,所以没有探测出目的ip地址。
这个过程就能诠释:没有直接的连接。
如何收到数据包
正如第一篇文章,举的那个简单的例子:收到数据包,就像在一个房间,人们手递手传纸条。
互联网是网络的网络(网络的集合)。当然我们不仅在一个小房子中传递信件,我们能把它传到世界各地。
最好的例子是邮局系统!
当你想要发一封信给别人,你需要把你的信放到邮箱中,同时你会相信会到达收件人的手上。信件怎么到的,你不需要关心,反正到了。总得有人把你的信送到目的地,那么到底是怎么送到的呢?
首先,邮递员不会拿着你的信,直接送到目的地!邮递员拿着你的信,送到当地邮局,让邮局处理。
如果这封信是本地的,本地的邮局会收过来,安排让另外一个邮递员直接送到目的地。但是,如果信的地址不是本地的,那么本地的邮局不会直接把信送到目的地,所以邮局会送到上一级(镇邮局送到市邮局),或者送到临近城市的邮局,如果目的地太远就会送到飞机场。信件的传输方式是用大卡车。
我们来看一个例子:假定一封信,从洛杉矶寄到北京,本地邮局接收到信,然后发现是国际信件,就直接送到洛杉矶的邮件中心。这封信,确认收件的地址无误,就安排到下一班飞机飞往北京的航班。
飞机着陆在北京,北京的邮件系统肯定是和洛杉矶的邮件系统不一样。北京的邮件中心收到这封信后,就送到具体的区级的当地邮局,最终,这封信会通过一个邮递员直接送到收件人的手里。
就像邮局系统,通过地址传递信件一样。网络传递数据包是通过IP地址。传递数据包的细节和路径选择是非常复杂的,但是基本思想:每个路由器都是一台计算机,由路由表决定数据下一步走的地址。(这部分我省略了一些路由和路由表的部分,我没有看懂,后面研究明白,回来再补全。现在不影响后面的阅读)
编辑路由表的工作是网络管理员的工作,不是我们这些程序员关心的问题(还好
网游中的网络编程3:在UDP上建立虚拟连接的更多相关文章
- 网游中的网络编程系列1:UDP vs. TCP
原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...
- Socket网络编程TCP、UDP演示样例
Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(O ...
- 第84节:Java中的网络编程(中)
第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...
- 第78节:Java中的网络编程(上)
第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...
- 第62节:探索Java中的网络编程技术
前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...
- 网络编程第三讲UDP编写
网络编程第三讲UDP编写 一丶UDP简介 UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP UDP不需要建立建立. 下面有UDP编写流程图 下图 ...
- C#网络编程入门之UDP
目录: C#网络编程入门系列包括三篇文章: (一)C#网络编程入门之UDP (二)C#网络编程入门之TCP (三)C#网络编程入门之HTTP 一.概述 UDP和TCP是网络通讯常用的两个传输协议,C# ...
- Java中的网络编程
Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...
- JAVA中-面向网络编程---单层交互
面向网络编程---单层交互: 客户端说明: /* * 实现TCP客户端,链接到服务器 * 和服务器实现数据交互 * 实现TCP客户端的类 java.net.Scoket * 构造方法: * Socke ...
随机推荐
- Lucene 4.X 倒排索引原理与实现: (1) 词典的设计
词典的格式设计 词典中所保存的信息主要是三部分: Term字符串 Term的统计信息,比如文档频率(Document Frequency) 倒排表的位置信息 其中Term字符串如何保存是一个很大的问题 ...
- windows批处理
1.日期作为变量当做文件名的一部分. C:\Documents and Settings\Simon>echo %date%2008-09-09 星期二 C:\Documents and Set ...
- android对象关系映射框架ormlite之一对多(OneToMany)
前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...
- Linux 输出文件列数,拼接文件
如果我只想看看文件的前几行,每行的字段数(列数),我的文件已tab作为分隔符(这个可以自己指定),其具体命令如下: head fileName | awk -F'\t' '{print NF}' 如果 ...
- ASP.NET MVC 5 局部视图不支持异步问题
[ChildActionOnly] public async Task<ActionResult> TopLeftFlowPartialView() { var user = Sessio ...
- 【C#】剪切出图片的一部分
, , , ); Bitmap bmpNew = bmpBase.Clone(rect, bmpBase.PixelFormat); // 画像をGIF形式で保存 string ...
- iOS开发——高级技术精选&底层开发之越狱开发第一篇
底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...
- MSSql使用SQL语句快速查看表对的就说明,及表字段描述及字段类型
--表描述 SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties ds LEFT JOIN sysobjects tbs ON ds. ...
- Openvswitch原理与代码分析(8): 修改Openvswitch代码添加自定义action
有时候我们需要自定义一些自己的action,根据包头里面的信息,做一些自己的操作. 例如添加一个action名为handle_example 第一.修改ofp-actions.c文件 首先 ...
- git删除远程文件夹或文件的方法
由于本地修改了文件夹大全名大小写的原因,同步到git上并不区分大小写,造成了一些文件同步不了,所以要先把git远程库上文件夹删除掉,然后再重新同步 如下,我把src里的全部移除,但是本地文件还保留. ...