乐趣区

关于网络编程:网络编程入门从未如此简单一假如你来设计网络会怎么做

本文原题“如果让你来设计网络”,由闪客 sun 分享,转载请分割作者。

1、引言

网络编程能力对于即时通讯技术开发者来说是基本功,而计算机网络又是网络编程的实践根基,因此粗浅精确地了解计算机网络常识显然能夯实你的即时通讯利用的实际品质。

本文格调相似于 52im 社区里的《网络编程懒人入门》、《脑残式网络编程入门》两个系列,但艰深又不失外延,简洁又不简陋,非常适合对计算机网络常识有向往但又有害怕的网络编程爱好者们浏览,心愿能给你带来不一样的网络常识入门视角。

本篇次要以通俗易懂的文风,疏导你了解计算机网络是如何演化成今日的样子,文中交叉了集线器、替换杨、路由器等设施的应用背景以及技术原理,由浅入深,非常适合入门者浏览。

本文已同步公布于“即时通讯技术圈”公众号,欢送关注。公众号上的链接是:点此进入。

2、系列文章

本文是该系列文章中的第 1 篇:

  • 《网络编程入门从未如此简略(一):如果你来设计网络,会怎么做?》(本文)
  • 《网络编程入门从未如此简略(二):如果你来设计 TCP 协定,会怎么做?(稍后公布 …)》

本文是系列文章中的开篇,次要波及计算机网络的物理层、数据链路层、网络层。

3、阶段 1:就两台电脑,要网络作甚

你是一台电脑,你的名字叫 A。

很久很久以前,你不与任何其余电脑相连接,孤苦伶仃。

直到有一天,你心愿与另一台电脑 B 建设通信,于是你们各开了一个网口,用一根 网线 连贯了起来。

用一根网线连接起来怎么就能 ” 通信 ” 了呢?我能够给你讲 IO、讲中断、讲缓冲区,但这不是钻研网络时该关怀的问题。

如果你纠结,要么去钻研一下操作系统是如何解决网络 IO 的,要么去钻研一下包是如何被网卡转换成电信号发送进来的,要么就仅仅把它当做电脑里有个君子在 开枪 吧~

反正,你们就是连起来了,并且能够通信。

4、阶段 2:电脑多起来了,须要组个网

4.1 集线器

有一天,一个新搭档 C 退出了,但聪慧的你们很快发现,能够每个人开 两个网口 ,用一共 三根网线,彼此相连。

随着越来越多的人退出,你发现身上开的网口切实太多了,而且网线稀稀拉拉,凌乱不堪。(PS:实际上一台电脑基本开不了这么多网口,所以这种连线只在实践上可行,所以连不上的我就用红色虚线示意了,就是这么谨严哈哈~)

于是你们创造了一个中间设备,你们将网线都插到这个设施上,由这个设施做转发,就能够彼此之间通信了,实质上和原来一样,只不过网口的数量和网线的数量缩小了,不再那么凌乱。

你给它取名叫:集线器 ,它仅仅是无脑将电信号 转发到所有进口 (播送),不做任何解决,你感觉它是没有智商的,因而把人家定性在了 物理层

4.2 MAC 地址

因为转发到了所有进口,那 BCDE 四台机器怎么晓得数据包是不是发给本人的呢?

首先,你要给所有的连贯到集线器的设施,都起个名字。原来你们叫 ABCD,但当初须要一个更业余的,全局惟一 的名字作为标识,你把这个更高端的名字称为 MAC 地址

你的 MAC 地址是 _aa-aa-aa-aa-aa-aa_,你的搭档 b 的 MAC 地址是 bb-bb-bb-bb-bb-bb,以此类推,不反复就好。

这样,A 在发送数据包给 B 时,只有在头部拼接一个这样构造的数据,就能够了。

B 在收到数据包后,依据头部的指标 MAC 地址信息,判断这个数据包确实是发给本人的,于是便 收下

其余的 CDE 收到数据包后,依据头部的指标 MAC 地址信息,判断这个数据包并不是发给本人的,于是便 抛弃

尽管集线器使整个布局洁净不少,但原来我只有发给电脑 B 的音讯,当初却要发给连贯到集线器中的所有电脑,这样既不平安,又不节俭网络资源。

5、阶段 3:一个网不够用了,得级连组网

5.1 交换机

如果把这个集线器弄得更智能一些:“只发给指标 MAC 地址指向的那台电脑”,就好了。

尽管只比集线器多了这一点点区别,但看起来仿佛有智能了,你把这货色叫做:交换机 。也正因为这一点点智能,你把它放在了另一个层级: 数据链路层

如上图所示,你是这样设计的。

5.2 以太网

交换机外部保护一张 MAC 地址表,记录着每一个 MAC 地址的设施,连贯在其哪一个端口上。

如果你依然要发给 B 一个数据包,结构了如下的数据结构从网口进来。

达到交换机时,交换机外部通过本人保护的 MAC 地址表,发现 指标机器 B 的 MAC 地址 bb-bb-bb-bb-bb-bb 映射到了端口 1 上,于是把数据从 1 号端口发给了 B,完事~

你给这个通过这样传输方式而组成的小范畴的网络,叫做:以太网

当然最开始的时候,MAC 地址表是空的,是怎么逐渐建设起来的呢?

5.3 MAC 地址表

如果在 MAC 地址表为空是,你给 B 发送了如下数据

因为这个包从端口 4 进入的交换机,所以此时交换机就能够在 MAC 地址表记录第一条数据:

MAC:aa-aa-aa-aa-aa-aa-aa

端口:4

交换机看指标 MAC 地址(bb-bb-bb-bb-bb-bb)在地址表中并没有映射关系,于是将此包发给了所有端口,也即发给了所有机器。

之后,只有机器 B 收到了的确是发给本人的包,于是做出了响应,响应数据从端口 1 进入交换机,于是交换机此时在地址表中更新了第二条数据:

MAC:bb-bb-bb-bb-bb-bb

端口:1

过程如下:

通过该网络中的机器一直地通信,交换机最终将 MAC 地址表建设结束~

5.4 交换机级连

随着机器数量越多,交换机的端口也不够了,但聪慧的你发现,只有将多个交换机连接起来,这个问题就轻而易举搞定~

你齐全不须要设计额定的货色,只须要依照之前的设计和规矩来,依照上述的接线形式即可实现所有电脑的互联,所以交换机设计的这种规定,真的很奇妙。你想想看为什么(比方 A 要发数据给 F)。

然而你要留神,下面那根 红色 的线,最终在 MAC 地址表中可不是一条记录呀,而是要把 EFGH 这四台机器与该端口(端口 6)的映射全副记录在表中。

最终,两个交换机将别离记录 A ~ H 所有机器的映射记录

右边的交换机:

左边的交换机:

这在只有 8 台电脑的时候还好,甚至在只有几百台电脑的时候,都还好,所以这种交换机的设计形式,曾经足足撑持一阵子了。

但很遗憾,人是贪心的动物,很快,电脑的数量就倒退到几千、几万、几十万。

6、阶段 4:电脑多到头大,须要更简单的网络

6.1 路由器

交换机曾经无奈记录如此宏大的映射关系了。

此时你动了歪脑筋,你发现了问题的基本在于,连进来的那根红色的网线,前面不晓得有多少个设施一直地连贯进来,从而使得地址表越来越大。

那我可不可以让那根红色的网线,接入一个新的设施,这个设施就跟电脑一样有本人独立的 MAC 地址,而且同时还能帮我把数据包做一次转发呢?

这个设施就是路由器,它的性能就是,作为一台独立的领有 MAC 地址的设施,并且能够帮我把数据包做一次转发,你把它定在了网络层。

留神:路由器的每一个端口,都有独立的 MAC 地址!

好了,当初交换机的 MAC 地址表中,只须要多出一条 MAC 地址 ABAB 与其端口的映射关系,就能够胜利把数据包转交给路由器了,这条搞定。

那如何做到,把发送给 C 和 D,甚至是把发送给 DEFGH…. 的数据包,通通先发送给路由器呢?

6.2 Mac 地址不是万能的

不难想到这样一个点子,如果电脑 C 和 D 的 MAC 地址领有独特的前缀,比方别离是:

C 的 MAC 地址:FFFF-FFFF-CCCC

D 的 MAC 地址:FFFF-FFFF-DDDD

那咱们就能够说:将指标 MAC 地址为 FFFF-FFFF-?结尾的,通通先发送给路由器。

这样是否可行呢?答案是否定的。

咱们先从事实中 MAC 地址的构造动手,MAC 地址也叫物理地址、硬件地址,长度为 48 位,个别这样来示意:

00-16-EA-AE-3C-40

它是由网络设备制造商生产时烧录在网卡的 EPROM(一种闪存芯片,通常能够通过程序擦写)。其中 前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家本人调配的,个别示意系列号。只有不更改本人的 MAC 地址,MAC 地址在世界是惟一的。

形象地说:MAC 地址就如同身份证上的身份证号码,具备唯一性。

那如果你心愿向下面那样示意将指标 MAC 地址为 FFFF-FFFF-?结尾的,对立从路由器进来发给某一群设施(前面会提到这其实是子网的概念),那你就须要要求某一子网下通通买一个厂商制作的设施,要么你就须要要求厂商在生产网络设备烧录 MAC 地址时,提前依照你布局好的子网构造来定 MAC 地址,并且日后这个网络的构造都不能轻易扭转。

这显然是不事实的。

6.3 IP 地址

于是你创造了一个新的地址,给每一台机器一个 32 位的编号,如:

11000000101010000000000000000001

你感觉有些不清晰,于是把它分成四个局部,两头用点相连:

11000000.10101000.00000000.00000001

你还感觉不清晰,于是把它转换成 10 进制:

192.168.0.1

最初你给了这个地址一个嘹亮的名字:IP 地址

当初每一台电脑,同时有本人的 MAC 地址,又有本人的 IP 地址,只不过 IP 地址是 软件层面 上的,能够随时批改,MAC 地址个别是无奈批改的。

这样一个能够随时批改的 IP 地址,就能够依据你布局的网络拓扑构造,来调整了。

如上图所示:如果我想要发送数据包给 ABCD 其中一台设施,不管哪一台,我都能够这样形容:”将 IP 地址为 192.168.0 结尾的全副发送给到路由器,之后再怎么转发,交给它!“,奇妙吧。

6.4 路由原理

那交给路由器之后,路由器又是怎么把数据包精确转发给指定设施的呢?

别急咱们慢慢来。

咱们先给下面的组网形式中的每一台设施,加上本人的 IP 地址:

当初两个设施之间传输,除了加上数据链路层的头部之外,还要再减少一个网络层的头部。

如果 A 给 B 发送数据,因为它们间接连着交换机,所以 A 间接收回如下数据包即可,其实网络层没有体现出作用。

但如果 A 给 C 发送数据,A 就须要先转交给路由器,而后再由路由器转交给 C。因为最底层的传输依然须要依赖以太网,所以数据包是分成两段的。

A ~ 路由器这段的包如下:

路由器到 C 这段的包如下:

好了,下面说的两种状况(A -> B、A -> C),置信仔细的读者应该会有不少疑难,上面咱们一个个来开展。

7、路由器的衍生知识点

路由器的原理也就是咱们在上节中提到的那样,路由器看起来如同也没啥了不起的,但事实并非如此。

实际上,路由器是互联网的次要结点设施,能够这样说:正是路由器形成了互联网的通信骨架。

正因为如此,对于入门者而言,跟路由器无关的知识点(包含路由原理等)所波及的疑难,其实会十分多,本节将着重探讨几个重要的方面。

7.1 子网和子网掩码

上章中: A 给 C 发数据包,怎么晓得是否要通过路由器转发呢?
答案是:子网。

如果源 IP 与目标 IP 处于一个子网,间接将包通过交换机收回去;

如果源 IP 与目标 IP 不处于一个子网,就交给路由器去解决。

好,那当初只须要解决什么叫“处于一个子网”这个疑难就好了。

192.168.0.1 和 192.168.0.2 处于同一个子网

192.168.0.1 和 192.168.1.1 处于不同子网

这两个是咱们人为规定的,即咱们想示意,对于 192.168.0.1 来说:

192.168.0.xxx 结尾的,就算是在一个子网,否则就是在不同的子网。

那对于计算机来说,怎么表白这个意思呢?于是人们创造了 子网掩码 的概念。

如果:某台机器的子网掩码定为 255.255.255.0。

这示意:将源 IP 与目标 IP 别离同这个子网掩码进行 与运算,相等则是在一个子网,不相等就是在不同子网,就这么简略。

比方:

A 电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0

B 电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0

C 电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0

D 电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0

那么 A 与 B 在同一个子网,C 与 D 在同一个子网,然而 A 与 C 就不在同一个子网,与 D 也不在同一个子网,以此类推。

所以:如果 A 给 C 发消息,A 和 C 的 IP 地址别离 & A 机器配置的子网掩码,发现不相等,则 A 认为 C 和本人不在同一个子网,于是把包发给路由器,就不论了,之后怎么转发,A 不关怀

7.2 默认网关

上章中:A 如何晓得,哪个设施是路由器?
答案是:在 A 上要设置默认网关。

上一步 A 通过是否与 C 在同一个子网内,判断出本人应该把包发给路由器,那路由器的 IP 是多少呢?

其实说发给路由器不精确,应该说 A 会把包发给 默认网关

对 A 来说,A 只能 间接 把包发给同处于一个子网下的某个 IP 上,所以发给路由器还是发给某个电脑,对 A 来说也不关怀,只有这个设施有个 IP 地址就行。

所以:默认网关就是 A 在本人电脑里配置的一个 IP 地址,以便在发给不同子网的机器时,发给这个 IP 地址。

仅此而已!

7.3 路由表

上章中:路由器如何晓得 C 在哪里?
答案是:路由表。

当初 A 要给 C 发数据包,曾经能够胜利发到路由器这里了。

一个问题就是:路由器怎么晓得,收到的这个数据包,该从本人的哪个端口进来,能力间接(或间接)地最终达到目的地 C 呢。

路由器收到的数据包有目标 IP 也就是 C 的 IP 地址,须要转化成从本人的哪个端口进来,很容易想到,应该有个表,就像 MAC 地址表一样。

这个表就叫 路由表

至于这个路由表是怎么进去的,有很多路由算法,本文不开展,因为我也不会哈哈 ~

不同于 MAC 地址表的是,路由表并不是一对一这种明确关系,咱们上面看一个路由表的构造。

咱们学习一种新的示意办法,因为子网掩码其实就示意前多少位示意子网的网段,所以如 192.168.0.0(_255.255.255.0_)也能够简写为 192.168.0.0/24。

这就很好了解了:路由表就示意,192.168.0.xxx 这个子网下的,都转发到 0 号端口,192.168.1.xxx 这个子网下的,都转发到 1 号端口。下一跳列还没有值,咱们先不论。

配合着上面的结构图来看(这里把子网掩码和默认网关都补齐了)图中 & 笔误,后果应该是 .0。

7.4 ARP 协定

疑难:下面说的都是 IP 层,但发送数据包的数据链路层须要晓得 MAC 地址,可是我只晓得 IP 地址该怎么办呢?
答案:ARP 协定。

如果你(A)此时不晓得你伙伴 B 的 MAC 地址(事实中就是不晓得的,刚刚咱们只是假如已知),你只晓得它的 IP 地址,你该怎么把数据包精确传给 B 呢?

答案很简略:在网络层,我须要把 IP 地址对应的 MAC 地址找到,也就是通过某种形式,找到 192.168.0.2 对应的 MAC 地址 BBBB。

这种形式就是 ARP 协定,同时电脑 A 和 B 外面也会有一张 ARP 缓存表,表中记录着 IP 与 MAC 地址的对应关系。

一开始的时候这个表是 空的 ,电脑 A 为了晓得电脑 B(192.168.0.2)的 MAC 地址,将会 播送 一条 ARP 申请,B 收到申请后,带上本人的 MAC 地址给 A 一个 响应。此时 A 便更新了本人的 ARP 表。

这样通过大家一直播送 ARP 申请,最终所有电脑外面都将 ARP 缓存表更新残缺。

8、小结一下

好了,小结一下,到目前为止就几条规定。

从各个节点的视角来看。。。

电脑视角:

  • 1)首先我要晓得我的 IP 以及对方的 IP;
  • 2)通过子网掩码判断咱们是否在同一个子网;
  • 3)在同一个子网就通过 arp 获取对方 mac 地址间接扔出去;
  • 4)不在同一个子网就通过 arp 获取默认网关的 mac 地址间接扔出去。

交换机视角:

  • 1)我收到的数据包必须有指标 MAC 地址;
  • 2)通过 MAC 地址表查映射关系;
  • 3)查到了就依照映射关系从我的指定端口收回去;
  • 4)查不到就所有端口都收回去。

路由器视角:

  • 1)我收到的数据包必须有指标 IP 地址;
  • 2)通过路由表查映射关系;
  • 3)查到了就依照映射关系从我的指定端口收回去(不在任何一个子网范畴,走其路由器的默认网关也是查到了);
  • 4)查不到则返回一个路由不可达的数据包。

如果你嗅觉足够敏锐,你应该能够感触到上面这句话:

网络层(IP 协定)自身没有传输包的性能,包的理论传输是委托给数据链路层(以太网中的交换机)来实现的。

波及到的三张表别离是:

  • 1)交换机中有 MAC 地址表用于映射 MAC 地址和它的端口;
  • 2)路由器中有路由表用于映射 IP 地址 (段) 和它的端口;
  • 3)电脑和路由器中都有 ARP 缓存表用于缓存 IP 和 MAC 地址的映射关系。

这三张表是怎么来的:

  • 1)MAC 地址表是通过以太网内各节点之间一直通过交换机通信,不断完善起来的;
  • 2)路由表是各种路由算法 + 人工配置逐步完善起来的;
  • 3)ARP 缓存表是一直通过 ARP 协定的申请逐步完善起来的。

晓得了以上这些,目前网络上两个节点是如何发送数据包的这个过程,就齐全能够解释通了!

9、最初一波战斗

那接下来咱们就放上本章 最初一个 网络拓扑图吧,请做好最初的 战斗 筹备!

这时路由器 1 连贯了路由器 2,所以其路由表有了下一条地址这一个概念,所以它的路由表就变成了这个样子。如果匹配到了有下一跳地址的一项,则须要再次匹配,找到其端口,并找到下一跳 IP 的 MAC 地址。

也就是说找来找去,最终必须能映射到一个端口号,而后从这个端口号把数据包收回去。

这时:如果 A 给 F 发送一个数据包,能不能通呢?如果通的话整个过程是怎么的呢?

思考一分钟 …

具体过程动画形容:

具体过程文字描述:
【1】首先 A(_192.168.0.1_)通过子网掩码(_255.255.255.0_)计算出本人与 F(_192.168.2.2_)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254)。
【2】A 通过 ARP 找到 默认网关 192.168.0.254 的 MAC 地址。
【3】A 将源 MAC 地址(_AAAA_)与网关 MAC 地址(_ABAB_)封装在数据链路层头部,又将源 IP 地址(_192.168.0.1_)和目标 IP 地址(_192.168.2.2_)(留神:这里千万不要认为填写的是默认网关的 IP 地址,从始至终这个数据包的两个 IP 地址都是不变的,只有 MAC 地址在一直变动)封装在网络层头部,而后发包:

【4】交换机 1 收到数据包后,发现指标 MAC 地址是 _ABAB_,转发给路由器 1。
【5】数据包来到了路由器 1,发现其指标 IP 地址是 _192.168.2._2,查看其路由表,发现了下一跳的地址是 _192.168.100.5_。
【6】所以此时路由器 1 须要做两件事,第一件是再次匹配路由表,发现匹配到了端口为 2,于是将其封装到数据链路层,最初把包从 _2 号口_收回去。
【7】此时路由器 2 收到了数据包,看到其目标地址是 _192.168.2.2_,查问其路由表,匹配到端口号为 1,筹备从 _1 号口_把数据包送出去。
【8】但此时路由器 2 须要晓得 192.168.2.2 的 MAC 地址了,于是查看其 arp 缓存,找到其 MAC 地址为 _FFFF_,将其封装在数据链路层头部,并从 _1 号端口_把包收回去。
【9】交换机 3 收到了数据包,发现目标 MAC 地址为 _FFFF_,查问其 MAC 地址表,发现应该从其 _6 号端口_进来,于是从 _6 号端口_把数据包收回去。
【10】F 最终收到了数据包!并且发现目标 MAC 地址就是本人,于是收下了这个包。

10、写在最初

至此,通过物理层、数据链路层、网络层这前三层的协定,以及依据这些协定设计的各种网络设备(网线、集线器、交换机、路由器),实践上只有领有对方的 IP 地址,就曾经将地球上任意地位的两个节点连通了。

本文通过了很屡次的批改,删减了不少影响主流程的内容,就是为了让读者能抓住网络传输前三层的真正核心思想。同时网络相干的常识也是多且杂,我也还有很多搞不清楚的中央,十分欢送大家探讨交换,共同进步。

本文下篇《网络编程入门从未如此简略(二):如果你来设计 TCP 协定,会怎么做?(稍后公布 …)》,敬请期待!

附录:举荐浏览

  • 《通俗易懂 - 深刻了解 TCP 协定(上):实践根底》
  • 《通俗易懂 - 深刻了解 TCP 协定(下):RTT、滑动窗口、拥塞解决》
  • 《网络编程懒人入门(一):疾速了解网络通信协定(上篇)》
  • 《网络编程懒人入门(二):疾速了解网络通信协定(下篇)》
  • 《网络编程懒人入门(三):疾速了解 TCP 协定一篇就够》
  • 《网络编程懒人入门(四):疾速了解 TCP 和 UDP 的差别》
  • 《网络编程懒人入门(五):疾速了解为什么说 UDP 有时比 TCP 更有劣势》
  • 《网络编程懒人入门(六):史上最艰深的集线器、交换机、路由器性能原理入门》
  • 《网络编程懒人入门(七):深入浅出,全面了解 HTTP 协定》
  • 《网络编程懒人入门(八):手把手教你写基于 TCP 的 Socket 长连贯》
  • 《网络编程懒人入门(九):艰深解说,有了 IP 地址,为何还要用 MAC 地址?》
  • 《网络编程懒人入门(十):一泡尿的工夫,疾速读懂 QUIC 协定》
  • 《网络编程懒人入门(十一):一文读懂什么是 IPv6》
  • 《网络编程懒人入门(十二):疾速读懂 Http/ 3 协定,一篇就够!》
  • 《脑残式网络编程入门(一):跟着动画来学 TCP 三次握手和四次挥手》
  • 《脑残式网络编程入门(二):咱们在读写 Socket 时,到底在读写什么?》
  • 《脑残式网络编程入门(三):HTTP 协定必知必会的一些常识》
  • 《脑残式网络编程入门(四):疾速了解 HTTP/ 2 的服务器推送(Server Push)》
  • 《脑残式网络编程入门(五):每天都在用的 Ping 命令,它到底是什么?》
  • 《脑残式网络编程入门(六):什么是公网 IP 和内网 IP?NAT 转换又是什么鬼?》
  • 《脑残式网络编程入门(七):面视必备,史上最艰深计算机网络分层详解》
  • 《脑残式网络编程入门(八):你真的理解 127.0.0.1 和 0.0.0.0 的区别?》
  • 《脑残式网络编程入门(九):面试必考,史上最艰深大小端字节序详解》
  • 《高性能网络编程(一):单台服务器并发 TCP 连接数到底能够有多少》
  • 《高性能网络编程(二):上一个 10 年,驰名的 C10K 并发连贯问题》
  • 《高性能网络编程(三):下一个 10 年,是时候思考 C10M 并发问题了》
  • 《高性能网络编程(四):从 C10K 到 C10M 高性能网络应用的实践摸索》
  • 《高性能网络编程(五):一文读懂高性能网络编程中的 I / O 模型》
  • 《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》
  • 《高性能网络编程(七):到底什么是高并发?一文即懂!》
  • 《从根上了解高性能、高并发(一):深刻计算机底层,了解线程与线程池》
  • 《从根上了解高性能、高并发(二):深刻操作系统,了解 I / O 与零拷贝技术》
  • 《从根上了解高性能、高并发(三):深刻操作系统,彻底了解 I / O 多路复用》
  • 《从根上了解高性能、高并发(四):深刻操作系统,彻底了解同步与异步》
  • 《从根上了解高性能、高并发(五):深刻操作系统,了解高并发中的协程》
  • 《IM 开发者的零根底通信技术入门(十一):为什么 WiFi 信号差?一文即懂!》
  • 《IM 开发者的零根底通信技术入门(十二):上网卡顿?网络掉线?一文即懂!》
  • 《IM 开发者的零根底通信技术入门(十三):为什么手机信号差?一文即懂!》
  • 《IM 开发者的零根底通信技术入门(十四):高铁上无线上网有多难?一文即懂!》
  • 《IM 开发者的零根底通信技术入门(十五):了解定位技术,一篇就够》

本文已同步公布于“即时通讯技术圈”公众号。

▲ 本文在公众号上的链接是:点此进入。同步公布链接是:http://www.52im.net/thread-3296-1-1.html

退出移动版