协议本身是一个运行在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. SpringDataSolr 过滤(或者叫筛选)查询

    // 被本类调用 private Map searchList(Map searchMap) { // 1.1关键字查询 SimpleHighlightQuery highlightQuery = n ...

  2. STL详解

    STL概貌                                                                                                ...

  3. php 从2维数组组合为四维数组分析(项目中前台侧边栏导航三级分类显示)

    foreach函数(循环函数)内嵌套循环函数时,当内层完全循环完后,才会向上一级循环 数组要注意问题 array_merge----合并一个或多个数组 将一个或多个数组的单元合并起来,一个数组中的值附 ...

  4. Setting Up Swagger 2 with a Spring REST API

    Last modified: August 30, 2016 REST, SPRING by baeldung If you're new here, join the next webinar: & ...

  5. Spring Boot --- Swagger基本使用

    1. pom <!-- swagger2 --> <dependency> <groupId>io.springfox</groupId> <ar ...

  6. Linux下MySQL的简单操作

    Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...

  7. oracle中常见的查询操作

    普通查询:select * from t; 去除重复值:select distinct f1,f2 from t; between用法:select * from t where f1 not/bet ...

  8. PHP-CPP开发扩展(三)

    PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解PHP函数形参相关的实现. 指定函数参数类型 有时候,我们需要指定函数的形参是数组或者指定的,那么在PHP-CPP里是否可以指定函数的参数类型 ...

  9. php网页上传文件到Ubuntu服务器(input type=fire)- 赖大大

    直接上代码: <form enctype="multipart/form-data" method="post" action=""& ...

  10. Golang GC原理

    一.内存泄漏 内存泄露,是从操作系统的角度上来阐述的,形象的比喻就是“操作系统可提供给所有进程的存储空间(虚拟内存空间)正在被某个进程榨干”,导致的原因就是程序在运行的时候,会不断地动态开辟的存储空间 ...