协议本身是一个运行在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. [转]data-driven与决策树聚类的两种方法

    参考文章: http://blog.csdn.net/quheDiegooo/article/details/60873999 http://blog.csdn.net/quhediegooo/art ...

  2. 仿B站项目——(1)计划,前端工程

    计划 现打算: 计划用webpack打包 + 模板语言 + jquery + jquery ui + bootstrap做一个仿B站的静态网站. 网站兼容手机浏览器端. 部分模块打算仿照SPA用js加 ...

  3. Java的组合排列问题

    从4个人中选2个人参加活动,一共有6种选法. 从n个人中选m个人参加活动,一共有多少种选法?C(m/n)=C((m-1)/(n-1))+C(m/(n-1))数学算法 public class Main ...

  4. cannot download, /home/azhukov/go is a GOROOT, not a GOPATH

    问题详情: go环境安装好后,运行go代码也没有问题 下载govendor包的时候提示: cannot download, /home/azhukov/go is a GOROOT, not a GO ...

  5. Python中的几种矩阵乘法(转)

    一.  np.dot() 1.同线性代数中矩阵乘法的定义.np.dot(A, B)表示: 对二维矩阵,计算真正意义上的矩阵乘积. 对于一维矩阵,计算两者的内积. 2.代码 [code] import ...

  6. 使用maven构建多模块项目,分块开发

    在多人使用Maven协作开发项目时,尤其是稍微上点规模的项目,每个RD的工作都细分到具体功能和模块,有些模块甚至还要单独部署. 我们假设有这样一个商城项目,包括以下几个模块: 商城前台(shop) 管 ...

  7. Git学习系列之Windows上安装Git详细步骤(图文详解)

    前言 最初,Git是用于Linux下的内核代码管理.因为其非常好用,目前,已经被成功移植到Mac和Windows操作系统下. 鉴于大部分使用者使用的是Windows操作系统,故,这里详细讲解Windo ...

  8. Hadoop项目实战-用户行为分析之编码实践

    1.概述 本课程的视频教程地址:<用户行为分析之编码实践> 本课程以用户行为分析案例为基础,带着大家去完成对各个KPI的编码工作,以及应用调度工作,让大家通过本课程掌握Hadoop项目的编 ...

  9. Dockerfile指令详解

    Dockerfile中包括FROM.MAINTAINER.RUN.CMD.EXPOSE.ENV.ADD.COPY.ENTRYPOINT.VOLUME.USER.WORKDIR.ONBUILD等13个指 ...

  10. docker push 出现:x509: certificate signed by unknown authority

    今天,部署生产的程序的时候,出现一个问题:编译正常,但是,docker 把编译好的image 推送到生产环境上去的时候,出现:x509: certificate signed by unknown a ...