iOS网络——socket
发布日期:2022-03-18 08:27:43 浏览次数:36 分类:技术文章

本文共 1621 字,大约阅读时间需要 5 分钟。

iOS网络——socket

简介

iOS的网络层级如下:

这里写图片描述

每个复杂的计算机系统都是构建在一个或者多个抽象层之上,底层网络也不例外。网络根本是Berkley或者BSD Sockets。它执行大多数基础的网络任务:发送与接收一系列的二进制位。由于需要使用相当数量的代码才能恰好地发送一个字节,而且相同的逻辑对于每个Socket都要重复执行,因此人们构建了库来封装该逻辑,这样就能被其它人重用了。在iOS,这个库叫做CFNetwork,它是对Socket的轻量级封装,不过它对于大多数常见常见就变得非常笨重了。最后,添加了另一层(NSStream)来封装CFNetwork,并且作为最基础的Objective-C网络API。

Socket指的是两个端点之间的单项连接,因此它们通常情况下都是成对出现的:一个用于读,一个用于写。

Socket这个词有很多的概念:

  • 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。

  • 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连接的一对一关系。

  • TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socket API。

在《iOS网络编程与云端应用》中是这样说明的:

Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换。这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程接口,一个Socket由一个IP地址和一个端口号唯一确定。

Socket的通信过程如下:

这里写图片描述

基于TCP协议的网络程序

请参考

基于TCP协议的客户端/服务器程序的一般流程:
这里写图片描述

建立连接的过程

这里写图片描述

服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。

数据传输的过程:

建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。因此,服务器从accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服务器的应答,服务器调用write()将处理结果发回给客户端,再次调用read()阻塞等待下一条请求,客户端收到后从read()返回,发送下一条请求,如此循环下去。

关闭连接的过程:

这里写图片描述

如果客户端没有更多的请求了,就调用close()关闭连接,就像写端关闭的管道一样,服务器的read()返回0,这样服务器就知道客户端关闭了连接,也调用close()关闭连接。注意,任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则连接处于半关闭状态,仍可接收对方发来的数据。

在学习socket API时要注意应用程序和TCP协议层是如何交互的: 应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN段 应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的socket函数返回就表明TCP协议收到了某些段,再比如read()返回0就表明收到了FIN段

转载地址:https://windzen.blog.csdn.net/article/details/53610167 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:iOS网络——身份认证
下一篇:ReactiveCocoa

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月23日 16时28分17秒