iOS之网络篇

Posted GitHubPorter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS之网络篇相关的知识,希望对你有一定的参考价值。

前言

简单介绍:

// OSI(开放式系统互联), 由ISO(国际化标准组织)制定

// 1. 应用层

// 2. 表示层

// 3. 会话层

// 4. 传输层

// 5. 网络层

// 6. 数据链接层

// 7. 物理层

// TCP/IP, 由美国国防部制定

// 1. 应用层, HTTP, FTP, SMTP, DNS

// 2. 传输层, TCP, UDP

// 3. 网络层, IP

// 4. 链路层, ARP, RARP

// HTTP(短连接)

// 1. 建立链接, 三次握手

// 2. 断开链接, 四次挥手

// 数据报文->数据包->数据帧->比特流(二进制)-->比特流->数据帧->数据包->数据报文

// socket, "插口", "套接字", 长连接, 存在于应用层和传输层之间, 提供一种封装, 方便进行通信

UDP、TCP、socket区别

1. UDP

UDP是一种不可靠的网络协议。(qq用的是这个协议)

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

UDP是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。

UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理

UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。

与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。

UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。(详见:http://baike.baidu.com/view/30509.htm

2.TCP

TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算和校验。 (详见:http://baike.baidu.com/view/32754.htm

3.socket

socket的英文原义是“孔”或“插座”

客户软件将插头插到不同编号的插座,就可以得到不同的服务。

常用的Socket类型

有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。(详见:http://baike.baidu.com/view/13870.htm

http协议

说明:apache tomcat服务器必须占用8080端口

一、URL

1.基本介绍

URL的全称是Uniform Resource Locator(统一资源定位符)

通过1个URL,能找到互联网上唯一的1个资源

URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL

技术分享

2.URL中常见的协议

(1)HTTP

超文本传输协议,访问的是远程的网络资源,格式是http://

http协议是在网络开发中最常用的协议

(2)file

访问的是本地计算机上的资源,格式是file://(不用加主机地址)

(3)mailto

访问的是电子邮件地址,格式是mailto:

(4)FTP

访问的是共享主机的文件资源,格式是ftp://

二、HTTP协议

1.HTTP协议简介

不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议

访问百度主页:http://www.baidu.com

获得新浪的微博数据

获得大众点评的团购数据

2.HTTP协议的作用

HTTP的全称是Hypertext Transfer Protocol,超文本传输协议

(1)规定客户端和服务器之间的数据传输格式

(2)让客户端和服务器能有效地进行数据沟通

技术分享

3.为什么选择使用HTTP?

(1)简单快速  因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快

(2)灵活  HTTP允许传输任意类型的数据

(3)HTTP 0.9和1.0使用非持续连接  限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间

4.HTTP的通信过程

要想使用HTTP协议向服务器索取数据,得先了解HTTP通信的完整过程

完整的http通信可以分为2大步骤

(1)请求:客户端向服务器索要数据

(2)响应:服务器返回客户端相应的数据

技术分享

三、HTTP通信过程 - 请求和响应

1.HTTP通信过程 - 请求

HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容

请求行:包含了请求方法、请求资源路径、HTTP协议版本

GET /MJServer/resources/images/1.jpg HTTP/1.1

请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息

Host: 192.168.1.105:8080// 客户端想访问的服务器主机地址

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境

Accept: text/html, */*// 客户端所能接收的数据类型

Accept-Language: zh-cn// 客户端的语言环境

Accept-Encoding: gzip// 客户端支持的数据压缩格式

请求体:客户端发给服务器的具体数据,比如文件数据

2.HTTP通信过程 - 响应

客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端

HTTP协议规定:1个完整的HTTP响应中包含以下内容:

状态行:包含了HTTP协议版本、状态码、状态英文名称

HTTP/1.1 200 OK

响应头:包含了对服务器的描述、对返回数据的描述

Server: Apache-Coyote/1.1// 服务器的类型

Content-Type: image/jpeg// 返回数据的类型

Content-Length: 56811// 返回数据的长度

Date: Mon, 23 Jun 2014 12:54:52 GMT// 响应的时间

实体内容:服务器返回给客户端的具体数据,比如文件数据

技术分享

3.补充:推荐工具firebug-1.12.5-fx.xpi

虫子的作用:拦截所有的http请求。

4.常见的响应状态码

技术分享

四、发送HTTP请求的方法

1.简单说明

在HTTP/1.1协议中,定义了8种发送http请求的方法

GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH

根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式

PUT :增

DELETE :删

POST:改

GET:查

提示:最常用的是GET和POST(实际上GET和POST都能办到增删改查)

2.get和post请求

要想使用GET和POST请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的帐号、密码

GET和POST对比:GET和POST的主要区别表现在数据传递上

GET

在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如http://ww.test.com/login?username=123&pwd=234&type=JSON

注意:由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB

POST

发给服务器的参数全部放在请求体中

理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)

3.GET和POST的选择

选择GET和POST的建议

(1)如果要传递大量数据,比如文件上传,只能用POST请求

(2)GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST

(3)如果仅仅是索取数据(数据查询),建议使用GET

(4)如果是增加、修改、删除数据,建议使用POST

4.ios中发送HTTP请求的方案

在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有

(1)苹果原生(自带)

NSURLConnection:用法简单,最古老最经典最直接的一种方案

NSURLSession:iOS 7新出的技术,功能比NSURLConnection更加强大

CFNetwork:NSURL*的底层,纯C语言

(2)第三方框架

ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新

AFNetworking:简单易用,提供了基本够用的常用功能

建议:

为了提高开发效率,企业开发用的基本是第三方框架

5.ASI和AFN架构对比

技术分享

说明:AFN基于NSURL,ASI基于CFHTTP,ASI的性能更好一些。但是ASI已经没有人维护了,所以一般用AFN。

GET请求和POST请求简单说明

创建GET请求


//1.设置请求路径

NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];

NSURL *url=[NSURL URLWithString:urlStr];

2.创建请求对象

NSURLRequest *request=[NSURLRequest requestWithURL:url];

3.发送请求


服务器:

技术分享

创建POST请求


1.设置请求路径

NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"];//不需要传递参数2.创建请求对象

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL];//默认为get请求request.timeoutInterval=5.0;//设置请求超时为5秒

[email protected]"POST";//设置请求方法

//设置请求体

NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text];

//把拼接后的字符串转换为data,设置请求体

request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding];

//3.发送请求


服务器:

技术分享

二、比较

建议:提交用户的隐私数据一定要使用POST请求

相对POST请求而言,GET请求的所有参数都直接暴露在URL中,请求的URL一般会记录在服务器的访问日志中,而服务器的访问日志是黑客攻击的重点对象之一

用户的隐私数据如登录密码,银行账号等。

三、使用

1.通过请求头告诉服务器,客户端的类型(可以通过修改,欺骗服务器)


1.设置请求路径

NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"];//不需要传递参数2.创建请求对象

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL];//默认为get请求6request.timeoutInterval=5.0;//设置请求超时为5秒

[email protected]"POST";//设置请求方法

//设置请求体

NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text];

//把拼接后的字符串转换为data,设置请求体

request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding];

//客户端类型,只能写英文

[request setValue:@"ios+android" forHTTPHeaderField:@"User-Agent"];


服务器:

技术分享

2.加强对中文的处理

问题:URL不允许写中文

在GET请求中,相关代码段打断点以验证。

在字符串的拼接参数中,用户名使用“文顶顶”.

技术分享

转换成URL之后整个变成了空值。

技术分享

提示:URL里面不能包含中文。

解决:进行转码

1.设置请求路径

NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];

//转码

urlStr= [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url=[NSURL URLWithString:urlStr];

2.创建请求对象

NSURLRequest *request=[NSURLRequest requestWithURL:url];


调试查看:

技术分享

服务器:

技术分享

说明:使用NSURLSession发送GET和POST请求请参考最新博文:http://www.cnblogs.com/wendingding/p/5168772.html

socket原理

套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个

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

建立socket连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

SOCKET连接与TCP连接

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

3.4、Socket连接与HTTP连接

由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

https

关于安全等级更高的https协议这里我就不多说了,附上两个博客地址:

http://www.cocoachina.com/ios/20150702/12384.html

http://www.cnblogs.com/jys509/p/5001566.html

参考博客:

http://www.cnblogs.com/wendingding/p/3813706.html

http://www.cnblogs.com/wendingding/p/3813466.html

http://www.cocoachina.com/bbs/read.php?tid=116559

http://www.2cto.com/kf/201512/455635.html

http://www.mamicode.com/info-detail-877996.html

博主的微博、CocoaChina博客、简书同步更新,欢迎关注:

新浪微博:http://weibo.com/p/1005052308506177/home?from=page_100505_profile&wvr=6&mod=data&is_all=1#place

简书:http://www.jianshu.com/users/63baf9271d14/latest_articles

CocoaChina:http://blog.cocoachina.com/477998































以上是关于iOS之网络篇的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发网络篇—HTTP协议

iOS开发网络篇—HTTP协议

iOS开发网络篇—Socket编程

测试开发之网络篇-常用服务协议

iOS开发面试只需知道这些,技术基本通关!(网络篇)

Java开发工程师系列讲解之——『http协议篇』