959网络
您的位置:网站首页 > 互联网资讯 > 正文

iOS-网络编程基础

作者:habao 来源: 日期:2019-11-4 16:49:21 人气: 标签:网络编程

  天天向上 蒋梦婕:当负责传送数据发送请求时:把需要发送的数据,按照应用的格式标准协议等封装成对应数据。当负责接收数据响应请求时:把数据按照应用的标准格式进行解析。例如在HTTP协议中,发送请求前要封装请求头,而接收数据时要解析响应头,这些解析过程方式是根据应用层的协议格式而定的,每个协议格式式不一样。如果不同应用标准格式不一样,会解析失败,无法正确显示数据内容。例如:A电脑是 Mac电脑用的pages软件写一个文本,然后传给B windows电脑,B电脑接收到的是A电脑的数据,数据格式完全跟A电脑一样。但是B电脑上没有能解析A电脑pages软件数据的工具。所以B电脑用户无法读取该文件。文件之所以无析不是因为电脑端不一样,而是因为没有软件解析对应数据格式的应用。 实际上数据格式的基本封装是应用自身完成的,还没有到达应用层这一步。拿HTTP说,当应用封装好需要传输的数据进行传输时(例如我们平时应用中把数据封装在字典里然后转成json字符串,这一步骤就是应用本身完成的封装),应用层会根据HTTP协议对数据进行处理(封装成HTTP的请求头),该协议会在传输的数据前段附加一个首部标签,该首部标签标明了发送数据的内容和发送的地址

  :数据的转换层。当负责传送数据发送请求时:会将应用层封装的数据转换成网络通用的标准数据格式进行传递(格式化编码)。当负责接收数据响应请求时:会将会话层传入的网络通用标准格式数据转换为对应设备的数据。不同设备对同一比特流数据的解析可能会有不同的结果。表示层与表示层之间为了识别编码格式,也会附加首部信息。

  :负责网络通信的建立和断开,选择网络通信的连接方式,是GET、POST、长连接,短连接。当负责传送数据发送请求时:把表示层的数据按照一定规律和标准拆分成数据块(每个数据库都有一个单独的附加首部信息,标记接收端和发送端ip)。当负责接收数据响应请求时:负责把比特流数据根据数据的每个节点拼接成完整的数据。会话层会在接收到的数据前端附加首部信息,记录数据的传输顺序信息。

  :主要是用户负责建立两端节点的通信关系,数据的传输安全,传输是直接连接双方节点ip地址,不经过由处理。如果A发送给B信息,传输过程中出现数据丢失或者网络出现异常只发送了部分信息到达B端,B端会反馈消息,告诉A,只收到了部分消息,A会将未发送的消息重新发送到B,比如迅雷下载资源的时候,可以暂停,下次继续按照上一次的进度下载。(猜测可能是传输结束后会话层中根据附加首部信息判断到数据传输顺序并不完整,会把不完整的顺序反馈给发送端,让附送端把未接收到的数据重新发送过来)

  :将数据传输到目标地址,目标地址可以是由多个网络或由连接而成的某个地址,因此改层主要是寻找地址和由选择。

  :负责物理层上的通信传输,把0、1序列化为有意义的数据帧传给对端。通过Mac地址,目的是识别连接到同一传输介质上的设备。因此,这一把分层中将包含Mac地址信息的首部附加到网络层转发过来的数据上,发送到网络。、

  带宽:数据的物理传输一般用光纤,双绞线电缆等来进行媒介传输,在这些媒介传输过程中,传输的速度是恒定的。如果要增加传输速度,只有增加传输媒介的通道数量,一般低速数据链是指传输媒介通道较少,同一时间通过的数据少。高速数据链是指传输媒介通道较多,同一时间可通过的数据多。传输数量又称只为带宽。传输媒介通道越多带宽越大传输的能力越强。带宽单位为bps(bits比特 Per second每秒,每秒的比特流传输速度)

  吞吐量:吞吐量的单位与带宽一样都是bps。吞吐量的大小不仅衡量带宽,同时也是衡量主机CPU处理能力,网络拥堵情况,报文中数据字段的占有份额(不计算报文首部,仅计算数据字段本身)等信息

  数据链层就是高速公,TCP、UDP就是能在这个高速公行驶的运货车,而IP就像是这个运货车的司机决定了货车从哪一个站出发到达哪一个站,而HTTP,FTP就是这个车上运载的货物。货物是由客户端与服务端协商定义的,由两端定义好使用同一套协议去识别验收货物,而货物的传输过程是由TCP/IP定义的。

  bit:位,比特位,是计算机中表示数据的最小单位。通常bit用来作为数据传输的基本单位,数据链层的传输是基于二进制的传输。

  传输控制协议,TCP/IP是互联网协议,Internet互联网的基础,由网络层的IP协议与传输层的TCP协议组成.TCP/IP定义了电子设备如何连入Internet互联网

  TCP又叫传输控制层协议位于传输层,基于字节流,数据在互联网之间传输的标准.它可以提供可靠的、较为安全的、面向连接点到点的网络数据传递服务。

  ,它占32位,标识了TCP报文中第一个字节在传输方向中对应的字节序号。当SYN时,SN(sequence number)=ISN(随机值)单位是byte。比如发送端发送的一个TCP包净荷(不包含TCP头)为12byte,SN为5,则发送端接着发送的下一个数据包的时候,SN应该设置为5+12=17。通过序列号,TCP接收端可以识别出重复接收到的TCP包,从而丢弃重复包,同时对于乱序数据包也可以依靠序列号进行重排序,进而对高层提供有序的数据流。另外如果接收的包中包含SYN或FIN标志位,逻辑上也占用1个byte,应答号需加1

  (这里按照32位字长位单位计算。 占4位标示4bit,而4bit最大二进制表示为1111,最大显示的值为15, 而单位是32位字长。表示每个单位按照32来计算。每个单位也就是4字节。最大能表示15个单位,就是60字节,TCP报头内容最多60个字节)

  RST:重置连接,通常,如果TCP收到的一个分段明显不属于该主机的任何一个连接,则向远程发送一个复位包

  -紧急指针(urgent poiner):主要是用作发送端向另一端发送紧急数据的一种方式,只有在URG标志值为1的时候才有效。它是一个正的偏移量,跟顺序号字段中的值相加表示紧急数据最后一个字节的序号。

  :至少1字节的可变长字段,标识哪个选项(如果有的话)有效。如果没有选项,这个字节等于0,说明选项的结束。这个字节等于1表示无需再有操作;等于2表示下四个字节包括源机器的最大长度,最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。

  :因为选择(options)项长度不一定是32位的整数倍,所以需要填充位,在这个字段中加入额外的0,来该字段的位数是32的倍数,TCP头是32的整数倍。

  2.TCP是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。TCP的Header中有Options标识位,常见的标识为mss(Maximum Segment Size),指的是连接层每次传输的数据有个最大MTU(Maximum Transmission Unit),一般是1500比特,超过这个量要分成多个报文段,MSS则是这个最大减去TCP的header,光是要传输的数据的大小,一般为1460比特。换算成字节,也就是180多字节。当需要传输的数据大小超过一个TCP段能接收的大小时,TCP就会把数据进行分段传输。这段内容摘取之该文章

  而什么是粘包拆包呢。假如一个数据被TCP分段成packet1和packet2两段时。可能会出现以下几种情况:

  2.接收端只收到一个数据包packet,由于TCP是不会出现丢包的,所以这一个数据包是由packet1和packet粘合在一起的,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。

  3.接收端收到了两个数据包,但由于某种原因packet2被分离成packet2_1和packet2_2,packet1的尾部和packet1_1的首部连在一起,合成一个大的报文,首先到达接收端端,过后packet2_2才到达,这种情况既发生了粘包,同时也发生了拆包。

  TCP为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据。

  3.当要发送的数据小于TCP发送缓冲区的大小,TCP会将多次写入到缓冲区的数据一次发送出去,将会发生粘包。

  接着服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态。

  服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输的数据是否已经传输完毕,一旦确认数据传输完成,服务端发送一个FIN消息给客户端,服务端进入LAST_ACK状态。

  最后客户端收到FIN消息后,进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。

  这里要单独说下TIME_WAIT状态,它比较特殊,因为处于TIME_WAIT状态的一方还没有TCP连接。如果某一方主动发出关闭TCP的请求,那么这一方最后要较长时间(2倍MSL时间)的处于TIME_WAIT状态,因为在最后一个ACK发送出去后,ACK可能会丢失,如果发生丢失,非主动关闭TCP请求的一方就会再次发送FIN请求,而此时主动关闭TCP请求这一方需要再次发送ACK。以确保正常中断双方数据通道,所以必须要让四次ACK都正常接收。

  TCP不允许新建立的连接复用TIME_WAIT状态下的。处于TIME_WAIT状态的连接通道,在等待两倍的MSL时间以后将会转变为CLOSED状态。之所以是两倍的MSL,是由于MSL(最长报文段寿命)是一个数据报在网络中单向发出到认定丢失的时间,一个数据报有可能在发送途中或是其响应过程中成为数据报,确认一个数据报及其响应的丢弃的需要两倍的MSL,这就意味着,一个成功建立的连接,必然使得先前网络中的数据报都丢失了。

  TCP将数据流拆分成多个部分,这些部分叫做TCP的数据段,利用IP协议进行数据段的传输。当TCP将把数据段分成多个数据报在IP中进行传输时,由于IP并不能接收的数据报的顺序相一致,TCP会在收信端装配TCP数据段并形成一个不间断的数据流

  通过IP,将TCP分割的数据段通过因特网在计算机之间传递.IP 负责将每个数据包,由至它的目的地.

  IP由器,当一个IP数据包从一台计算机被发送,它会到达一个IP由器.IP由器负责将这个数据包,由至它的目的地,直接地或者通过其他由器的再次传输.

  在一个相同的通信中,每个数据包经由的径可能都不同,因为数据包的传输过程是由IP由器决定的。由器负责根据通信量,网络中的错误或者其他参数来进行正确地寻址。

  计算机必须有一个IP地址才能够正确的连接互联网中.每个IP数据包必须有一个明确的地址才能够准确发送到目标计算机.

  在计算机中IP分为4段,每段的大小都是1个字节,而1个字节是8位(bit)二进制数(即0或1的8位数组合),那么最大的二进制数就是:11111111,化为十进制得:255。最小的就是:00000000,化为十进制得:0,所以每个IP地址由4组0到255之间的数字组合而成,并由点号隔开.例如:192.168.1.192。每个IP地址32bit

  UDP被称之为用户数据报协议位于传输层。提供非面向连接的网络服务,传送数据不需要和服务端建立连接,只需要知道数据需要发送到哪一个IP地址和端口即可,该服务传输的数据是不可靠的、可以由一点发送到到多点。这意味着它不数据报的到达只负责发送,也不所传送数据包的顺序是否正确,正因为UDP协议的控制选项较少,在数据传输过程中延迟较小所以数据传输效率很高,一般用于对可靠性要求不高的功能上,因为它不提供数据包分组、组装和不能对数据包进行排,了TCP的建立连接等开销较大的步骤。简单的说UDP只管发送数据,过程与结果并不在乎。一般网络质量较差时,采用UDP会造成数据的丢失。从UDP的结构来说,UDP首部采用了16bit大小的内容来标识UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。

  UDP长度(Length):由于UDP首部由4个字段组成,每个字段16bit即2字节。所以UDP长度最小8字节。UDP长度占16bit,最大表示值65535,而UDP报文占8个字节,IP包头占20个字节。所以UDP最大能表示65535-8-20=65507字节。但由于MTU的,实际在以太网中UDP最大可以表示1500-8-20=1472字节。

  MTU通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层所能通过的最大数据包大小(以字节为单位)。

  在以太网中,每个以太网帧都有最小的大小64Bytes最大不能超过1518Bytes,对于小于或者大于这个的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。

  socket又称之为套接字,因为它本身不是一种协议,是位于应用层和传输控制层之间的一组接口。它包含进行网络通信必须的五种信息:

  通过Socket接口,可以让应用层和传输层区分来自不同应用程序进程(端口)或网络连接的通信。建立一个有效的Socket连接需要至少配对两个套接字,一个运行于客户端的套接字,称为ClientSocket,另一个运行于服务器端的套接字,称为ServerSocket。套接字之间的连接过程分为三个步骤:

  Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接,UDP连接同理。

  TCP/IP只是一个协议,就像操作系统的运行机制一样,它是一套规则,必须要把规则具体实现,同时还要对外提供操作接口。像操作系统会提供标准的编程接口,TCP/IP提供给程序员做网络开发所用的接口,这就是Socket编程接口

  网络这一块主要是理论所以要耐着性子看,慢慢消化,当你看到这里的时候你就里成功理解网络编程又进一步了,废话不多说直接上代码,从代码里理解socket

  只是Socket客户端的部分代码。要更深入了解socket的读者,下载我Git上的Demo,里面有更加详细的注释,并且通过每个流程去深入仔细的了解socket的每个环节,包含客户端和服务端两个工程的代码

  WebSocket是一种HTML5的协议,与Socket不一样,Socket是位于传输层和应用层之间的抽象接口,主要是用于方便对TCP/IP协议等使用,而WebSocket是位于应用层的协议用于对数据的包装解析。

  WebSocket 是一个基于 TCP 的协议。建立一个 WebSocket 连接,首先需要客户端向服务器发起一个 HTTP 请求,请求头中包含了一些WebSocket特有的头信息,其中附加头信息Upgrade:WebSocket表示这是一个特殊的 HTTP 请求,请求的目的就是向服务端申请,将客户端和服务器端的通讯协议从 HTTP 协议升级到 WebSocket 协议。请求头中的Sec-WebSocket-Key1、Sec-WebSocket-Key2和[8-byte securitykey]是客户端向服务器端提供的握手信息,服务器端解析这些信息,并在握手的过程中依据这些信息生成一 个 16 位的安全密钥并返回给客户端,以表明服务器端获取了客户端的请求,同意创建 WebSocket 连接。一旦连接建立,客户端和服务器端就可以通过这个通道双向传输数据了,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。

  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,该协议支持所有平台,也就是说不论什么平台都可以使用集成此协议,MQTT被用来当做传感器和致动器的通信协议。MQTT基于订阅发布模式,客户端之间要互相通信,必须都订阅了同一个主题(topic),客户端之间是不能直接单独通讯的,必须通过服务端的发布。当群发消息的时候只需要把消息发布到对应群的主题(topic)中,通过服务端去发布到该主题中的每一个用户,所有订阅了这个topic的客户端就可以接收到消息了。

  MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议(简单的说就是数据的传输流量开销很小,三种QOS质量服务能较好数据传送),它具有以下主要的几项特性:

  QOS参数填0的时候表示“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

  QOS参数填2的时候表示“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

  基本理论差不多就这些,对于客户端来说已用。如果要更加深入的了解MQTT可以看看大佬翻译的IBM文档,想做相关优化而不仅仅是使用就耐着性子看完吧。

  目前就iOS来说,一般使用MQTT都是用的MQTTKitMQTTClient这两个开源库。不过MQTTKit确实很久没有更新了,最新一次更新都是2015年9月了。所以似乎大家都用的MQTTClient。

  服务端:对信息的接收记录转发,因为大多数时候客户端发送数据给另一个客户端不是直接告诉客户端该用户的IP地址,而是userId。而服务端根据userId去查找该用户的IP。想当与一个由功能

  网关:这里的网关与计算机的网关不一样,也是XMPP的特点之一,毕竟XMPP完全开源可扩展,例如邮件方式,假设A用户想和B通信,他们两人的帐号分别在QQ和谷歌的服务器上。A用户客户端将讯息传送到QQ服务器。QQ服务器与谷歌服务器的连接。谷歌服务器将讯息寄送给B。两人的服务器是由两家不同的业者所提供的,而他们彼此时,就是依靠网关处理完成发送

  在iOS中一般使用XMPP都是用的XMPPFramework。由于本人没有用过这个库,所以代码暂时就不加进去了。等以后对这个有一定深度的掌握后加入代码。

  HTTP称之为超文本传输协议(HTTP,HyperText Transfer Protocol),是最为常用的网络协议。所有的件都必须遵守这个标准。HTTP协议采用了请求/响应模型。客户端向服务器发送一个HTTP请求,HTTP会把内容封装成请求头,请求头中包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

  Content-Length:请求中内容的大小。这个大小是包含了内容编码的,比如请求是采用gzip压缩,那么Content-Length就是压缩后的大小

  multipart/form-data: 它会将请求表表单中的每条数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

  当请求方式为GET时候,浏览器用x-www-form-urlencoded的编码方式把form数据部分转换拼接成一个字符串(例如:name1=value1&name2=value2...),然后把这个字符串追加到url后面,用?分割,加载这个新的url。

  在Http中,可以采用gzip编码方式,对body内容进行编码,来从而达到对内容压缩的方式。

  gzip, compress, 以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。 其中gzip通常效率最高, 使用最为广泛。

  HTTP协议采用“请求(request)-应答(response)”模式,当Connection为非KeepAliv时,每次请求/应答客户端和服务端都要新建一个连接,完成请求应答之后立即断开连接(此时HTTP协议为无连接的协议);当使用Keep-Alive(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接具有持续有效性,当出现对服务端的后继请求时,Keep-Alive功能避免了建立或者重新建立与服务端的连接,避免了建立/连接的开销,它更高效,性能更高。

  分块编码是一种HTTP超文本协议传输数据的一种机制,它表示服务端传送给客户端的数据可以拆分为多个部分进行传输。数据拆分成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小

  每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。

  HTTPS是基于TCP传输层与HTTP应用层之间加入了SSL。让HTTP与TCP交互之间多了一层安全控制层。

  SSL又叫安全套接字层,通过互相认证、使用数字签名确保完整性、使用加密确保私密性来安全通信。SSL分为两层,SSL记录协议层,它建立在TCP之上为高层协议提供数据的封装、压缩、加密等基本功能。SSL握手协议层,它建立在SSL记录层之上,主要是在传递数据之前对通信双方的身份认真并协商加密算法交换加密密钥。在SSL3.0之后,IETF指定了一种新协议,TLS,它是SSL3.0的后续版本。TLS与SSL算法不同,记录的版本号值不同,相比之下,TLS比SSL更加安全。

  第四行到最后一行:是TLS的四次握手。之间穿插的TCP的ACK请求是接收方为了确认接收到TLS信息而发送的确认序列,这是TCP常识。

  2.加密套件 cipher suites 列表, 每个加密套件对应前面 TLS 原理中的四个功能的组合:认证算法 Au (身份验证)、密钥交换算法 KeyExchange(密钥协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验)

  5.server_certificates, 服务器端配置对应的证书链,用于身份验证与密钥交换。

  这里当客户端收到了serverHello信息结束后,客户端会去验证证书的性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,性验证包括如下:

  • 证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同;

  第三次握手:证书的性验证通过后发送消息,其中client_key_exchange是,性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器,此时客户端已经获取全部的计算协商密钥需要的信息:两个随机数与自己计算产生的 Pre-master,计算得到协商密钥, change_cipher_spec是,客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信,encrypted_handshake_message是,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商密钥 session secret 与算法进行加密,然后发送给服务器用于数据与握手验证。

  此时服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个随机数,计算得到协商密钥。计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message是,验证数据和密钥正确性,change_cipher_spec是, 验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信,encrypted_handshake_message是, 服务器也结合所有当前的通信参数信息生成一段数据并采用协商密钥 session secret 与算法加密并发送到客户端。

  1、TCP为什么需要3次握手,4次断开? “三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端...

  网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编...

  计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...

  国家电网公司企业标准(Q/W)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...

  一、什么是TCP/IP 网络和协议 1. TCP/IP是一类协议系统,它是一套支持网络通信的协议集合。网络是计算机...

  

读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址:
下一篇:没有资料