iOS全解5:网络协议 HTTP、Socket/IM

一、基础概念

网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

OSI七层协议

OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,从上到下分别是:

  • 7 应用层 :HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP
  • 6 表示层 :NCP、XDR、ASN.1、SMB、AFP
  • 5 会话层 :SSH、ASAP、TLS、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD sockets
  • 4 传输层 :TCP、UDP、RTP、SCTP、SPX、ATP、IL
  • 3 网络层 :IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25
  • 2 数据链路层 :以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP
  • 1 物理层:线路、无线电、光纤、信鸽


IP:网络层

相当于导航
IP是网络层的协议,TCP是传输层的协议。它们一起把封装好的数据发送到想要传送到的地址,TCP好比一个司机,IP来导航;

TCP:传输层

---传输控制协议:提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。一个TCP连接必须要经过“三次对话”才能建立起来。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP:传输层 非面向对象连接

只管发送,不管接受。
优点:是效率高(用在即时通讯,如qq)
缺点:易丢包

---用户数据报协议(User Data Protocol):在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。

UDP协议的主要作用是: 将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

HTTP:应用层

---超文本传送协议(Transmission Control Protocol): 定义了浏览器(即万维网客户进程)怎样 向万维网服务器 请求 万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向对象(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

由于其简捷、快速的方式,适用于分布式超媒体信息系统。

相应的还有FTP应用层,以前用以局域网内使用,现在很少使用;TELNET用以发送邮件

XMPP协议


二、Socket

Socket 提供了网络通信的能力

Socket 是套接字,提供一套可用的用户接口。实质并不是一种协议。程序员使用这个接口提供的方法,发送与接受消息。可以和服务器处于长时间连接状态,等待过程中发送包。socket是在应用层传输层之间的一个抽象层,在设计模式中,socket其实就是一个门面模式。

Socket是对TCP/IP协议的封装,是一个调用接口(API),
方便用户使用,及时交互,一旦连接就一直通信。每隔一段时间发送一个心跳包检测。通过Socket,我们才能使用TCP/IP协议。

  1. Socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层 。

而http是个应用层的协议,它实际上也建立在TCP协议之上。 (HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。)

协议关系

一个TCP连接必须要经过三次“对话”才能建立起来,我们来看看这三次对话的简单过程:
1、主机A向主机B发出连接请求数据包
“我想给你发数据,可以吗?”

2、主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包;
“可以,你什么时候发?”

3、主机A再发出一个数据包确认主机B的同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
“我现在就发,你接着吧!”

image.png

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。

TCP协议和UDP协议的区别?

1)  是否连接面向连接面向非连接 
2)  传输可靠性,可靠不可靠 
3)  应用场合传输大量数据少量数据 
4)  速度慢快


三、webSocket

1、简介

WebSocket协议是基于TCP的一种新的网络协议,和http协议一样属于应用层协议,它实现了浏览器与服务器全双工(full-duplex)通信,也就是允许服务器主动发送信息给客户端。我在实现二维码扫描登录时曾使用过,有了它就不需要通过轮询或者建立长连接的方式来使客户端实时获取扫码状态,因为当扫码后,服务器端可以主动发送消息通知客户端。

2、webSocket和http的区别?

http链接分为短链接长链接,短链接是每次请求都要重新建立TCP链接,TCP又要三次握手才能建立,然后发送自己的信息。即每一个request对应一个response。长链接是在一定的期限内保持TCP连接不断开。客户端与服务器通信,必须要由客户端发起然后服务器返回结果。客户端是主动的,服务器是被动的。

简单的说,WebSocket协议之前,双工通信是通过多个http链接轮询来实现的,这导致了效率低下。WebSocket解决了这个问题,他实现了多路复用,他是全双工通信。在webSocket协议下客服端和浏览器可以同时发送信息。建立了WebSocket之后服务器不必在浏览器发送request请求之后才能发送信息到浏览器。这时的服务器已有主动权想什么时候发就可以什么时候发送信息到客户端,而且信息当中不必再带有head的部分信息了。与http的长链接通信来比,这种方式不仅能降低服务器的压力,而且信息当中也减少了部分多余的信息。

WebSocket的RFC标准是不会产生粘包、断包的问题。无需应用层开发人员关心缓存以及手工组装message。

1、单工通信:只支持单向通信,比如广播,你只能听,不能发。
2、半双工通信:双向通信,不能同时,比如对讲机,你讲完,然后对方才能讲;
3、全双工通信:双向通信,同时双向,比如移动电话,俩人是可以在电话里吵架的。

3、webSocket和socket的区别?

就像JavaavaScript,并没有什么太大的关系,但又不能说完全没关系。可以这么说:
1、命名方面,Socket是一个深入人心的概念,WebSocket借用了这一概念;

2、使用方面,完全两个东西。
总之,可以把WebSocket想象成HTTP,HTTP和Socket什么关系,WebSocket和Socket就是什么关系。

最后附上一张有意思的图片:


image.png

连接使用的协议
本地主机的IP地址、本地进程的协议端口
远地主机的IP地址、远地进程的协议端口。

客户端(ClientSocket):请求
服务端(ServerSocket):监听
连接使用的协议:连接确认

iOS 关于 Socket 的第三方库

1、CocoaAsyncSocket(GCDAsyncSocket) 下载地址
CocoaAsyncSocket 为Mac和iOS提供了易于使用且强大的异步通信库。CocoaAsyncSocket是支持tcp和udp的,利用它可以轻松实现建立连接、断开连接、发送socket业务请求、重连这四个基本功能。

2、SRWebSocket(SocketRocket) 下载地址

RFC规范:与实现是不一致,现实当中有几个问题:

每个message可以是一个或多个分片。message不记录长度,分片才记录长度。
message最大的长度可以达到 9,223,372,036,854,775,807 字节,是由于Payload的数据长度有63bit的限制。
很多WebSocket的实现其实并不按照标准的RFC实现完全,很多仅仅实现了50%就拿来用了。这就导致了,在WebSocket实现上的最大长度很难达到这个大小,于是,很多API的实现上是会有限制的,可能会限制你的发送的长度,也可能会把过长的数据直接以流式发送。

SRWebSocket中实现的方式上彻底解决了数据粘包,断包的可能。
数据是通过 CFStream流的方式回调回来的,每次拿到流数据,都是先放在数据缓冲区中,然后去读当前消息帧的头部,得到当前数据包的大小,然后再去创建消费者对象consumer,去读取缓冲区指定数据包大小的内容,读完才会回调给我们上层用户,所以,我们如果用SRWebSocket完全不需要考虑数据断包、粘包的问题,每次到达的数据,都是一条完整的数据。


四、即时通讯

第三方库件:环信、融云



未完待续。。。



参考文章:
1、SRWebSocket源码浅析
2、即时通讯下数据粘包、断包处理实例(基于CocoaAsyncSocket)

你可能感兴趣的:(iOS全解5:网络协议 HTTP、Socket/IM)