iOS开发轻松学习Socket

iOS开发 Bonjour的使用

 

一、网络模型

网络模型简介

三种网络模型(OSI七层参考模型、TCP/IP参考模型、五层参模型)

TCP/IP协议簇是Internet的基础,也是当今最流行的组网形式。TCP/IP是一组协议的代名词,包括许多别的协议,组成了TCP/IP协议簇。其中比较重要的有SLIP协议、PPP协议、IP协议、ICMP协议ARP协议TCP协议UDP协议FTP协议DNS协议SMTP协议等。TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

 

 

 

二、Socket

 

2.1、半包、粘包、分包

  报文:报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

  半包:指接受方没有接受到一个完整的包,只接受了部分,这种情况主要是由于TCP为提高传输效率,将一个包分配的足够大,导致接受方并不能一次接受完。(在长连接和短连接中都会出现)。

  粘包:指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。

  分包:指在出现粘包的时候接收方要进行分包处理。

 

2.2、

在哪种情况下会出现分包与粘包: 

TCP通讯为何存在粘包呢?主要原因是 TCP 是以流的方式来处理数据,再加上网络上 MTU(最大传输单元) 的往往小于在应用处理的消息数据,所以就会引发一次接收的数据无法满足消息的需要,导致粘包的存在。

  • 1,要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生分包。
  • 2,待发送数据大于MSS(最大报文长度),TCP在传输前将进行分包。
  • 3,要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出 去,将会发生粘包。
  • 4,接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

区分MSS与MTU

最大报文段长度(MSS)与最大传输单元(Maximum Transmission Unit, MTU)均是协议用来定义最大长度的。不同的是,MTU应用于OSI模型的第二层数据链接层,并无具体针对的协议。MTU限制了数据链接层上可以传输的数据包的大小,也因此限制了上层(网络层)的数据包大小。例如,如果已知某局域网的MTU为1500字节,则在网络层的因特网协议(Internet Protocol, IP)里,最大的数据包大小为1500字节(包含IP协议头)。MSS针对的是OSI模型里第四层传输层的TCP协议。因为MSS应用的协议在数据链接层的上层,MSS会受到MTU的限制。

解决粘包/分包常用方式:、

处理粘包的唯一方法就是制定应用层的数据通讯协议,通过协议来规范现有接收的数据是否满足消息数据的需要。

1、定义数据包包头,包头众包含数据完整包的长度,接收端接收到数据后,通过读取包头的长度字段,便知道每一个数据包的实际长度了。

2、数据包之间设置边界

 

 

 

2.1、TCP三次握手和四次握手

详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”

 

 

 

为什么客户端在TIME-WAIT阶段要等2MSL?

为的是确认服务器端是否收到客户端发出的ACK确认报文

当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。

服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;

 

2.2、BSDSocket

socket编程 —— BSD socket API

iOS开发轻松学习Socket

 

2.3、CoreFoundation框架之CFSocket

CFSocket学习

demo 源码地址:https://github.com/medivh-xiong/CFSocket_Demo.git

 

三、CFNetwork框架

CFNetwork 只是对 BSD socket 的进行了轻量级的封装,但在 iOS 中使用 CFNetwork 有一个显著的好处,那就是 CFNetwork 与系统级别的设置(如:天线设置)以及 run-loop 结合得很好。每一个线程都有自己的 run-loop,因此我们可以 CFNetwork 当中事件源加入到 run-loop 中,这样就可以在线程的 run-loop 中处理网络事件了。BTW,大名鼎鼎的 ASIHttpRequest 库就是基于 CFNetwork 封装的。

CFNetwork 框架详细解析

 

四、socket通信之GCDAsyncSocket

iOS GCDAsyncSocket简单使用

 

五、Swift:Alamofire

版权声明:本文为素染年华原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liyonghua/p/16227473.html