【读书笔记】iOS-深入解剖对等网络

数据分析侠 2018-02-28

协议本身是一个运行在UDP之上的定制协议。我所以决定使用一个定制协议很简单。首先,当前这个任务看起来足够简单,因此与尝试改进一个现在协议相比,直接构建一个定制协议更为容易。其次,定制协议可以将开销减少至最小并尽可能地提高性能。最后,这本身就是一个很好的教学练习。

TCP是一个流协议,每次查看网页,检查邮件或者下载文件时使用的就是TCP协议。从本质上讲,TCP会在两个计算机之间建立一个双向管道,并尽其所能地掩盖其底层网络的不可靠性和不确定性。

UDP会暴露很多不确定性。它使用一个校验和来确保不会传递被攻破的数据,但它并不会做任何尝试来掩盖出现问题。如果一个路由器决定丢掉一个数据包,那么这个数据永远不会被接收。如果一个较早的数据包被延迟,以至于较晚到达,数据的妆收就会乱序。因此,要由各个应用采取措施对这些问题做出补偿。

但是UDP使用的资源更少,而且能提供更好的性能。本质上TCP是基于连接的,所以,对于应用要通信的每一个远程设备都必须建立并维持连接,而如果计划支持大量此类设备,开销就会非常大。另外,TCP会尝试恢复,但是恢复要花费时间。与之不同,UDP只是跳过丢包,继续发送后续的更新。如果你追求性能,而且能够应对丢失数据,那么UDP是上选。这正是在vocie-over-IP应用,在线游戏以及这个示例工程中使用UDP的原因。

坐标就是32位有符号整数。这有些大材小用,因为iPhone屏幕只有320*480,不过这样可以为将来留出余地。至于颜色,没有必要使用大于单字节的类型来表示各个颜色分量。这样一来,每个分量的取值范围就是0~255,这已经是大多数屏幕所能再现的最大颜色分辨率。

C编译器总是会牺牲空间来换取速度,如果计算机处理的数据是对齐的,处理速度则最快,所谓对齐是指数据所在的内存地址恰好是其大小的倍数。int32_t类型是4字节,所以编译器会尝试使其地址是4的倍数。

前一种体系称为大端字节序,后一种称为小端字节序。目前,Mac中使用的Intel x86 CPU采用小端字节序,iPhone中使用的ARM CPU也是如此。较早的Mac中使用的PowerPC处理器采用大端字节序,一般的,通常会看到不同平中上分别使用不同的字节序。如果使用不正确 字节序读取数据,会得出混乱而且毫无意义的数字,所以,明确字节序非常重要。

实际上,至少还存在另外一种字节序:中间端字节序!在一些较早的,少见的体系结构中,并没有使用前向也没有使用向后顺序,而是采用了一种奇怪的混合顺序,对于事例整数305 419 896,会写为{0x34,0x12,0x78,0x56}.正是由于在这样一些较老的系统上存储字符串”UNIX“时会表示为”NUXI“,所以区别字节序的问题有时称为”NUXI问题"。

参考资料:《精彩iPhone炫酷开发-七位一线高手的编程和设计范例》

相关推荐