iOS随笔_网络(Socket/MQTT)

常见协议


  • IP (Internet Protocol) 网络层协议,网络之间互联的协议。

  • FTP (File Transfer Protocol) 文本传输协议

  • TCP (Transmission Control Protocol) 传输控制器协议

  • UDP (User Datagram Protocol) 用户数据报协议

  • HTTP (HyperText Transfer Protocol) 超文本传输协议


国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。

要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送信息 给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据的格式又是怎样的?

内容太多太杂,所以OSI模型将这些通讯标准进行层次划分,每一层次解决 一个类别的问题,这样就使得标准的制定没那么复杂。

OSI模型制定的七层标准模型,分别是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。

虽然国际标准化组织制定了这样一个网络协议的模型,但是实际上互联网通讯使用的网络协议是TCP/IP网络协议。


TCP/IP 是一个协议族,也是按照层次划分。共四层:应用层,传输层,互连网络层,网络接口层。

那么TCP/IP协议和OSI模型有什么区别呢?OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。

TCP/IP协议参考了OSI 模型,但是并没有严格按照OSI规定的七层去划分标准,而只划分了四层,个人觉得这样会更简单点,当划分太多层次时,你很难区分某个协议是属于哪个层次 的。

TCP/IP协议和OSI模型也并不冲突,TCP/IP协议中的应用层协议,就对应于OSI中的应用层,表示层,会话层。就像以前有工业部和信息产业 部,现在实行大部制后只有工业和信息化部一个部门,但是这个部门还是要做以前两个部门一样多的事情,本质上没有多大的差别。

TCP/IP中有两个重要的协 议,传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。

TCP/IP协议分为四个层次,但我们并不需要了解所有层次的协议,我觉得主要关注应用层和传输层的协议就可以了。

拿寄送邮件举例, A寄邮件给B,A关心的是用什么格式写什么内容给B(应用层内容),是寄挂号信还是寄平信(传输层内容),但是A是不会去关注邮件传送过程中采用了那条路 线,邮递员是如何把信件递送到B手里的(互连网络层,网络接口层)。


传输层有多个协议,但最主要的是TCP和UDP协议。两则的区别在于TCP协议需要接收方反馈,UDP协议不需要接收方反馈。

它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。

TCP就像挂号信,A电脑发信息给B电脑后,需要得到B电脑的反馈,这样A电脑就能知道B电脑是否已经收到信息。UDP就像平信,A电脑发信息给B电脑后,B电脑并不给A电脑发聩,A电脑发送信息出去后并不知道B电脑是否已经收到。

因此,TCP传输比UDP传送更可靠,但是TCP传输的效率就不如UDP了。至于,在传送过程中具体选择哪种传送方式,需要具体问题具体分析。在不可靠的 网络传送过程中一般选择TCP传送方式。在讲求效率,或者不在乎传送失误的情况下可以选择UDP方式来提高传输速率。


小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

应用层的协议有很多,每一个协议代表一种类型的服务。HTTP协议,万维网服务。FTP协议,文件传送服务。POP3,邮件服务,SOAP协议webService服务。


Socket

    我在搜索关于socket的资料时,发现有的说socket是指一个连接,有的说 socket是一指一个端点。拿打电话做比喻,A电话机和B电话机正在通话,那么socket是指的A和B之间的连接线呢,还是指电话机(端点)?
    我现在的理解是,socket就是一个连接中的一个端点,一次通讯(连接)a,b端都会有一个socket。一个socket对应一个连接。
    socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

    多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

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

Socket使用

一, 服务器监听
     sudo python server.py

二, 建立连接准备
    1)  CFReadStreamRef  CFWriteStreamRef(创建C的读/写流)
    2)  建立和localhost的连接: CFStreamCreatePairWithSocketToHost
    3)  将CFStream的读/ 写流转换成NSStream的输入和输出流
    self.inputStream = (__bridge NSInputStream *)readStream;
    self.outputStream = (__bridge NSOutputStream *)writeStream;
    4)  设置代理
        self.inputStream.delegate = self;
        self.outputStream.delegate = self;
    5)  将输入和输出流添加/注册到runloop中
        [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    6) 打开输入和输出流
        [self.inputStream open];
        [self.outputStream open];

三,  发送消息
    1)  实现NSStreamDelegate协议方法
    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    2)  在上面的方法中处理下面的事件类型
    3) 再实现tableview的data source方法
    —> 可变数组的个数即是table view的行数
    —> 可变数组中的对象即是每行显示的文本
- - -备注- - -
    Stream打开完毕:
    NSStreamEventOpenCompleted
    此时stream中有新数据:
    NSStreamEventHasBytesAvailable
    —> 读取来自服务器返回的数据,即在客户端处理inputStream中的数据
    —> 将上面读取的数据添加到一个可变数组中
    —> 刷新table view
    此时stream中有空间可以发送数据:
    NSStreamEventHasSpaceAvailable
    此时steam事件有错误产生:
    NSStreamEventErrorOccurred
    此时stream事件处理完毕:
    NSStreamEventEndEncountered

随笔资料来源:

1.TCP、UDP、HTTP、SOCKET之间的区别

2.TCP协议与UDP协议的区别

3.Socket

4.TCP/IP 网络协议


MQTT

Message Queuing Telemetry Transport 消息队列遥测传输


    MQTT 是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议 ----------------------百度词条解释

MQTT 特点

    MQTT 协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
    1.使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。

    这一点很类似于 XMPP,但是 MQTT 的信息冗余远小于 XMPP(XMPP 使用的是 XML格式传递数据)。
    2.对负载内容屏蔽的消息传输。
    3.使用 TCP/IP 提供网络连接。
    主流的 MQTT 是基于 TCP 连接进行数据推送的,但是同样有基于 UDP 的版本,叫做 MQTT-SN 。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。
    4.有三种消息发布服务质量:

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

    这一种方式主要普通 APP 的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。

“至少一次”,确保消息到达,但消息重复可能会发生。
这一种方式比较鸡肋,在我的想象中没能想到这种质量的发送在常规的 APP 开发中有什么用处。

    “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
这种最高质量的消息发布服务还可以用于即时通讯类的 APP 的推送,确保用户收到且只会收到一次。

    5.小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。

    这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。

    6.使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

    Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。

    Testament:遗嘱机制,功能类似于 Last Will 。

随笔资料来源:

MQTT协议及通讯的解决方案(一)

MQTTClient实战(二)

MQTTClient实战(三)


MQTTClient使用记录

[MQTTSession] mqttTransport didFailWithError Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}

host应该用MQTT服务器地址而不是Localhost字符串。

XMPP

      XMPP(Extensible Messaging and Presence Protocol, 前称)是一种以XML为基础的开放式实时通信协议,是由互联网工程工作小组(TETF)通过的互联网标准。简单的说,XMPP就是一种协议,一种规定。就是说,在网路上传东西,要建立连接,TCP/IP连接,建立后再传东西, 而XMPP就是规定你传的东西的格式。XMPP是基于XML的协议。

优点:
      XMPP协议是自由、开放、公开的、并且易于了解。而且在客户端、服务器、组件、源码库等方面,都已经各自多种实现。

缺点:
数据负载太重, 没有二进制数据

你可能感兴趣的:(iOS)