独立完成的工作了一个App,去工作能拿什么样的薪资

您的位置:
看完你也能独立负责项目!APP从头到尾的所有工作流程详解!
作者:华飞
(一)项目启动前
从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是以为做项目管理跟踪项目进度,有的是做竞品分析给老板看。实际上,这些都不是产品经理的核心和重点。在较为成熟的企业,因为产品的壮大和人员的增多,为了便于协作和沟通,岗位会细化的很清楚,如产品经理、交互设计师、UI设计师、用户体验分析师、数据分析师、运营等等。但是创业型公司中产品经理往往都是身兼数职,创业公司追求的是效率最大化、成本最低化,根本没精力将岗位分的那么细致。下面我以一个创业者的视角或者说负责一个产品项目的产品经理角度出发,来审视整个过程,看一个产品从无到有,产品经理需要哪些事情。
产品从概念到产出到流程
做任何东西之前,首先要考虑其背后的用户需求、商业价值、技术难度。只有用户有需求,你的产品才会有人用;只有其商业价值成立,才能为企业带来利润,毕竟企业最最基本的目标就是要盈利;只有技术上的总体评估是可行的,整个项目才可被执行。现在的互联网创业,大家都在追求”快“,比如2个月融资,4月用户过百万,3年后纳斯达克上市。但是这都是大家看到别人创业成功的表象,殊不知做任何事情的前提是,你得了解你在做什么,诚然,不排除哪些胆子大运气好随便干就成了的,但那只是个案,不值得深究。
一、用户需求
1.1产品定位
在项目的执行过程中,我们经常陷入一种情景,就是一堆人在一块,讨论的氛围可谓是情绪高涨,A说这个地方的按钮不行,B说这个地方应该像人家APP那样做,C又说你们都不对应该是这个模块不要换成这个云云。经常参加这种讨论,会无比的耗费时间和体力,动辄好几个小时过去,但一散会,发现什么结果也没得出来。多数情况下,一定是产品定位出了问题。执行的人一定要清楚的明白产品是用来干什么的,给什么人用,才能正常的去讨论具体细节。如果热血沸腾、蹬鼻子上脸的的讨论了好久,发现没结果,发现会议的讨论跑偏了,不妨回归本质,想想我们的产品定位是什么。
产品定义:产品定位包含两个大的内容一个是产品定义,另一个是需求定义。产品定义要分析的内容包含产品的使用人群、主要功能和产品特色。
举例,你现在要创业搞一个移动端招聘APP取,作为产品经理首先应该干什么?中国每年的就业人口非常庞大,行业也各种各样,那你就有要想,你的产品是要给什么样的人提供服务,你如果想服务所有行业的人群那是不可能的,首先一个小公司去整合这么多行业招聘信息本身就非常困难,另外并不是每个行业的人对互联网的接受程度那么高。
通过数据分析和调研,发现现在国家鼓励创业,创业的高峰期必然产生大量的人力需求,尤其是现场几乎说到创业没有哪个是跟互联网无关的,而且从事互联网的人对于APP的接受程度也很高,至少都愿意尝试。所以你把互联网这个行业的从业人群作为你产品的使用人群。
当你分析完其他招聘类APP后,你发现这些APP有很多问题,比如我就是要找北京西二旗那边的工作,但是很多APP目前都是没位置筛选;虽然可以海投,但是得到的反馈的寥寥无几;能够了解的企业信息太少;在投递建立前,作为求职者希望知道这个公司的老板是谁;现在都互联网时代,电子简历完全可以了,为什么每次招聘还需要招聘者自己打印简历,要知道打印简历对于求职者来讲并不是很方便,因为随时会改动,这对求职者非常不方便。所以你打算做这个APP,他的特色功能就是1、岗位支持企业所在位置分类;2、招聘方应该时时给予求职者反馈;3、取消纸质简历。主要功能就是招聘。现在我们给APP取名叫做飞鸽招聘。
需求定义:需求定义的分析包含目标用户、使用场景、用户目标三个方面。目标用户是什么类型的人会用你的产品;主要功能是指你的产品是用来干什么的,是工具是社交还是其他;你的产品相对于其他市面上的产品有什么不同的地方,这就是产品特色。
刚才明确了APP的适用人群、主要功能和产品特色。市面上的招聘APP,有的是做猎头的专门针对于希望跳槽的,你的APP的目标用户是谁?基于特色功能分析和用户痛点,分析出出产品的目标用户是那些有想在具体位置找工作的人,比如已经定居北京后沙峪的人,希望工作在望京;当你刚刚搬家到回龙观时,此时你面临着换工作,你可能会倾向于找西二旗那边的工作。
1.2需求分析
以上就是所有产品定位的内容。这些完成之后,紧接着的就是竞品分析和用户调研,一方面这是对我们的需求进行一定的验证,另一方面也是我们直接接触用户的一个机会,看用户存在什么需求。
1.3需求筛选
早期需求筛选是个非常苦逼的事情,如果产品经理自己就是老板,自己心里很清除还行,如果不是很容易陷入海量的需求中拔不出来,讨论着讨论着就跑偏了,讨论完之后好像什么功能都需要,这个功能有用,必须加;那个功能太好玩了,用户肯定有趣。这话总完全凭个人主观臆断的东西,往往都是当时听起来貌似合理,但事后却经不起推敲。所以我们需要始终把握住我们的产品定位和优先级,万不可盲目的在这个地方做很多无畏的牺牲和奋斗(少做不经思考的、拍脑袋的、不经过大脑的决定)。
需求记录表:
早起需求筛选期间,会出现很多这样或者那样的需求,有些我们不能立马做出判断说做还是不错,这些点子有可能以后会成为我们产品迭代的启发点,也会给产品的发展带来更广的思路。做好管理,尊重每一个人的想法,在出现模棱两可时,记录下载,对会议的推动和进展会有很大的帮助。
二、商业价值
市场需求文档和商业需求文档,一般在大公司会得到比较成熟的体现。小公司往往多数都是老板自己决定,老板可能不会搞这样或者那样的文档,但他自己肯定会去做基本了解,或者本身自己就很了解某个行业。这两个文档并不是多余的,也不是累赘,如果在项目启动前,能够花一定的时间去深入了解行业和用户是非常必要的。具体文档细节在这里不做阐述,网上有很多可以去借鉴的。
三、技术评估
作为不是技术出身的人,就不再这里转笔了。尊重开发人员,和开发相处融洽一点,会对产品的推动非常有帮助。
(二)项目执行中
在前文中已经给大家讲了项目启动前应该做的三大块1、需求;2、商业;3、技术。在这些准备工作整理完之后,接下来就是执行,执行过程中不像之前需要考虑的那么宏观,但需要你足够的细心和耐心。
一、产品层面
需求产生了之后,紧接着产品人员就可以产出需求文档,需求文档对接下来交互设计(创业公司往往产品经理会担任)、UI设计起着关键性的作用,当然在需求闻文档产生的过程中,如果有专职的交互设计,在需求阶段最好和产品人员一起来探讨需求文档的细节,这对于交互设计自己理解整体的需求有帮助,也对他进行原型设计和撰写交互说明有很好的帮助。
需求文档大致包含的内容会有如下几个方面:
背景描述:为什么开展这个项目?解决用户什么问题?会有多大的价值?大致就是把项目启动前做的功课进行一下总结说明,务必精简明了。
用户画像:对用户特征进行虚拟说明,阐明用户情况。
项目时间规划:什么时候出来原型?什么时候出来真实设计稿;什么时候进入开发?什么时候开始测试?什么时候开始提交应用商店?这些都需要明确出来,不然如果没有时间概念,什么事情都会拖拖拉拉,没有紧迫感。
信息结构图:APP的内容组织结构。下面是举例,简单的给出微信的基本结构。
任务流程图:对于APP中的大功能,把用户从开始到结束的整个过程梳理出来,把各种可能性考虑进来,否则之后如果开发碰到问题了问你,你还得重新考虑,更可怕的是开发不问你直接就开发了,而结果还不是你想要的。下面以一个简单的登录为例:
需求说明:把每个操作的条件和结果说清楚,如果能够用文字说清楚的就用文字,说不清楚的最好用图片。可能有的人会说,这个时候还没有线框图,怎么解释啊。这个并不矛盾,早起的需求文档是用来给交互看的(再次强调,创业型公司的产品可能会兼着交互),交互设计师再根据你的功能结构和流程梳来设计线框图和高保真的原型图。
数据埋点:把后期需要查看的数据列成清单,比如说这个按钮的点击率,这个页面的打开率等等,这个时候需要和运营多交流,对需要做埋点的地方理清楚。这对于产品上线后的数据分析很有帮助,数据也可以辅助产品功能的迭代。
二、交互设计
需求整理完成之后,接下来大致要进行的就是线框图、页面流程、高保真原型图和交互说明的设计和产出。高保真原型是具体情况来定,有的公司有要求,有的没有。
2.2线框图:
力求简单清晰的表达出每个页面的视觉效果,这里最好不要加入交互,也不要搞的五颜六色,最好是黑灰色。每个情形就是一个页面,把各个情况用页面分别表达出来,一方面你会更加清晰APP整体的界面数量,另外设计也会更加清楚你想要什么,否则加入了交互,设计也不知道怎么点,你还得解释半天。
2.2页面流程图:
比较类似之前的信息结构图,页面流程图这是用各个页面来做连接,视觉上更加清晰各个环节的衔接和跳转。
2.3高保真原型图:
对交互的要求会更高。需要比较完整的展现各个功能之间的交互动作,另外在视觉上尽量还原真实产品的样子。(关于Axure,可以学习金乌的课程,很不错,很多人觉得讲的太罗嗦,但是你认真看下来还是很有收货的)
2.4交互说明:
我个人觉得,交互说明和高保真原型有重合之处,如果做了高保真,那么多数的交互动作基本上都可以展现。但是有些地方的交互动效是软件无法搞定了,这个时候就需要你用交互说明了。
如果文字和图片都不要说明的就直接用纸片来模拟。不要小看这种方式。
这里做交互标记的工具推荐几个给大家:mac电脑果断是sketch了;windows下有snagit、圈点、FScapture,另外viso也可以标注。
三、UI设计
一般情况下,交互设计师讲线框图交给设计师,设计师就可以开工了。这个过程,交互也要多和设计去沟通,毕竟UI也会有自己的专业度,她会有自己的设计见解,这很正常。
四、项目执行
设计产出了,交互的工作也做完了,该去交给项目经理执行了,这个身份目前来看那只有很大的公司里才会有,一般情况下是由产品经理直接兼任了。这里需要提醒的是,在执行前,各种相关的规范要先建立起来。比如:
4.1,apk、api文件的命名规范和不同类型安装包的管理:
这里全是我个人的经验,做好这些,会对以后安装包的管理会有极大的帮助。我们当时把搭建了一个开发者环境,这个环境下的APK、API文件只能在局域网类使用,在这个环境下可以任意折腾和测试,不会影响到已经上线的应用。
开发者环境下打包的安装包图标和命名要和线上环境下的应用区别开。以后在续测试时就不会因为各个版本搞的手忙脚乱。
4.2APK、API文件管理
4.2.1开发版:纯开发自己使用或者产品使用,其他无关人员一般情况下不会接触到这个版本。网络环境:仅特定网络环境下使用(需要技术人员搭建环境)。
4.2.2公测版:经过产品和测试人员的详细测试后,基本没有什么BUG了,就可以拿出来给公司的人使用,也算是上线前的稳定性测试。网络环境:仅在特定环境下可以使用(需要技术搭建环境)。
4.2.3商店版:准备提交到市场的APK、API文件。在经过开发版本、公测版的全面测试后,排除一切不稳定bug,此时打包的商店版仍然需要经测试人员的最后把关,最后一定要保证的是,准备上线的APK、API文件是经过测试人员的最后把关的,否则如果开发如果做了改动不通知测试和产品人员,上线后出了问题再改就晚了。
五、APP测试和版本号管理
版本好号的管理,前期就要搞清楚,否则后面产品上线后,出现bug要改进,或者添加新功能后对老版本是否有影响,这个时候版本号管理的好就会起到很大的作用,一方面你可以随时找出之前上线过的apk、API文件,另一方面面对不断修改打包的文件不至于把自己搞混。
下面是我个人的意见,如哪个大牛有好方法可以分享出来。版本号始终是唯一的,是依次迭代递进的,不要为了上线时版本号好看就去刻意干扰版本号,严禁搞多套版本号。
测试须知:
UI、交互、产品在技术人员开发阶段,要多和技术人员沟通,最好是将大功能细化成小功能模块,每次做好一部分就通知相关的人进行检查,以免累计到最后问题过多修改动作太大。UI负责盯着开发是否按照自己的设计实现的,交互负责关注交互效果是否符合你的标准,产品负责关注各个功能的实现是否正确。
测试用例:好的测试用例能够有效的推进测试的进程,好的测试用例在于尽可能的把APP的各种需要测试的情况用人话描述清楚,这点就看你的文字能力了,测试用例写出来会交给测试人员来测,这也是他们评判APP是否达标的标准。
Bug管理工具:bugtags,bugclose等等,市面上有很多,多是免费的,即使是收费也不要在意那么点钱,借助bug管理工具能够有效的提高测试人员和技术人员的协作效率。
(三)项目上线后
之前给大家介绍了两个部分,项目启动前和项目执行中。项目上线后,作为产品需要关注的事情有几个方面,一是APP数据,二是用户反馈,三是需求提取。
一、APP数据
新增用户:第一次启动应用的用户;
新增独立用户:全体应用的新增用户的总和(去重)
活跃用户:当天启动一次的用户即为活跃用户,含新用户和老用户;
活跃独立用户:当天应用的活跃用户总和(去重)
MAU:MAU(monthly active users)月活跃用户人数。
DAU:DAU(Daily Active User)日活跃用户数量。常用于反映网站、互联网应用或网络游戏的运营情况。
用户留存率:在互联网行业中,用户在某段时间内开始使用应用,经过一段时间后,仍然继续使用该应用的用户,被认作是留存用户。这部分用户占当时新增用户的比例即是留存率,会按照每隔1单位时间(例日、周、月)来进行统计。
用户留存率中的40-20-10法则:如果你想让游戏、应用的DAU超过100万,那么日留存率应该大于40%,周留存率和月留存率分别大于20%和10%。
次日留存率:(当天新增的用户中,在往后的第1天还活跃的用户数)/第一天新增总用户数;
第2日留存率:(第一天新增用户中,在往后的第2天还有活跃的用户数)/第一天新增总用户数;
第7日留存率:(第一天新增的用户中,在往后的第7天还有活跃的用户数)/第一天新增总用户数;
第30日留存率:(第一天新增的用户中,在往后的第30天还有活跃的用户数)/第一天新增总用户数。
另外就是APP的埋点数据,这个功能的点击率是多少?这个功能有多少人打开,又有多少人使用了?有多少人在频繁使用这个功能?等等,这些埋点数据要时常关注。结合数据变化来反思功能设计的问题,从而优化产品。
二、用户反馈和评论
产品上线后,用户的反馈和评论对于产品人员来讲是尤为珍贵的材料,一方面这是你的真实用户的直观感受,另一方面他们再表达直接的需求。那么,怎么样处理用户的意见就显得格外重要。用户反馈什么我们就做什么,这是肯定不行的。很多情况下用户表达的只是一种表面现象,要学会去挖掘用户背后的需求本质。多去研究世界上一些革命性的产品,多去了解人。
当看到四处飞来的意见时,我们要学会思考,而不是全盘接受、全盘照抄。
是不是我们的目标?想想我们的目标用户是谁。
使用场景是否成立?还是这只是极个别人的场景需求。
用户目标是否正确?我们的APP是不是用来满足用户这个需求的?
产品定位还正确吗?如果做了这个功能,还符合我们产品的定位吗?
如果要做这个功能,那么自身的项目资源是否能够满足?如果需要举全部资源来做这件事情,那就要慎重再慎重。
三、需求提取
也许用户的意见是个圆形,但经过分析之后,很有可能得到需求是个三角形。
“如果我最初问消费者他们想要什么,他们应该是会告诉我,‘要一匹更快的马!’”
——这是亨利·福特的一句经典名言,如今我们在《乔布斯传》里又见到了它。
100多年前,福特公司的创始人亨利·福特先生到处跑去问客户:“您需要一个什么样的更好的交通工具?”几乎所有人的答案都是:“我要一匹更快的马”。很多人听到这个答案,于是立马跑到马场去选马配种,以满足客户的需求。但是福特先生却没有立马往马场跑,而是接着往下问。
福特:“你为什么需要一匹更快的马?”
客户:“因为可以跑得更快!”
福特:“你为什么需要跑得更快?”
客户:“因为这样我就可以更早的到达目的地。”
福特:“所以,你要一匹更快的马的真正用意是?”
客户:“用更短的时间、更快地到达目的地!”
于是,福特并没有往马场跑去,而是选择了制造汽车去满足客户的需求。
客户需求有显性需求和隐性需求两大类。我们通过市场调查得知的往往都是一些诸如“我要一匹更快的马”这类显性需求。客户的显性需求并不是客户真正的需求。企业需要根据所收集的显性需求信息进行深度挖掘和捕获,以了解客户的隐性需求是什么,进而分析出客户的真正需求是什么(例如:用更短的时间、更快地到达目的地)。这就是一个需求分析的过程。
乔布斯所言:“我们的任务是读懂还没落到纸面上的东西。”实际上就是用户隐性需求的深度挖掘。
(转载请保留)
互联网的一些事,已超50万小伙伴关注!您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
工作计划app.doc 59页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
工作计划app
你可能关注的文档:
··········
··········
工作计划app APP运营推广工作计划 一、校园渠道(线下) 在每个学校发展校园大使,校园大使是我们在校园里的代言人,类似于我们企业的编外人员。校园大使可以获得薪资、礼品、实习证明、晋升机会、培训机会、团队管理经验。 校园大使经多轮面试和专业人员培训后上岗。薪资为编外人员标准 校园大使举办活动可以向总公司申请经费。 每个校园大使都有一个专用的id号,所有通过这个id号产生的激活量都算该校园大使的业绩。 目前的校园大使常用手段(培训): 1、基础手段:宣传册、海报、传单、卡片、楼栋号、日历、课程表、标尺、友情提示等,这些属于基础设施建设。楼栋号用来提醒大家到了几楼,友情提示一般为:“请保持安静、中午休息时间请勿打扰、保护环境等”。 2、策划活动:比如校内网曾经成功策划了免费包车送学生到火车站的活动,再比如有的SNS网站在大学校园举办娱乐活动、爱心活动等等。 3、冠名活动:与策划活动不同的是,冠名活动不是自己举办的。一般形式为:“**网预祝*****活动圆满成功”。 4、网络宣传:比如通过学校论坛、百度贴吧、QQ群发等。 5、软文推广:每个学校都有自己的杂志、报刊、网络媒体等,为了让网站有更多的宣传机会,校园大使通常会选择写一些软文发表在相关媒体上。 6、班级演讲:一个班一个班巡回演讲的方式,虽然比较累,但是效果往往很好。一是受益面广,而是具有直接性。 7、行政手段:部分校园大使在学校人脉很广,或者自己本身就是团委学生会、社团主要干部,所以采用行政手段,强制他人注册。 8、口碑宣传:见到人就提起该网站,比如,有的校园大使在重要会议、演讲要展示幻灯片的时候,往往附带宣传网站。 9、炒作宣传:校园大使有条件的,往往喜欢在特定条件下制作炒作事件。这样的情况往往以事件为标志。 10、促销手段:即注册送礼品、或者注册可以获得优惠之类。很多人都知道,校内网当初是用鸡腿和可乐换来的用户。11、横幅宣传:横幅不是每个校园大使都有这个关系可以挂好,但是还是有不少人采用这个手段。主要在于横幅的宣传效果往往很大,尤其挂在主干道路上的横幅,更是能吸引人群的目光。 12、校园通勤车宣传:比较大的学校往往有专门的通勤车或者校车,主要供学生上下课乘坐。在车体做广告往往能够收到不错的效果。因为通勤车每天都在学校穿梭。 13、注意力宣传:比如,校内网有专门的T恤,学校里面经常可以看到穿着校内网服装的人在校园里面逛来逛去。由于服装的特殊性,所以很容易吸引人的注意力。 14、网吧宣传:51.COM算是在网吧推广最成功的案例。但是,校园SNS往往也可以在网吧获得不错的效果。通常的手段为海报、制作临时上机卡、友情提示、电脑号、设为浏览器主页等。 15、其他特色手段: (1)图书馆杂志厅插书签。图书馆里面的杂志厅通常比较火爆。插入一张精美的书签往往能够起到不错的效果。 (2)学校周末放电影,中途插入FLASH宣传片。此手段收益面广,而且刺激性很大。 (3)发展院系大使。每个校园大使下面又发展了院大使、系大使。此手段实践性很强。 (4)学校举办报告会、演讲、大型活动,在活动开始前,每张桌子上放上一张精美的广告。通常,在这种环境下,大家有更充分的时间。 (5)学校餐厅开餐前,放上一张小广告,让大家吃完饭小憩时刻有个东西可以阅读。 (6)黑板宣传,在教室黑板上写宣传标语。 如何推广APP 1、朋友圈 这个方法主要是推广给自己的朋友,例如舍友,同班同学等,根据推广的具体要求,安装一个应用,是不会介意的;也可让朋友帮忙推荐给朋友,如果app很有利,就可以通过口碑来宣传,例如:“我在免费蹭wifi”。 2、扫楼 扫 楼就是在宿舍楼每个宿舍都去介绍。这个方法有点累,同时很容易被拒之门外。如果有很好的人际交往能力,这个方法可以达到很好的成效,如2人分工 一人手拿二维码图片(自己学校专有的二维码链接,在草料二维码进行生成)一人进行宣传介绍,同学们进行扫二维码扫描。 本方法快捷有效,一般一个小时一个人可以做50个 3、社团推广与社团合作,可以给社团提供一定的好处(视情况而定),让社团的人员的安装。这个方法比较适合找一些大的社团合作,可以达到很好效果。 4、论坛 现 在各大手机论坛(例如:安卓论坛,安智论坛)都有软件共享区,可以将软件发到论坛,但是论坛都有一定的权限设置。所以要先在论坛回复或作一定任务,达到一 定权限后在分享。此方法比较适合长远投资,而且有很大的人员。也可在百度贴吧宣传,但是容易被度娘封删,所以在贴吧宣传是要有一定方法与隐蔽性 5、群资源 就是在各群里发推广连接。此方法不推荐,收益甚微?.. 6、落地 在学校摆摊,举办一些有趣的活动和礼品来吸引人。利用宣传台在人流密集的地方,如食堂、上下学出入口,地点展示适当的配上如下载抽奖,下载送小礼品的模式进行宣传互动。 7、二维码 通过宣传
正在加载中,请稍后...今年第一个独立 App,TKeyboard,也是第一个开源项目 - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"title":"今年第一个独立 App,TKeyboard,也是第一个开源项目","author":"mrpeak","content":"在咖啡馆耗费了数个周末之后,终于将这个灵光一闪的点子变成了一个实实在在可以运行的 app。同时意味着年初制定的第一个小目标达成,完成了 2017年的第一个独立 app。在app上架的同时,我决定将代码全部开源,除了兑现去年年底的承诺之外,我相信代码本身的价值,要高于 App 的功能,开源能带来更多知识的碰撞和增长。去年开源给我带来了不少乐趣,希望今年能有更好的成绩。整个项目涉及到一些比较实用的技术点,或能惠之于人。应用场景这款应用名为:TKeyboard。有一个 Mac 端和一个 iOS 端 App。简单来说,可以通过蓝牙,使用 Mac 的键盘输入内容到 iPhone 设备中。主要是为了解决 iPhone 设备输入不方便的问题,有 Mac 在身边的时候会比较方便,一时脑洞的小应用。涉及知识点这两个 App 解决的用户场景比较完整,代码方面涉及到一些较为实用的技术点:Mac 端开发,从 iOS 端切入 Mac 端开发其实难度比大部分人预想的都要小,主要是 UI Framework 需要做些学习,用 xib 配合 autolayout 其实很方便,就是做动画会稍微麻烦一些。iOS 端的话,主要是各种 Extension 的开发学习,现阶段实现的是 Keyboard Extension,后期这个项目计划实现更多的 Extension 功能,最终的目标是成为一个 Mac 端和 iOS 端的多功能同步应用。Extension 开发的重要性,我曾经专门写文介绍过,不再赘述。另外是蓝牙通讯这一块,iOS 端和 Mac 端共享一套代码。蓝牙这块网络上技术文章比较少,完整的开源项目几乎找不到。我在结合官方 demo 和自己踩坑的基础之上,基本实现了一套完整的蓝牙通讯功能。最后还有一个简单的网络协议设计,用于 iOS 和 Mac 端做通讯之用,理论上使用 protobuf 更合理,但这是个人项目,处于写代码的乐趣,就自己动手 DIY 了一个,感兴趣的同学也可以自己设计。全部的代码大约耗时数个周末。其实项目去年底就已经启动了,中间因为各种琐碎事情耽搁了,2017 开年战胜拖延症,终于完成了第一版本代码,算是给去年底做热血规划的自己一个交代。开源计划TKeyboard 包含 Mac 端 和 iOS 端两个项目,涵盖一些实用知识,决定开源也算是对 iOS 技术社区做一些微薄的贡献。其中代码可以随意免费使用,但绝不容忍换个皮肤重新上架 App Store 的低素质行为。后续打算TKeyboard 的最终目标是一个 Mac 与 iOS 的同步应用,这是一个庞大的工程量,不知道最后会完成为什么样的形态,且做且珍惜。欢迎大家提意见修改。iPhone 版目前售价 $3,Mac 版免费。因为代码开源,实际和完全免费没差别。如果觉得代码或者 App 本身对你有帮助,可以考虑去 App Store 下载,赞助 Peak 君一杯咖啡。iOS 版 TKeyboard 下载地址:Mac 版 TKeyboard 下载地址:Github 地址:E)","updated":"T00:21:22.000Z","canComment":false,"commentPermission":"anyone","commentCount":8,"collapsedCount":0,"likeCount":53,"state":"published","isLiked":false,"slug":"","lastestTipjarors":[{"isFollowed":false,"name":"谭智仁","headline":"","avatarUrl":"/v2-834eb99cb8c1_s.jpg","isFollowing":false,"type":"people","slug":"tan-zhi-ren-34","bio":null,"hash":"e51afcdfea076c5eb61fa","uid":453800,"isOrg":false,"description":"","profileUrl":"/people/tan-zhi-ren-34","avatar":{"id":"v2-834eb99cb8c1","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"isTitleImageFullScreen":false,"rating":"none","titleImage":"/v2-e7f04eab476eea78c61c83e_r.png","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[{"url":"/topic/","id":"","name":"iOS 开发"}],"adminClosedComment":false,"titleImageSize":{"width":1920,"height":1018},"href":"/api/posts/","excerptTitle":"","column":{"slug":"mrpeak","name":"MrPeak杂货铺"},"tipjarState":"activated","tipjarTagLine":"真诚赞赏,手留余香","sourceUrl":"","pageCommentsCount":8,"tipjarorCount":1,"annotationAction":[],"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T08:21:22+08:00","url":"/p/","lastestLikers":[{"bio":null,"isFollowing":false,"hash":"8add7df48cc","uid":439000,"isOrg":false,"slug":"boolwork","isFollowed":false,"description":"","name":"BoolWork","profileUrl":"/people/boolwork","avatar":{"id":"ee2a880a82a9b4dde5673e","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"iOS开发者","isFollowing":false,"hash":"962a7cffb5d51a","uid":736400,"isOrg":false,"slug":"xiao-meng-33-5","isFollowed":false,"description":"","name":"小孟","profileUrl":"/people/xiao-meng-33-5","avatar":{"id":"v2-4a106d6fcce9cdd521dafa0","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"iOS开发工程师","isFollowing":false,"hash":"4f39ee885be5ffebbf27a29dc618f889","uid":091600,"isOrg":false,"slug":"wang-zhan-88-44","isFollowed":false,"description":"","name":"王展","profileUrl":"/people/wang-zhan-88-44","avatar":{"id":"03ce4eebd4f0c","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"程序员","isFollowing":false,"hash":"388dd4c9bf90ad83ad9f","uid":64,"isOrg":false,"slug":"chen-zhi-bo-45","isFollowed":false,"description":"","name":"最后的豌豆","profileUrl":"/people/chen-zhi-bo-45","avatar":{"id":"7faaae2927cab03011ad","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"站在IT门口的准毕业青年。","isFollowing":false,"hash":"006dcffe9523bcfda7da0bd","uid":895400,"isOrg":false,"slug":"kang-29-34-73","isFollowed":false,"description":"","name":"kang","profileUrl":"/people/kang-29-34-73","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"在咖啡馆耗费了数个周末之后,终于将这个灵光一闪的点子变成了一个实实在在可以运行的 app。同时意味着年初制定的第一个小目标达成,完成了 2017年的第一个独立 app。在app上架的同时,我决定将代码全部开源,除了兑现去年年底的承诺之外,我相信代码本身的…","reviewingCommentsCount":0,"meta":{"previous":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"iOS 开发"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"iOS 技术博客","isFollowing":false,"hash":"9b13af9f7","uid":08,"isOrg":false,"slug":"mrpeak","isFollowed":false,"description":"公众号:MrPeakTech","name":"MrPeak","profileUrl":"/people/mrpeak","avatar":{"id":"v2-79fbcdd188e","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"mrpeak","name":"MrPeak杂货铺"},"content":"这是 TCP/IP 系列的第二篇,阅读目标是建立对网络包结构的初步认识。上一篇里,我们提到一次完整的 TCP 会话其实是一个字节流,只不过我们可以按照一定的规则来切割这个字节流,从而划分出一个个的网络包。我们经常说抓包分析网络故障,这个抓包里所指的包在不同的语境下其实意义并不相同,首先我们得对包的构成形成具象的认知。再看七层协议刚毕业那会,大家都喜欢在简历上写「精通 TCP/IP 协议」,面试被问起时就必答三次握手和 OSI 七层模型,再多就说不出来了。问七层模型是什么就机械式的从上至下背诵一遍,这离精通还差了一本【TCP/IP 详解】。我在完整的学习过一遍网络协议栈之后,深感所谓的七层模型是偏工业的说法,看到七层协议图之后,其实很难明白这七层是如何一层层互相构成的,更符合大脑感官的是另一种认知形式,是一种洋葱形的结构,层层叠叠互相包裹,可以用下图表示:左边是教材上的结构,右边是我所说的洋葱式的结构。如果以一个 HTTP 请求为例,右图中 Application 部分就代表我们用 Charles 抓包时所感知的部分,这一部分要最后转化为光信号,在光纤中传输,还需要经过一层层的转化,这个转化过程说白了,就是在每一层加上一个 header。Application 层(HTTP)的数据在经过传输层(TCP Layer)的时候,会加上 TCP 的 header,成为一个 TCP Segment。传输层(TCP)的 Segment 在经过网络层(IP Layer)的时候,会加上 IP 的 header,成为一个 IP Packet。网络层的 IP Packet 在经过链路层(Link Layer)的时候,会加上Link Layer 的 header,成为一个 Frame。最后 Frame 会在物理层,将数字信号转化为物理信号传输。这里值得特别注意的是,在每一层,有不同的英文术语来对应包的概念,比如在 TCP 层的包叫做 Segment,在 IP 层的叫做 Packet,在链路层的叫做 Frame,另外和 TCP 位于同一层的 UDP 包我们一般叫做 Datagram,不同协议层里术语并不一样,好处是,在交流的时候,我们选择不同的英文单词就能预先确立是在那一层讨论协议。而 Segment、Packet、Frame、Datagram 等翻译成中文的时候,都是译为「包」,大家说读英文原版资料是不是更好,这些术语我们需要特别记忆,可以对照下图: +-------------+-------------------------+\n | Application |
HTTP Packet
|\n +-------------+-------------------------+\n | Transport
TCP Segment
|\n +-------------+-------------------------+\n | Network
|\n +-------------+-------------------------+\n | Link
| \n +-------------+-------------------------+
光纤\n | Physical
| ====================& \n +-------------+-------------------------+\n不过有些场景下,我们也会用 Packet 来泛指每一层的包,但是用每一层自己的术语会更准确和专业,这些行话和习惯我们也需要了解。我们可以用一个公式来表示每一层协议的构成:Packet = Protocol Header + Payload每一层的包都可以用这个公式来表示。Payload 指传入这一层的数据内容,比如:TCP Segment = TCP header + HTTP data有了这个认知之后,对于每一层协议的学习,最后就落实到每一层 header 的学习上了,学习 TCP 就是研究 TCP header 的构成,header 里的每一个 bit 位都有特别的用处,来实现协议层对于网络传输的控制。这也是为什么我经常会说,所谓的网络协议学习就是 header 学习,这也是本文标题的含义所在。深入 Header【TCP/IP 详解】大致有 1000 页,通读的过程会很漫长且枯燥,知道每一层协议都是关于 header 的设计之后,大家其实可以先跳跃式的阅读,先学习感兴趣的部分,有了收获知识的正向反馈之后,在回过头来填补更多的知识细节。比如大家一般都对 TCP 协议比较感兴趣(确实也是最有意思的部分,后面的文章也重点分析),那么可以先跳到第十二章:Chapter 12
TCP: The Transmission Control Protocol(Preliminaries)或者第十三章,真正明白所谓的三次握手:Chapter 13
TCP Connection Management由于每一层的设计都是独立的,所以先学习传输层并不会有什么障碍,这也是分层架构的意义所在,各层各司其职,互不依赖具体的实现。我们的学习行为,大致上可以分为两类,理解(理解思想)和记忆(强行记忆)。对于 header 的学习,除了理解 header 每个 bit 的意义之外,还需要一些记忆行为,对于一些关键信息的强制性记忆,有助于我们形成更深刻的认知。我们以 TCP 的 header 为例:上图是一个 TCP header,以下是一些需要「死记硬背」的信息点:一个 TCP Header 一般有 20 个字节,如果启用了 options,header的长度可以达到 60 个字节。上图中每一行是 4 个 bytes,32 个 bits。我先带大家学习下前 5 行,每一行是 4 Bytes,五行刚好是 20 个 bytes。计算机世界中,通常会以 bit,byte,word(4 个 byte)等不同粒度来描述信息,header 的学习一般是以 4 个字节为一个单位来展示的。第一行,由 Source port 和 Destination port 构成,二者各占 2 个字节,刚好一起占据第一行的 4 个字节。这两个字段分别表示 TCP 连接中的,发送方端口号和接收方的端口号,既然一个 port 只占 2 个 bytes,那么端口值的范围自然就是 0~65535 啦。第二行,Sequence number,表示发送方的序列号。这个序列号表示的是什么呢?一个 TCP 流是有无数个 0 和 1 构成,这些 0 和 1 以 8 个 bit 为单位,可以分割成一个个的 byte,TCP 是可靠传输协议,每一个 byte 都是有标号的,因为我们需要追踪每个 byte 是否被成功传输了,每个 byte 的标号就是我们这里的 sequence number。假设我们建立 TCP 连接的时候,发一个 sync 包,我们就以 0 标记 sync 包的第一个字节,那么 sync 包中的 Sequence 值就是 0。实际应用中,处于安全考虑,TCP 流的第一个 Sequence number 一般不会是 0,而是一个随机数。Sequence number 占据 4 个字节,也就是 2 的 32 次方,这个数字并不算大,每个包都会用掉一些,如果达到最大值之后,就取余从 0 重新开始。第三行,Acknowledge number,表示接收方 ack 的序列号。接收方收到发送方一个的 TCP 包之后,取出其中的 sequence number,在下一个接收方自己要发送的包中,设置 ack 比特位为 1,同时设置 acknowledge number 为 sequence number + 1。所以接收方的 acknowledge number 表示的是,接收方期待接收的下一个包起始字节的标号,大家可以仔细理解下这一句话。所以 acknowledge number 和 sequence number 是配对使用的。第四行,这一行尤其重要,出于篇幅的考虑,其中细节会在后续的文章中讲解。这里简单提下从 CWR 到 FIN 的 8 个 bit,这 8 个 bit 里每一位都是一个标记位,用来标记当前 TCP 包的特殊含义。比如我们所说的三次握手,第一个 sync 包,就是将 SYN 位置为 1。第二个 syn + ack 包就是将 header 的 ACK 和 SYN 位都置为 1。第三个 ack 包即将 ACK 位置 1。剩余的几个 bit 位暂时不展开讲了,大家可以自己看书先学习下。第五行,这一行只有两个字段,即 Checksum 和 Urgent pointer。checksum 是个通用的计算机概念,做完整性校验之用,在很多协议(IP,UDP,ICMP)中都有应用,这个值有包的发送方去计算,之后由包的接收方取出来校验。Urgent pointer 为两个字节的偏移量,加上当前包的 sequence number,用来标记某一个范围内的 bytes 为特殊用途数据。怎么样、其实没有多少信息量对不对?这么跟着理解一遍 header 中的每一个 bytes 之后,是不是加深了对 TCP 的理解呢?同理,学习完 TCP 的 header 之后,大家可以再去把 IP 的 header,frame 的 header 都搜索出来,对照关键字段去理解学习,最后再配合【TCP/IP 详解】一书阅读效果更好。Tcpdump 实战上面是理论部分,可能有些枯燥,大家可以在理解之后,使用 tcpdump 抓包实战下,进一步加深理解。我们就来抓包,基于上面 tcp header 的学习,抓下三次握手的包 :)我们可以用如下命令来抓三次握手的包:sudo tcpdump -i en0 “tcp[tcpflags] & (tcp-syn|tcp-ack) != 0”输出结果为:18:18:45.687476 IP 192.168.3.7.65284 & 59.37.116.101.https: Flags [S], seq , win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val
ecr 0,sackOK,eol], length 018:18:45.719744 IP 59.37.116.101.https & 192.168.3.7.65284: Flags [S.], seq , ack , win 14280, options [mss 1412,sackOK,TS val
ecr ,nop,wscale 8], length 018:18:45.719986 IP 192.168.3.7.65284 & 59.37.116.101.https: Flags [.], ack 1, win 4112, options [nop,nop,TS val
ecr ], length 0你能根据上面 tcp header 的学习,理解上面 tcpdump 命令的含义吗?tcpflags 指的是 header 中的哪些位呢?对于 tcpdump 的使用还不太了解的同学,可以翻阅我之前的一篇介绍文章。当然 TCP 里还包含着很多有趣的知识点,大家可以先行阅读,后面我会逐步讲解,比如 TCP 的 ARQ 机制,Flow Control 等。总结这次新启的 TCP/IP 系列文章对我来说,会是一次耗时费力,旷日持久的旅途。希望能够慢火细熬,徐徐烹制,将这道倾注心力、营养丰盛的网络协议佳肴制作完成,与君共享。欢迎关注公众号:MrPeakTech","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T19:56:32+08:00","url":"/p/","title":"TCP/IP 系列之 Header 篇","summary":"这是 TCP/IP 系列的第二篇,阅读目标是建立对网络包结构的初步认识。上一篇里,我们提到一次完整的 TCP 会话其实是一个字节流,只不过我们可以按照一定的规则来切割这个字节流,从而划分出一个个的网络包。我们经常说抓包分析网络故障,这个抓包里所指的包…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":4,"likesCount":35},"next":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/v2-b46e7ac9c7_r.png","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"iOS 开发"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"iOS 技术博客","isFollowing":false,"hash":"9b13af9f7","uid":08,"isOrg":false,"slug":"mrpeak","isFollowed":false,"description":"公众号:MrPeakTech","name":"MrPeak","profileUrl":"/people/mrpeak","avatar":{"id":"v2-79fbcdd188e","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"mrpeak","name":"MrPeak杂货铺"},"content":"TCP/IP 系列第三篇,关于 IP 地址。这是我最有意愿分享,也最有趣的一个话题。IP 地址有意思的地方在于,虽然只是一个简单的 IP 地址,短短的 4 个字节,32 bits,里面包含的知识却是森罗万象。智者看山,目之所及,胸中自起万千丘壑。知识底蕴够丰富,才能窥见一个 IP 地址里所隐含的「花中世界」。预热在开始之前,需要做一些基础知识的预热。要对基本的位运算有所了解。很简单,明白 & 和 | 运算即可。任意 bit 位 & 1 = 任意 bit 位任意 bit 位 & 0 = 0另外需要对 2 的常见指数值倒背如流:2?=1,2?=2,2?=4,2?=8 ,一直到 2 的 10 次方为 1024。为什么要有 IP 地址首先,我们要搞明白什么是互联网,也就是我们平时所说的 internet。互联网解决的是设备之间的连接问题,目标是让设备 A 的信息能准确的送达设备 B。为了实现这个目标,我们需要先了解互联网的结构。internet 其实是由无数个子网所构成,是一个二级的结构,第一级是子网,第二级才是子网中的设备。所以 internet 中设备 A 的信息要抵达设备 B,必须先要找到 B 所在的子网,进而再在子网中找到 B。这就是一个路由的过程,我们打个比方,换个角度来描述。就拿最近火热的一部电视剧「大秦帝国之崛起」来说。战国时期,各诸侯国其实就构成了一个典型的 internet 结构,各国独立是一个子网,各大大小小的子网组合起来,就构成了 internet。秦国大王想送一封信到赵国,这就涉及一个完整的信息路由过程,分为以下几步:首先秦国信使要离开王宫,带着信件踏出秦国。其次,信使要先找到赵国位置,中间会路过其他各国。最后抵达赵国,入赵国之后才能被进一步引见至赵王,递交信件。上面三步,涉及两个过程。第一是寻找子网的过程,第二是在子网内寻找个体的过程。要做到这两点,IP 地址的设计就要能反映这两个过程。我们来看 IP 地址的机构。IP 地址 = 网络地址 + 主机地址IP Address = Network ID + Host IDIP 地址就是这样一个二级的结构,因为只有二级的结构,才能实现我们上面所说,二级的路由寻址过程。那么对于一个 32 位的 IPv4 地址,我们如何确定哪部分是 Network ID,哪一部分又是 Host ID 呢?我们有请子网掩码(subnet mask)。子网掩码是很多同学耳熟却不能详的一个概念,简单来说,subnet mask 就是为了分割 Network ID 和 Host ID 的。subnet mask 也有一段有趣的进化历史,值得一提,如何切割 IP 地址经历了一个从「偷懒」到「机智」的过程。我们先看一个典型的 IP 地址,10 进制和 2 进制:123.125.114.14410.网络协议的设计者肯定都是聪明人,但最开始,这帮聪明人在设计 IP 地址的切割机制时,偷懒了。有人一拍脑袋,IP 地址不是 4 个字节吗,那简单点吧,我们就按字节切割,那么有以下几种方式:第一个字节为 Network ID,剩下三个字节为 Host ID第二个字节为 Network ID,剩下两个字节为 Host ID第三个字节为 Network ID,剩下一个字节为 Host ID上面这三种切割方式所划分出来的 IP 地址,就是我们经常所说的 A 类地址,B 类地址,C 类地址。实际上,还有 D 类和 E 类,只不过是做保留实验之用,一般很少提及。那么我们如何确定一个 IP 地址是属于 A B C 的哪一类呢?我们以第一个字节来做一些约定:如果第一个字节的起始比特位为 0,则是 A 类地址。如果第一个字节的起始比特位为 10,则是 B 类地址。如果第一个字节的起始比特位为 110,则是 C 类地址。每一类地址里,Network ID 剩下的比特位则用作实际的 Network ID。依次,我们不难进一步得出结论,我们根据第一个字节的数字就可以判断地址类型:A 类地址的范围为:1 - 126B 类地址的范围为:128 - 191C 类地址的范围为:192 - 223好了,我们终于说完了第一种 IP 地址的切割方式,明白了所谓的 A B C 类 IP 地址。但这种方式很偷懒不是吗?它的问题很明显,IP 地址的切割方式太粗糙,粒度太大。比如说 B 类网络地址,Host ID 只占两个字节,一个子网里也有 65536 个 Host ID,现实世界中哪有那么大的机构和组织,可以使用完 6 万多个 IP 地址呢?即使是alibaba 这样的大公司,也无非是 2-3 万人,所以,这里面存在极大的地址浪费,这种机制太偷懒了!于是有了第二种 IP 地址切割方式,有另外聪明人看不下去了,提出了 CIDR,来解决第一种切割方式挖的坑。接下来,我们好好说下 CIDR 的概念,这也是如今 internet 路由所使用的切割方式。好啦,先总结一下,所谓的路由寻址,第一步是找到正确的 Network ID 地址,其次再是找到正确的 Host ID。插播另一个知识点,解释下路由器(router)和网关(gateway)的差别,在后面路由表的学习中还会用到。其实 gateway 是一种特殊的 router,gateway 用于连接两种不同的网络,比如从子网进入 internet 的路由器就是 gateway,信使离开秦国,秦国的国门就是 gateway,连接的是秦国和茫茫九州。gateway 中的 gate 意为门,很形象不是吗?一个 IP 包离开 gateway 进入 internet 之后,还要在若干个普通 router 之间进行路由,这些路由就不能称之为 gateway 了。CIDR终于到了今天的主角 CIDR,全称为 Classless Inter-Domain Routing,名字有些绕口,这不重要,第一个单词 classless 就表明了,CIDR 是与上面提到的,以分类(class)来切割 IP 地址的方式所对应的新方式。CIDR 是新的子网掩码的表达方式和路由方式。这里注意 CIDR 和 CIDR notation 的区别,CIDR notation 是描述 IP 地址如何切割的方式,而 CIDR 描述的是基于 CIDR notation 的路由方式。CIDR notation 其实概念也很直白,它不再粗暴的以字节为粒度来切分 IP 地址,而是精确到 bit 位,我们看一个典型的 CIDR notation:123.121.114.144/23注意 IP 地址后面的 /23,这就是 CIDR notation,它表示 IP 地址的前 23 bits 为 Network ID,剩余的 9 bits 为 Host ID。23 并不是 8 的倍数,我们将切分的精读提高到了 bit。我们可以通过简单的位运算,得到具体的 Network ID 和 Host ID,我们将 IP 地址和 /23 先转为二进制:10.
IP 地址10.
subnet mask上面两个二进制进行与操作,我们就可以得到 Network ID 和
Host ID:10.
Network ID00.
Host ID再将二进制转换为十进制,我们就得到了便于理解的 Network ID:123.121.114.0。由于 Host ID 占用 9 个 bits,这个子网里一共可以有 2 的 9 次方个主机数,也就是 512 个主机,这个子网网段的起始地址为 123.121.114.0,结束地址为
123.121.115.255。我们对于某一个网段内的 IP 地址,有个约定,第一个地址为 Network ID,最后一个地址是该子网内的 Broadcast ID,那么剩下的可用于子网内设备的 IP 地址数量就是 510 个了。出一个小题目,一个 IP 地址,可用于 Network ID 的部分最多是 30 位,这是为什么?希望阅读到这里,大家能大致明白 CIDR notation 的含义了。CIDR notation 只是为了以更小的粒度来切分 Network ID 和 Host ID,为了方便路由器能正确的识别出 IP 地址的结构,从而进行路由。记下来我们要进入下一个话题,IP 包是如何进行路由的?路由关于路由的讲解,我们分为两部分。首先我们需要明白 IP 地址是如何分配的,其次是 IP 包是如何基于路由表进行路由的。IP 地址分配IP 地址虽然只是一个二级的结构,但 IP 地址的分配却是一层一层,经历多层往下分发的,由一个国际机构 IANA 统一分配。具体规则可以参考 IANA 官网:IANA 会先按区域,将一大块 Network ID 分配个下一级的机构,下一级结构按大小可以分为:Local Internet registry (LIR),National Internet Registry (NIR),Regional Internet Registry (RIR),比如亚洲的 APNIC 就是一种 Registry。Registry 拿到的是一个比较大的 Network ID 范围,比如:Registry A 拿到的是 123.121.114.144/10Registry B 再从 Registry A 那拿到 123.121.114.144/15。。。然后 ISP (运营商)从 Registry X 那拿到一个更小范围的 Network ID,最后 ISP 才会将这一范围内所包含的 IP 地址分配给用户。所以整个流程是以 Network ID 块的大小为层级,一层层分发下去,越往下,Network ID 块所含的 Network ID 数量越少,所拥有的 IP 地址自然也越少。路由表用户拿到 IP 地址后,所发送包要经过一个个的路由器才能抵达正确的地址。理解路由器的工作原理之前,先要明白路由表的概念。网络上的路由设备,包括发送方本机,都是通过路由表来决定包将发往何方的。在 Mac 上,可以通过如下命令来查看本机的路由表:netstat -r每一个包都有它的目标 IP 地址,路由表就是根据目标 IP 地址,决定将包发往哪个设备。我以本机的路由表输出为例简单讲解下,大家也可以自己去多查阅下相关的资料。表的第一列为 Destination,用来规定目标 IP 地址的范围。Destination 可以是某一个具体的 IP 地址,用作精确匹配,也可以是使用 CIDR notation 来表达某个 IP 地址的范围。比如 192.168.3.3/24 表示,所有 Network ID 为 192.168.3.0 的 IP 地址。表的每一行为一个匹配记录,路由表会拿目标 IP 地址一行行的去匹配,直到找到最精确的匹配记录,如果找不到,则使用第一行 default 记录,default 记录对应的 gateway 即为局域网的默认路由器。第二列为 Gateway,是 IP 包的下一个抵达位置,如果我们将 IP 包从局域网发送到公网的某一个地址,那么 Gateway 的值就是我们局域网的默认为网关,也就是上面提到的 default 记录。第三列是 Flags,这个大家可以自己查阅资料来理解。最常用的比如 U 表示 UP,意味设备正常运行,G 表示 Gateway,即我们的路由器。…倒数第二列为 NetIf,即 Network Interface,也就是我们的网卡,一般设备都有多个网卡,比如无线网卡,以太网卡,路由表里的记录还定义了 IP 包将经由本机的那块网卡发送。最后一列是路由表记录的过期时间。理解路由表的关键在于明白 IP 地址的结构,和 CIDR 的表达方式,这样我们才能明白路由表里记录的匹配方式,才知道一个 IP 包在本机是如何决定下一个目标设备的。路由器的工作方式也是由类似的路由表来决定的,那么路由表里的记录是怎么来的呢?有些是手动配置的,叫做 static routing,剩下的是通过算法生成的,叫做 dynamic routing,这个话题就涉及到路由的工作方式了。路由的工作方式路由的工作原理包含的知识点较多,以后会单独开篇讲。这里只向大家推荐一个我收藏的 youtube 教学视频,讲解不同网络之间包是具体如何路由的,非常清晰。附上地址: 。总结关于 IP 地址,还有很多有趣的知识点可以谈论,后面应该会有更多的相关分享。这篇读完,希望初学网络协议的同学们,下次再看 IP 地址,能有「看山不是山」的境界,全文完。欢迎关注公众号:MrPeakTech","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T13:22:17+08:00","url":"/p/","title":"TCP/IP 系列之重新认识 IP 地址","summary":"TCP/IP 系列第三篇,关于 IP 地址。这是我最有意愿分享,也最有趣的一个话题。IP 地址有意思的地方在于,虽然只是一个简单的 IP 地址,短短的 4 个字节,32 bits,里面包含的知识却是森罗万象。智者看山,目之所及,胸中自起万千丘壑。知识底蕴够丰富,才能…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":5,"likesCount":36}},"annotationDetail":null,"commentsCount":8,"likesCount":53,"FULLINFO":true}},"User":{"mrpeak":{"isFollowed":false,"name":"MrPeak","headline":"公众号:MrPeakTech","avatarUrl":"/v2-79fbcdd188e_s.jpg","isFollowing":false,"type":"people","slug":"mrpeak","bio":"iOS 技术博客","hash":"9b13af9f7","uid":08,"isOrg":false,"description":"公众号:MrPeakTech","profileUrl":"/people/mrpeak","avatar":{"id":"v2-79fbcdd188e","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{},"columns":{"next":{},"mrpeak":{"following":false,"canManage":false,"href":"/api/columns/mrpeak","name":"MrPeak杂货铺","creator":{"slug":"mrpeak"},"url":"/mrpeak","slug":"mrpeak","avatar":{"id":"v2-d4bf75b366effc9","template":"/{id}_{size}.jpg"}}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{}}

我要回帖

更多关于 独立完成工作任务 的文章

 

随机推荐