今儿是个还债的日子,没错,承诺了许久的网络传输篇虽然没有千呼万唤,不过我还是厚着脸皮始出来,继上两篇文章总结了一下开发IM语音功能时所遇到的音频问题,而今天就让我们来看看这个让我们看似近在眼前,确始终犹抱琵琶半遮面的网络传输吧~不过在开始我先要提醒一下诸位看官,我们的本章的内容中只是介绍网络的基础只是以及网络协议部分的知识,针对于如何在IOS下应用使用各种协议进行开发,我们将在IOS网络开发应用篇中详细的讲解,或许对于几千字的纯文字描述来说,讲解各种协议以及一些网络基础知识会显得非常枯燥,但相信我,这几千字的文章中是你最易于理解最全面最值得你品读的,关于一个程序所应具备的互联网知识。
网络一词早已不是什么新鲜话题,不要说来看本文的技术型看官们,就连个小学生嘴里都能冒出几句http,tcp等网络协议的名称,可网络是怎么传输的,协议又是干嘛用的?恐怕这一问就要从念叨名词的受众人群中砍掉绝大部分的回答者了。没错从开头看来大伙应该就明白了,笔者又要从远古时期开始讲解,别嫌我烦,做学问要刨根问底,没有个打破沙锅问到底的精神,就做不成大学问。现在这个时代,是知识爆发的时代,也是知识竞赛的时代,你懂个浮皮潦草,别人都懂没意思,想要出类拔萃,就要为人所不能为,知人所不知,方可凭其一身学识,立一方事业。好了跑偏的话题到此为止,接下来,就让我们从“远古时期”一步步来理解网络传输的概念、原理、最终到如何善用。
在计算机领域中,网络就是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。我们用直观一些的白话来说,可以认为是看官与我之间架起一根管道,而通过这个管道把某个物体从一端仍到另一端去,这期中所用到的道具、动作以及双方的通知准备就是计算机网络运行的基础模型。计算机网络的创造者也是人,他们在创造这个跨时代产物的时候也是通过自身常识来判断和设计的,或许这个架起管道的实例并不恰当或具体,不过简单的动作往往更能让人容易理解。从计算机的角度说,计算机网络常用的传输模式是遵循网络七层协议(OSI),而这个协议就是将这个简单的过程复杂化,以达到很多简单过程无法达到的理想效果。说实话如果可以,我一直再绞尽脑汁改如何避开OSI来继续讲解,因为他太底层太复杂并且作为我们程序员并不需要取完全了解它,最重要的是。。。说来惭愧,笔者也不是那么了解这个七层协议,无法讲解的面面俱到,但是,想到下面对于tcp、udp以及http等常用协议的讲解,又不得不提到那么一点,所以我在此设下伏笔,稍后我们会略有涉及,但出于不要误人子弟的中心思想,本文不会详解,如果又感兴趣的看官自行询问度娘,作为一代傲娇弱受,她可谓是上知天文下晓地理,而对于网络七层协议她更是专家中的专家
如果说网线、路由、网卡等硬件设备是我们之前所提到需要传输时架起的管子,那么作为程序员,我们更应该关注的问题应该是如何再错综复杂的管子之间找到要仍的那一根(要知道因特网连接的计算机是数以亿计的!),如何告诉对方我们要扔出物体了,如何扔出我们的物体,以及如何接到这个物体。以不至于东西仍错了管子误伤到无关的路人,或是东西已经扔到对方脸上,他还不知道是什么。或许真正的人不会那么迟钝,因为人是神奇的天作之合,最不可思议的大自然结晶,而计算机则不然,如果管子另一端是犹如计算机的机器人,那么你要是不以他理解的方式告诉他一下,真的就会砸到脸上都木有反应啊!
没错,将上面一段话用稍显学术点的话语总结起来就是,数据行驶在路由、网卡、网线、无线信号之上,而我们程序员要做的是在数据出发前,出发后,以及接收前和接受后所做的一切准备、判断、解释、执行、保存等工作,这些工作可谓繁多复杂,无规矩不成方圆,如果每个程序员都按照自己想法去编写,那么我想我在MSN上从这段发送一句你好之后,你在另一端可能看到的将会是我问候你家庭成员的肮脏语句,那么….后果将不堪设想不对么….为了避免这样的错误发生,为了让苍老师的种子总是可以安全的发送到下一位基友的手中,并且保证他下载的不会是金刚葫芦娃1080P的全集,于是众多的网络协议诞生了。
这里我们来深究一下,为什么网络协议要叫协议?这个名字让众多刚接触的人感到高不可攀,难以理解,简单来说,就是产生了虽但厉的赶脚!回到正题,为什么网络协议不叫网络黄金合体?不叫网络十万个为什么?不叫网络布拉布拉得痛呢?我们接着从现实的事物中来体会协议二字的意义,如果我现在接一个盖楼房的项目,那么雇主要跟我谈一个合同,从哪天到哪天让我去招工,哪天到哪天开始动工打地基,哪天到哪天盖楼,盖到什么时候结款。那么这样一个流程就是一个协议的达成。我们双方遵循协议的规定,按照协议中制订的计划一步步完成。如果我在招工的时候自己跑去挖地基了,挖地基的时候又想要开始收钱,那么雇主会一个嘴巴把我扇回去招人,等到盖楼的时候,我发现地基还没挖完然后挖掘机等机器已经不存在了,于是我只能带着我刚招到的工人用双手刨地基了。。。到最后就是整个工程被我弄得乱七八糟。没错,互联网协议虽然功能大相径庭,但是总的说来思路是一致的,我们该在什么位置做什么事,这就是协议所规定的,我们要做的是先按照需求选定协议,再按照协议的规范一步步将自己的需求完成,那么终于改说一下协议都有哪些了。
好吧,我们就先说一点我们平常常见的来举例。TCP、UDP、FTP、HTTP我相信这些名词大家早已耳熟能详,但是,我首先要提醒各位的是,别光看他们的名字都是XXP或者是XXXP,并且都名字后面都加上了协议就把他们归为一类,他们有着本质的区别,具体的说,TCP、UDP是同一类,他们是位于网络七层协议中的第四层传输层,再准确一点他们是完成第四层传输层所指定的功能,也是位于我们计算机编程人员所接触到的网络七层协议中的最底层(前三层由硬件构成),而FTP与HTTP他们完成的是网络七层协议中第七层也就是最顶层的应用层。还要提醒大家的是,虽然从字面上看第四层与第七层相距甚远,而实际上,他们的跨度不是很大,更并非风马牛不相及,相反他们是紧紧相连的,比如,FTP其实就是基于TCP/IP协议而实现的文件传输协议。
我们从深到浅从计算机网络是什么说到了网络协议是什么有哪些,接下来我们需要换个顺序,从浅到深,依次讲讲今天说到的这4个协议,第一个协议,我们先来说说我的诸位同事——php程序员们所最常接触的http协议。
Http协议,全称hypertext transport protocol, 中文名称是超文本链接传输协议他详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。他是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。他诞生于上世纪九十年代初期,最初被广泛应用的是http0.9,但是它最为知名并且被沿用至今的就是http1.1。
http的特点主要由以下4点较为突出。
1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
3、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
简单的来说,http协议架起的就是一根用户和服务器之间的单向请求管道,用户可以随意向服务器访问,并且要求服务器返回数据,但是并不允许服务器通过相同的方式,向客户访问,这种机制保证了客户端与浏览器单次通话的效率,但是也存在着对于开发者而言不够便捷的问题,当然现如今我们已经可以通过很多技术手段来达成服务器的主动相应,但是,这并非http本身具有的特性。同时Http协议的连接可以理解为即时性的,他每完成一次操作请求,需要重新进行查找、准备、传输、响应、回传、关闭等这个流程步骤,而不能像tcp协议那样一次性连接之后可以持续的收发请求即时做出反应,等所有操作完成再关闭连接。所以,其实你在浏览网页的时候,输入一个网址或者点击一个连接都是重新向服务器发送请求并要求返回数据,这样的效率可以说从原理上来讲并不高效,但是现在我们可以通过诸如缓存等方式来减少这种操作的弊端。Http协议中总共定义了八种方法来表明指定资源的不同操作方式。也就是对某个网址下的网页,或者某个URL下的文件的八种不同操作。
返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
OPTIONS请求方法的主要用途有两个:
1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。
向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
客户端可以使用HEAD请求来收集相关信息以确定如何操作该资源.例如,在IE中,如果一个OBJECT元素缺少TYPE参数,浏览器就会发送一个HEAD请求,目标URL为这个OBJECT元素的SRC属性指定的URL.然后浏览器就能够根据响应中的Content-Type头知道这是哪种类型的OBJECT.
向指定的资源发出请求。获取一个文档,大部分呗传输的浏览器的html,images,js,css,……都是通过get方法发出请求的。它是获取数据的主要方法
注意:GET方法不应当被用于发布命令,更新数据库,或任何明确的客户端动作。其中一个原因是GET可能会被网络蜘蛛等随意访问。
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
所谓安全,意味着操作用于获取信息而非修改信息。换句话说,GET请求一般不应该产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。这里安全的含义仅仅是指是否修改信息。
接下来,POST的安全性要比GET的安全性高。注意,这里所说的安全性和上面的GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不做数据修改,而这里安全的含义是真正的Security的含义,比如通过GET提交数据,用户名和密码将铭文出现在URL上,因为登陆页面有可能被浏览器缓存,其他人查看浏览器的历史记录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击,虽然我不知道它到底是什么攻击。。。喜欢研究“如何不使用菜刀做菜而去杀人”的童鞋请自行百度“跨域伪造请求”。
通常用于向服务器发送请求,如果URI不存在,则要求服务器根据请求创建资源,如果存在,服务器就接受请求内容,并修改URI资源的原始版本。
POST请求的URI表示处理该封闭实体的资源,该资源可能是个数据接收过程、某种协议的网关、或者接收注解的独立实体。然而,使用PUT请求对服务器操作的情况下,如果是要上传文件,则需要确定服务器上尚无重复的文件名,并且生成URI而后提交请求,如果该文件已经存在,则会出现被替换的情况,即使服务器做出判断判别出当前文件已存在,针对PUT请求,服务器也无法修改PUT请求当前所要操作的URI,智能拒绝用户的请求并且让用户重新发送该请求。
请求服务器删除Request-URI所标识的资源。
在服务器接收到DELETE请求对某个URI的删除请求后,服务器并不会马上对其进行操作,即使客户端接收到的了200 OK信息的返回码,也只是代表服务器已经成功接收到该请求,具体操作则由服务器端完成。
回显服务器收到的请求,主要用于测试或诊断。
TRACE和TRACK是用来调试web服务器连接的HTTP方式。
支持该方式的服务器存在跨站脚本漏洞,攻击者可以利用此漏洞获得合法用户的私人信息。
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
以上就是Http协议的八种请求,也是通过http协议与服务器沟通的所有方法,如今http协议被大量的应用在万维网领域也就是我们常说的web开发之中,但不代表http协议只能使用在web端,比如手机应用之中,也存在很多使用http协议与服务器建立沟通的。比如比如百度地图API,新浪微博App,比如人人网手机端,比如我们的三姑……
首先,我需要感谢看官您读到了这里,这属实不易,我想如果您真的是用心读到此处估计会问,你洋洋洒洒写了2000多字的http协议,可它跟你之前所说的架起一根管道对仍实物的比方好像完全没什么关系,bingo!全中!就是这样,http协议的运作模式的确和之前的比喻不太相符合,如果硬要做一个比方的话,那么服务器就相当于棒球中的接球手,而客户端则相当于投球手,每次当客户端投出一个球之后,服务器都会告诉你这是个好球还是坏球,当然也有可能是被本垒打了。。。之所以要把http放到第一个还讲这么多,是因为它确确实实是我们在日常应用中最容易接触到的协议,比如你输入任何网址之前先打上的“http://”。好吧,让我们回到讲解http协议之前,也就是管道对仍物品的例子中,没错,接下来我们要说的就是与此例非常相近的FTP协议
FTP协议全称File Transfer Protocol,中文名称文件传输协议。它使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。文件传输协议是TCP/IP网络上两台计算机传送文件的协议FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录.
没错,就如同他的名字一样,FTP是专门用于文件传输的协议,而就像我之前说过的那样它的底层是基于TCP协议的。与http的模式不同,如果想要通过他来完成数据的传输,那么我们首先要做的第一步是先建立连接,而非直接对某个服务器发送请求。FTP有两种使用模式:主动和被动。主动模式要求客户端和服务器端同时打开并且监听一个端口以建立连接。在这种情况下,因为必须开放一个随机的端口以建立连接,当防火墙存在时,客户端很难过滤处于主动模式下的FTP流量。所以,创立了被动模式。被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。
一个主动模式的FTP连接建立要遵循以下步骤:
1.客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,源端口为随机端口x,在客户端,远程端口为21,在服务器。
2.客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。
3.服务器打开20号源端口并且建立和客户端数据端口的连接。此时,源端口为20,远程数据端口为(x+1)。
4.客户端通过本地的数据端口建立一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经建立好了一个连接。
被动模式FTP:
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1. 从任何大于1024的端口到服务器的21端口 (客户端的初始化连接)
2.服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接)
3. 从任何大于1024端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)
4.服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)
好吧,我知道以上这些虽然足够准确无误,但是它会让人感觉头晕目眩,什么是端口?哪来的PORT和PASV?让我们用通俗一些的话语来重新描述一遍整个过程。
首先,FTP下载模式的确立需要一个FTP服务器和一个客户端,主动模式中,客户端会按照指示找到一个FTP服务器,如果连接成功了,客户端会先向服务器端发送一个指令,这个指令包含的内容大致是你的所在位置。
接下来就像我们之前举的例子一样,当管道架到另一头之后,对方会告诉你,你的管道已经在我手里了,可以准备发东西了。此时的FTP服务器就会回头跟客户端打个招呼,“嘿,兄弟,你找到我了”,而当前这根管道并非我们用来互扔物品的管道,他用来传递一些命令,这就像你发了个不会上门送件的快递给朋友,与此同时你还要先打电话告诉他一下,“别忘了取邮局取快件”那么现在这根管道就相当于你的电话。你可以在其中传达各种信息及命令,比如你想要通过哪个物流来完成这次快递,顺丰还是圆通?再比如你要传输的文件是什么,以及你是谁等等等等。
还记得我们第一步中发给服务器的那个地址么?没错是你的地址,当服务器向你打过招呼后会紧接着向你之前所给出的地址发出一个连接,这个连接管道就是用来传输文件的管道了,而作为客户端在成功连接之后你也应该用同样的方式回头再打个招呼,“嘿,你真聪明,没错管道送过来了!”而这就是整个主动FTP连接的建立过程,在这之后你就可以与连接完毕的FTP服务器进行文件收发了。但是我们的过程中有个让人不太满意的地方,是的,当服务器想你的机器进行访问的时候,可能你还没接到管道,就被自己家的门卫给轰跑了,因为门卫觉得他来历不明,竟然还要想连一根管子进小区,没错像这样可恶的家伙可能你的防火墙门卫每天都会轰出去很多个~因为有很多家伙想在你不知情的情况下通过一根根管道在你的家中行窃!
当然问题都会又解决的方法,这就是被动FTP,它与主动FTP的不同的地方就是,你在连接服务器之后并不会发给他地址,让它直接来找你,而只是告诉他“嘿,伙计,我可算找到你了,等下哈,我马上把管道牵过来!”然后服务器就会乖乖的把一个约定地址回发给你,当然这个地址会与你刚找到他的那个不同,那是一个准备要简历传输管道的地址。接下来客户端要做的就是按照接到的地址再去连接一次服务器,这样传输的管道就架好了,同时你的门卫也不会像对待那些歹徒一样赶走服务器了。
好了,FTP就介绍到这里,或许我换了一种解释方法之后你明白了FTP是怎么运作的了,可是依然不了解什么是端口,没关系,接下来我们将要要更深入一层,解一下TCP/IP协议,与UDP一样它是位于软件所涉及到最低层的网络协议,而在这个过程中,我不只要告诉你什么是端口号,还要告诉你很多FTP和TCP他们最大的区别。
TCP全称Transmission Control Protocol中文名,传输控制协议 ,TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。而我们之前讲到的TCP/IP准确的来说是不完全相同的,因为TCP只是一部分,而后续的IP是另一部分
如果你还听说过TCP/IP4,TCP/IP6的话其实别把他们之间的TCP分开看因为那是一个东西,不同的其实是IP4和IP6,IP4中规定IP地址长度为32,即有2^32-1(符号^表示升幂,下同)个地址;而IP6中IP地址的长度为128,即有2^128-1个地址。说实话我们或许不应该谈论太多关于IP的内容,所以我只把IP4和IP6之间的区别列出了一点,因为IP他更倾向于网络七层协议中的第三层,他的作用就是用于表示每台计算机,在一个局域网或广域网或任何一个网络中的物理地址,相当于一台计算机的门牌号,当然这是电子门牌号,所以设置与更换起来可能让你觉得没有实际的门牌号那么困难,起码你不用找有关当局申请或协商,但是作用其实是一样的——都是让别人来找到你的位置。
好了关于IP我们就说这么多,现在回头我们来说说TCP,前面说过,TCP通讯协议是面向连接的,可靠的,基于字节流的运输层通信协议,那么这一连串的名头都代表着什么?我们逐一讲解。
首先要说到的就是面向连接,说到这个名词我们就得说说与它向对应的一个名词面向无连接, 其实我们通过http与FTP就可以看出二者的区别,当然我这么说肯定会挨喷但是为了有助于各位理解我还是要说,http起码从操作上来讲,让你感觉,不管服务器是否开启,是否接受,我都只管发送我的请求,并不需要先向服务器确认什么,即时服务器是关闭的,没有启动的,或者是网络断开的,对于我们客户端来说该发送数据依然可以发送,当然不过是服务器接不到嘛。但是FTP则不然,我们在真正发送数据之前需要先跟FTP服务器进行连接通信,当一系列的通信完成之后我们才可以做一系列传输数据等工作。这就是二者的区别。但是我必须要澄清,Http协议的底层虽然不是全部,但是依然主要依靠TCP的面向连接来完成的,而真正面向无连接的协议是UDP,关于这方面的知识,有兴趣的童鞋可自行百度。
面向连接和面向无连接之间二者的区别我们理解了,可以确定的是,面向无连接协议传输速度要比面向连接的传输速度快很多,非常多,但也仅限于你的网络带宽之内,同时他还存在着很多不安因素,就像之前的比喻,如果我把管道加载一个机器人面前并且毫无前兆的就通过管道向他仍各种物品,那么结果就是砸到他脸上他都会置之不理。而再实际开发中,诸如此类的问题就如繁星一样,躲到你忘记几个都不会发现。。。所以说TCP协议是可靠的。
最后我们来说说什么是基于字节流的,字节我们很好理解,计算机中一切的存储内容,不论是内存还是内盘之中的存储信息都是通过01机械码来实现的,而每8位的01机械码所组成的就是1字节,以此向上的单位千字节就是KB,1024字节等于1KB,当然在不同系统下换算进制不一样,比如MAC系统下就是1000进制,而之后的MB,GM,TB我相信你们都懂的- -而流就是不包含边界数据的连续数据流,字节流我们从字面分析来看,一长串以字节为单位组成的不包含边界数据的连续数据流。
如果我们要使用TCP协议来传输数据的话就得先确认一个需要链接的对象,请注意我这里的用词,并非服务器也非客户端,没错TCP的连接建立,从协议本身来讲并没有服务器或者客户端一说,他只是将两个IP地址的计算机相连接起来,而我们需要的知识对方的IP地址,可是问题来了,或者我的服务器上并不只是运行一个服务器端程序,有人访问我的时候我该如何区分这些访问信息分配给不同的程序呢?没错,这里我们就用到了套接字socket它与我们之前总是提到的端口号密不可分。
socket的英文原义是“孔”或“插座”。作为4BDS UNIX的进程通信机制,取后一种意思。通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。常用的socket套接字有3种,而我们通过TCP协议所使用的就是流套接字(SOCK_STREAM)。而我们之前所说的端口号就是给予不同套接字所绑定的唯一的编号ID,取值范围再0-65535之间,而前1024个端口是被各系统所占用内部定义使用的换而言之就是我们在开发应用程序分配端口号是要分配编号在1024以上的。而我们之前再FTP举例中所提及的20端口号和21端口号就是特列,他们就是被系统所分配专门用于FTP传输的端口号。
通常一个基于TCP协议的客户端与服务器端的流程如下:
以上就是一个服务器与客户端之间最简单的连接建立的过程。
在创建连接之后我们要做的就是开始收发数据,连接一旦创建第一件事情就是开启一个无线性的循环/等待的的过程,不论是客户端还是服务器端都要让socket不停的接收数据,哪怕根本没有数据。这样是为了再你需要向对方发送数据时,你只需要将需要发送的数据写入数据流,那么对方就可以读到你所写入的内容了,别高兴的太早,这一切并没有看起来的那么简单。
按逻辑来说在建立连接之后,除非手动关闭,否则连接理论上与程序逻辑中会一直判定为该连接存在,但实际上我们需要通过很多手段来确认连接是否正常。通常我们使用心跳包的方式来确认连接的正常性,所谓的心跳包就是每间隔固定时间,从客户端向服务器端发送的一个固定的数据包,服务器则会根据受到包的内容判断出这个数据包是个心跳包,同时也返回给客户端一个信息,以让客户端得知连接正常无误。以继续进行连接操作,又很多情况会导致程序逻辑上的连接状态与实际的连接状态不同,所以当客户端长时间接收不到心跳包的返回时我们就需要对程序的逻辑做出一定的修改,以避免严重错误的发生。
除此之外,我们还要判断数据是否完全发送/接受,而且对于数据的处理也会面临很多问题,因为TCP协议是基于字节流传输的所以数据并没有开头与结束之分,甚至如果一口气连续发送几个文件的话,我们在另一端接收到信息时甚至无法分清有几个文件?他们都多长?这些都不知道,只是收到了一长串很长很长的字节流。
就如上面所说的,使用TCP协议是通过系统最底层的网络传输协议来传输数据,如果说http协议和ftp协议是定义了如何接收信息和如何区分信息以及传输信息的格式。那么tcp完成的就是确立目标位置,并将数据统一化之后发送到目标位置。直接通过tcp协议进行开发可以达到最理想的面向连接协议传输效果,相对而言的我们需要付出更多的精力去编码,用大量的代码来维护链接的安全,在保证他的健壮性的同时,还要设定数据的分割以及接收的方式,等等等等,好吧,如果我说道这里你就觉得复杂了,我只想提醒你,后面还有UDP呢。。。。。。
好了今天天的内容就到这里吧。。。已经洋洋洒洒写了近万字。。。我如果非要把UDP也讲完,估计也没有童鞋能够看完了,对于UDP我已经不打算再此为大家继续讲解了,因为它的内容其实前面我们已经提得差不多了,而关于具体的详细内容,请有心得童鞋自行百度吧,我们下篇文章将介绍,如何在IOS系统下使用http和tcp两种方式的网络传输。好吧各位看官,我们下期见。
转载:http://cvito.net/index.php/archives/898