ios用什么框架做socket开发
1个回答
2016-07-24 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
一般使用的网络数据传输中一般涉及到7层,分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。对于程序开发人员而言能够用到的就是传输层,会话层,表示层和应用层。
http协议 对应于应用层
tcp协议 对应于传输层
ip协议 对应于网络层
上边是我们每次网络请求中,各个协议在每个层中的应用,下边的层都为上一层提供了传输基础。上边三层共同构成了一次网络请求(当然还有更底下的我们不做研究的层),而Socket则是对TCP/UDP,IP协议(即传输和网络层)的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/UDP,IP协议。
那么这时候我们就一定要了解HTTP请求和Socket之间到底是怎么样的一个关系呢,又该怎么理解呢?其实Http请求就是基于TCP/IP协议的一层的Socket再封装,只是Socket在数据的传输过程中数据是无法识别的内容如果想要使传输的数据有意义,则必须使用应用层协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。而Http协议就是现在使用最广泛的应用层协议,这样我们的才保证了我们可以在网络请求中可以自定义收到的JSON/XML格式的数据。而Http请求实际上每次本质上就是先建立一次Socket长链接 然后接受数据包(因为TCP协议的数据传输是数据流可能是多个包的 Http通过请求头会对包进行处理和组合)亩穗,当数据包全部接收完成之后键丛,通过协议转换成我们想要的格式返回给我们,然后关闭长链接,这样的一个流程完成一次Http请求。这个时候我们就会发现一个问题,只有我们主动的给服务器端发送请求的时候服务端才会给我们响应返回数据。而且每次网络请求又会重新开启TCP协议中的三次握手的过程,每次使用肯定是耗时的(当然现在基于Http2.0的多次网络请求可以减少握手次数)。但是也只是在每次Http之后还是会关闭Socket而且服务器端都不能在我们没有请求的情况下主动给我们发送消息,这个时候我们就可以使用Socket解决这个问题了。
如果我们建立了一个Socket长链接,不断开服务器端就能和我保持通讯了,这也就是我们现在用的及时通讯软件和视频是直播软件实现的原理(当然视频直播还涉及到很多其他的迅亮卜知识,一直觉得那才是iOS开发中最大的难点),现在我们知道了为什么我们有了Http还要了解Socket,那么接下来就开始介绍Socket底层的一些实现原理,我一直觉得iOS开发如果只是知道一些三方框架如何使用,在框架使用的过程中遇到了实际的问题,我们实际上是很难有实质上的思路去解决问题的,所以很多东西我想最好先从原理上去了解。
这时候我们就要做Socket变成就需要引入几个知识点。
1.地址
1.地址在程序中,我们如何保存一个地址呢?在中的sockaddr便是描述socket地址的结构体类型.
/** [XSI] Structure used by kernel to store most addresses.*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
为了方便设置用语网络通信的socket地址,引入了sockaddr_in结构体(对于UNIX Domain Socket则对应sockaddr_un)
/*
* Socket address, internet style.
*/
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;//得是网络字节序
struct in_addr sin_addr;//in_addr存在的原因则是历史原因,其实质是代表一个IP地址的32位整数
char sin_zero[8];//bzero之,纯粹是为了兼容sockaddr
};
在实际编程的时候,经常需要将sockaddr_in强制转换成sockaddr类型。
2.端口
在本地的进程中,每一个进程都可以通过PID来标识,对于网络上的一个计算机中的进程如何标识呢?网络中的计算机可以通过一个IP地址进行标识,一个计算机中的某个进程则可以通过一个无符号整数(端口号)来标识,所以一个网络中的进程可以通过IP地址+端口号的方式进行标识。
3网络字节序
谈网络字节序(Endianness)之前我们先说说什么是字节序。字节序又叫端序,就是指计算机中存放 多字节数据的字节的顺序。典型的就是数据存放在内存中或者网络传输时的字节的顺序。常用的字节序有大端序(big-endian),小端序(litle-endian,另还有不常见的混合序middle-endian)。不同的CPU可能会使用不同的字节序,如X86,PDP-11等处理器为小端序,Motorola 6800,PowerPC 970等使用的是大端序。小端序是指低字节位存放在内存地址的低端,高端序是指高位字节存放在内存的低端。 举个例子来说明什么是大端序和小端序: 比如一个4字节的整数 16进制形式为 0x12345678,最左边是高位。
大端序
低位 > > > > 高位
12 34 56 78
小端序
低位 > > > > 高位
78 56 34 12
TCP/IP 各层协议将字节序使用的是大端序,我们把TCP/IP协议中使用的字节序称之为网络字节序。 编程的时候可以使用定义在sys/_endian.h中的相关的接口进行本地字节序和网络字节序的互转。
#define ntohs(x) __DARWIN_OSSwapInt16(x) // 16位整数 网络字节序转主机字节序
#define htons(x) __DARWIN_OSSwapInt16(x) // 16位整数 主机字节序转网络字节序
#define ntohl(x) __DARWIN_OSSwapInt32(x) //32位整数 网络字节序转主机字节序
#define htonl(x) __DARWIN_OSSwapInt32(x) //32位整数 主机字节序转网络字节序
以上声明中 n代表netwrok, h代表host ,s代表short,l代表long
如果数据是单字节的话,则其没有字节序的说法了。
4.半相关和全相关
半相关(half-association)是指一个三元组 (协议,本地IP地址,本地端口),通过这个三元组就可以唯一标识一个网络中的进程,一般用于listening socket。但是实际进行通信的过程,至少需要两个进程,且它们所使用的协议必须一致,所以一个完成的网络通信至少需要一个五元组表示(协议,本地地址,本地端口,远端地址,远端端口),这样的五元组叫做全相关。
5.网络编程模型
网络存在的本质其实就是网络中个体之间的在某个领域的信息存在不对等性,所以一般情况下总有一些个体为另一些个体提供服务。提供服务器的我们把它叫做服务器,接受服务的叫做客户端。所以在网络编程中,也存在服务器端和客户端之分。
http协议 对应于应用层
tcp协议 对应于传输层
ip协议 对应于网络层
上边是我们每次网络请求中,各个协议在每个层中的应用,下边的层都为上一层提供了传输基础。上边三层共同构成了一次网络请求(当然还有更底下的我们不做研究的层),而Socket则是对TCP/UDP,IP协议(即传输和网络层)的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/UDP,IP协议。
那么这时候我们就一定要了解HTTP请求和Socket之间到底是怎么样的一个关系呢,又该怎么理解呢?其实Http请求就是基于TCP/IP协议的一层的Socket再封装,只是Socket在数据的传输过程中数据是无法识别的内容如果想要使传输的数据有意义,则必须使用应用层协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。而Http协议就是现在使用最广泛的应用层协议,这样我们的才保证了我们可以在网络请求中可以自定义收到的JSON/XML格式的数据。而Http请求实际上每次本质上就是先建立一次Socket长链接 然后接受数据包(因为TCP协议的数据传输是数据流可能是多个包的 Http通过请求头会对包进行处理和组合)亩穗,当数据包全部接收完成之后键丛,通过协议转换成我们想要的格式返回给我们,然后关闭长链接,这样的一个流程完成一次Http请求。这个时候我们就会发现一个问题,只有我们主动的给服务器端发送请求的时候服务端才会给我们响应返回数据。而且每次网络请求又会重新开启TCP协议中的三次握手的过程,每次使用肯定是耗时的(当然现在基于Http2.0的多次网络请求可以减少握手次数)。但是也只是在每次Http之后还是会关闭Socket而且服务器端都不能在我们没有请求的情况下主动给我们发送消息,这个时候我们就可以使用Socket解决这个问题了。
如果我们建立了一个Socket长链接,不断开服务器端就能和我保持通讯了,这也就是我们现在用的及时通讯软件和视频是直播软件实现的原理(当然视频直播还涉及到很多其他的迅亮卜知识,一直觉得那才是iOS开发中最大的难点),现在我们知道了为什么我们有了Http还要了解Socket,那么接下来就开始介绍Socket底层的一些实现原理,我一直觉得iOS开发如果只是知道一些三方框架如何使用,在框架使用的过程中遇到了实际的问题,我们实际上是很难有实质上的思路去解决问题的,所以很多东西我想最好先从原理上去了解。
这时候我们就要做Socket变成就需要引入几个知识点。
1.地址
1.地址在程序中,我们如何保存一个地址呢?在中的sockaddr便是描述socket地址的结构体类型.
/** [XSI] Structure used by kernel to store most addresses.*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
为了方便设置用语网络通信的socket地址,引入了sockaddr_in结构体(对于UNIX Domain Socket则对应sockaddr_un)
/*
* Socket address, internet style.
*/
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;//得是网络字节序
struct in_addr sin_addr;//in_addr存在的原因则是历史原因,其实质是代表一个IP地址的32位整数
char sin_zero[8];//bzero之,纯粹是为了兼容sockaddr
};
在实际编程的时候,经常需要将sockaddr_in强制转换成sockaddr类型。
2.端口
在本地的进程中,每一个进程都可以通过PID来标识,对于网络上的一个计算机中的进程如何标识呢?网络中的计算机可以通过一个IP地址进行标识,一个计算机中的某个进程则可以通过一个无符号整数(端口号)来标识,所以一个网络中的进程可以通过IP地址+端口号的方式进行标识。
3网络字节序
谈网络字节序(Endianness)之前我们先说说什么是字节序。字节序又叫端序,就是指计算机中存放 多字节数据的字节的顺序。典型的就是数据存放在内存中或者网络传输时的字节的顺序。常用的字节序有大端序(big-endian),小端序(litle-endian,另还有不常见的混合序middle-endian)。不同的CPU可能会使用不同的字节序,如X86,PDP-11等处理器为小端序,Motorola 6800,PowerPC 970等使用的是大端序。小端序是指低字节位存放在内存地址的低端,高端序是指高位字节存放在内存的低端。 举个例子来说明什么是大端序和小端序: 比如一个4字节的整数 16进制形式为 0x12345678,最左边是高位。
大端序
低位 > > > > 高位
12 34 56 78
小端序
低位 > > > > 高位
78 56 34 12
TCP/IP 各层协议将字节序使用的是大端序,我们把TCP/IP协议中使用的字节序称之为网络字节序。 编程的时候可以使用定义在sys/_endian.h中的相关的接口进行本地字节序和网络字节序的互转。
#define ntohs(x) __DARWIN_OSSwapInt16(x) // 16位整数 网络字节序转主机字节序
#define htons(x) __DARWIN_OSSwapInt16(x) // 16位整数 主机字节序转网络字节序
#define ntohl(x) __DARWIN_OSSwapInt32(x) //32位整数 网络字节序转主机字节序
#define htonl(x) __DARWIN_OSSwapInt32(x) //32位整数 主机字节序转网络字节序
以上声明中 n代表netwrok, h代表host ,s代表short,l代表long
如果数据是单字节的话,则其没有字节序的说法了。
4.半相关和全相关
半相关(half-association)是指一个三元组 (协议,本地IP地址,本地端口),通过这个三元组就可以唯一标识一个网络中的进程,一般用于listening socket。但是实际进行通信的过程,至少需要两个进程,且它们所使用的协议必须一致,所以一个完成的网络通信至少需要一个五元组表示(协议,本地地址,本地端口,远端地址,远端端口),这样的五元组叫做全相关。
5.网络编程模型
网络存在的本质其实就是网络中个体之间的在某个领域的信息存在不对等性,所以一般情况下总有一些个体为另一些个体提供服务。提供服务器的我们把它叫做服务器,接受服务的叫做客户端。所以在网络编程中,也存在服务器端和客户端之分。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询