众所周知,网络应用在互联网时代的重要性,个人作为一个现代人在日常生活中基本上离不开网络。
iOS网络开发这一块,无疑是很重要的一块。个人认为是比较难啃的,来来回回学了好几回,还是晕晕没学明白,下面希望通过写这份学习笔记能加深对网络开发的理解。
初次写博客,只是为了记述一些学习开发想法,请各位多多指教。
一、URL中常见的协议
那么什么是URL呢?
URL全称是Uniform Resource Locator(同意资源定位符),URL是唯一的,通过一个URL,能找到互联网唯一的一个资源。
URL的基本格式=协议://主机地址/路径
协议:不同的协议代表不同的资源查找方式、资源传输方式,
下面有几种常用的协议
- 网络开发中最常用的协议:HTTP:超文本传输协议,访问的是远程的网络资源,格式是http://
- 访问本地计算机上的资源:file协议 格式:file://
- 访问电子邮件地址:mailto 格式:mailto://
- 访问共享主机的文件资源 :FTP 格式:ftp://
路径:资源在主机中的具体位置
二、HTTP协议
各博客论坛都有很多关于HTTP的文章,我这就班门弄斧了,可以转到大神的博客去学习。
下面给出百度百科链接,或自行查阅书籍资源
我自己的理解:
http连接是建立在TCP连接上的一种应用,HTTP连接使用“请求--响应”的方式,不仅在请求时需要先建立连接,而且需要客户端在服务器发出请求后,服务器才能回复数据给客户端,请求结束后,自动释放连接,这种方式可以节省传输时间,相对于socket也属于“短连接”。
那么来拓展一下:什么是TCP,说到TCP肯定会有UDP的存在,这也是面试很可能会问到的。
- TCP:传输控制协议,提供的是面向连接,可靠的字节流服务,它属于运输层协议。(具体的OSI七层和TCP/IP五层,请转向百科或大神博客)
- 前提:当客户端访问服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据
- 功能:提供超时重发,检验数据、流量控制、反馈机制,保证数据能从一端传到另一端,理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接前,TCP连接都将被一直保持下去,断开连接时,服务器和客户端均可以主动发起断开TCP连接的请求
- 用途:TCP发送的包有序号,双方收到包后要给一个反馈,如果超过一定时间还没收到反馈就自动执行超时重发,因此TCP最大的优点是可靠。网页http,邮件smtp,远程连接,文件ftp传送
- 三次握手:建立连接-->发送请求-->应答请求-->请求结束通知。打电话的例子:
[喂喂喂,能听到我吗?]
[没问题。能听到我说一声。]
[没问题。]
- 相当于TCP:
不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,因此传输速度很快
- 用途:UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如语音广播、视频、QQ、tftp简单文件传送、snmp简单网络管理协议、rtp实时传送协议、rip路由信息协议(如报告股票信息,航空信息)、dns域名解释。注重速度流畅
3.Socket连接与HTTP连接的区别:
Socket:由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。
在实际应用开发中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态.
HTTP:HTTP协议是建立在TCP协议之上的一种应用,HTTP连接使用的是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器才能回复数据。
在请求结束后,会主动释放连接。
从建立连接到关闭连接的过程称为“一次连接”。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。
通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开
使用场景:很多情况下,需要服务器主动向客户端推送数据,保持客户端与服务器数据的实时与同步。
此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;
若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回客户端,因此,客户端定时向服务器发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端
Socket原理
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
它是网络通信中端点的抽象表示,包含进行网络通信必须的五种信息:1连接使用的协议,2本地主机的IP地址,3本地进程的协议端口,4远程主机的IP地址,5远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
建立Socket连接:建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认
服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求
客户端请求:客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求
连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
Socket连接与TCP连接:创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接