协议本身是一个运行在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炫酷开发-七位一线高手的编程和设计范例》

【读书笔记】iOS-深入解剖对等网络的更多相关文章

  1. 【读书笔记】iOS-苹果的网络

    一,网络结构. 1,客户端服务器网络结构. 客户端服务器网络结构是一种主从网络结构.服务器是被动的,有点像餐厅的服务员.而客户端是主动的,像在餐厅吃饭的顾客. 2,对等网络结构. 对等网络也叫点对点网 ...

  2. 读书笔记汇总 --- 用Python写网络爬虫

    本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...

  3. 【读书笔记】iOS-网络-底层网络

    在iOS上,有一个库叫做Core Foundation networking或CFNetwork,它是对原始Socket的轻量级封装,不过它很快对于大多数常见场景来说变得非常笨重了.最后,添加了另一层 ...

  4. 【读书笔记】iOS-网络-保护网络传输

    一,验证服务器通信. 二,HTTP认证. 手机银行应用有两种认证模式:标准验证与快速验证.标准验证只是提示用户输入用户名与密码,而快速验证则让用户注册设备,然后使用PIN进行验证,每次验证时无需用户名 ...

  5. 《UNIX网络编程 卷1:套接字联网API》读书笔记(一):网络编程简介

    概述 要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的协议.大多数网络是按照划分成客户和服务器来组织的.本章及后续章节的焦点是TCP/IP协议族,也可称为网际协议族.下图为客户与服务器 ...

  6. [读书笔记]iOS 7 UI设计 对比度

    好久没写随笔了,最近在读<iOS 7 byTutorials>,很不错,推荐给大家. 每一个好的程序员也都是一个设计师,不懂设计的程序员不是好的CTO.哈哈,开个小玩笑. iOS 7设计的 ...

  7. $《第一行代码:Android》读书笔记——第10章 Android网络编程

    (一)WebView的用法 1.WebView也是一个普通的控件. 2.常用用法: WebView webView = (WebView)findViewById(R.id.web_view); we ...

  8. INSPIRED启示录 读书笔记 - 第37章 大众网络服务产品

    十大要点 1.可用性:大众网络服务产品必须具备良好的用户体验 2.人物角色:按典型特征将用户分类,抽象出有代表性的用户类型(人物角色) 3.扩展性:应该不间断地考虑扩展性问题,永远留有余地,不到万不得 ...

  9. 读书笔记-iOS核心动画高级技巧

    如果不使用+imageNamed:,那么把整张图片绘制到CGContext可能是最佳的方式了. 这里我们利用了CALayer的KVC来存储和检索任意的值,将图层和索引打标签. 使用KVC打标签

随机推荐

  1. Jedis 操作 Redis 工具类

    配置类 pom.xml pom.xml 里配置依赖 <dependency> <groupId>redis.clients</groupId> <artifa ...

  2. php cli模式和浏览器访问下加载php.ini文件的注意事项[架构篇]

    使用wampserver或Xampp时,会将配置文件放在一个统一的目录中去调用,这时如果都使用浏览器访问,自然是没有问题的,但是如果换成cli命令行模式运行,则会出现加载了的扩展无法使用的问题. 案例 ...

  3. ElasticSearch权威指南学习(文档)

    什么是文档 在Elasticsearch中,文档(document)这个术语有着特殊含义.它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasti ...

  4. Ubuntu下几个命令行方式使用的图片浏览工具

    想找几个Ubuntu下可以以命令行方式使用的图片浏览工具. Google了一些资料,找到下面几个web: 1.pho:轻巧的命令行图片查看器 其中介绍了工具pho,其功能特点,见下面的转帖内容: ph ...

  5. 用O(1)的时间复杂度删除单链表中的某个节点

    给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...

  6. setting-mirrorO以及下载jar包流程简介

    mirrorOf常见的几种配置如下 1.* 2.repo3 3.repo1,repo2,*,!repo3 4.external:* 第二个例子只配置了一个repo3,这个镜像只能匹配id是repo3的 ...

  7. 【xsy2332】Randomized Binary Search Tree DP+FFT

    题目大意:给你一个$[0,1]$之间等概率随机序列,你需要把这个序列插入到一棵$treap$中,问这棵$treap$的期望深度,请对于$[1,n]$中的每个深度分别输出它的概率(实数,保留五位小数). ...

  8. PCA历程详细python代码(原创)

    #PCA主成分分析,原文为文末的链接,代码为自己亲自手码 def cov_out1(dx,dy): #第一步:求解x,y各自的均值 mean_x=0 mean_y=0 for i in range(l ...

  9. java微信分享

    先吐槽一下!!! 哎,张小龙写的教程真差,要研究半天才能用上,大家按我的步骤12345,包你药到病除: 1.官方参考: https://mp.weixin.qq.com/wiki?t=resource ...

  10. conda环境里安装pydot

    一.conda环境里安装pydot, 输入以下命令即可: conda install -c anaconda pydot 二.如果运行tensorflow,提示缺什么包,都可以在这里下载. ----- ...