开发必须懂的网络常识
1、网络常用概念
网络是应用的灵魂,是所有应用的数据来源.离开了网络,我们的应用就是一潭死水,网络是数据交互的媒介,我们通过网络得到服务器上的数据,也是通过网络给服务器传递数据. 也就是说,网络的实质就 是是交互数据,而数据交互的媒介就是在网络中传输二进制数据流(包括html/图片/视频数据)。
互联网开发的常用概念:
客户端(Client):移动设备(手机/iPad等手持设备),客户端一般就是前端/前台等等.iOS,android开发都是前端开发.
服务器(Server):为客户端提供服务(比如数据/资源等)的机器---本质也是一台计算机(+服务器软件),服务器开发就是后端/后台开发.java/php/.net等.
请求(Request):客户端向服务器索取数据.
响应(Response):服务器对客户端请求做出的反应,一般就是返回数据给客户端.
服务器:按开发阶段来分,分为两种:
远程服务器: 外网服务器.应用上线之后供全体用户使用的服务器.速度取决于用户的网速和服务器的性能.
本地服务器: 内网服务器,测试服务器.开发测试阶段使用的服务器.供内部开发测试人员使用.速度飞快.
2.什么是IP地址
静态IP地址:固定不变的IP地址,需要用户自己手动设置.
动态IP地址:打开计算机后,自动生成的IP地址,不用人为设置。动态的IP地址是通过DHCP协议实现自动获取的。
子网掩码:与IP地址配合使用判断两台计算机是否位于同一个子网络.
DNS服务器: 可以将域名(网址)转换成IP地址.
DHCP协议: 每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做“DHCP服务器”.当新的计算机加入网络,必须向“DHCP服务器”发
送一个“DHCP请求”数据包,申请IP地址和相关的网络参数.然后DHCP协议会赋予本机一些参数,如动态IP地址,子网掩码,网关,DNS服务器等.
3.HTTP请求
通俗地说,网络协议就是网络之间沟通、交流的桥梁,只有相同网络协议的计算机才能进行信息的沟通与交流。这就好比人与人之间交流所使用的各种语言一样,只有使用相同语言才能正常、顺利地进行交流。从专业角度定义,网络协议是计算机在网络中实现通信时必须遵守的约定,也就是通信协议。主要是对信息传输的速率、传输代码、代码结构、传输控制步骤、出错控制等作出规定并制定出标准。
3.1. URL(Uniform Resource Locator):
统一资源定位符.URL就是资源的地址,位置.通过一个URL能够找到互联网上唯一的一个资源.
URL的基本格式: 协议://主机地址/路径
协议:不同的协议代表不同的资源查找方式,资源传输方式.
URL中的常见协议:
<1>HTTP:超文本传输协议,在网络开发中最常用的协议.访问的是远程的网络资源.格式:http://...
TCP数据包嵌入IP数据包.IP数据包标头需要设置双方的IP地址.发送方(本机)是:192.168.2.6 ,接收方(百度)是:119.75.218.70
IP数据包的标头长度为20字节.加上嵌入的TCP数据包,现在总长度是5000字节
<3>file:访问的时本地计算机上的资源.格式:file://(不要再加主机地址了)
<4>FTP:访问的是共享主机的文件资源.格式:ftp://
<5> TCP协议:
TCP数据包标头需要设置端口,接收方(Baidu)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024~65535之间的整数.
TCP数据包的标头长度是20字节.加上嵌入的HTTP数据包,现在总长度是4980字节.
<6>以太网协议
IP数据包嵌入以太网数据包的数据部分.以太网数据包的标头需要设置双方的MAC地址.发送方为本机的网卡MAC地址,接收方为网关192.168.2.1的MAC地址(通过ARP协议得到), 以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节.因此,IP数据包必须分割成四个包,因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500 ,1500, 1500,560 字节.
<7>mailto:访问的是电子邮件地址.格式:mailto:
主机地址:存放资源的主机IP地址(域名).
路径:资源在主机中得具体位置.
3.2. HTTP请求的完整过程:
<1> 请求: 客户端发出请求.向服务器索要数据(操作数据).
<2> 响应: 服务器对客户端的请求做出响应.返回客户端所需要的数据.
3.3. 包装一个HTTP请求
用 NSURLRequest 来包装一个HTTP请求.可以指定缓存策略和超时时间,缓存策略的选择:NSURLRequestCachePolicy
NSURLRequestUseProtocolCachePolicy = 0, // 默认的缓存策略,使用协议定义. NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地缓存,直接从原始服务器地址下载. NSURLRequestReturnCacheDataElseLoad = 2, // 只有在缓存中不存在数据时,才从原始地址下载 NSURLRequestReturnCacheDataDontLoad = 3, // 只使用缓存数据,如果不存在缓存,则请求失败. 用于没有网络连接的离线模式 NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // 忽略远程和本地的数据缓存,直接从原始地址下载 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略缓存,直接从原始服务器地址下载. NSURLRequestReloadRevalidatingCacheData = 5, // 验证本地数据和远程数据是否相同,如果不同则下载远程数据,否则使用本地数据
网络缓存数据,保存在SQLite的数据库中(NSHomeDirectory()),
3.4. 发送请求
用 NSURLConnection 发送请求.
同步方法:
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
异步方法:
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler
4.Socket介绍
网络上的两个程序通过一个双向的通信连接实现数据的交换,根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
分步骤创建Socket
1.创建客户端Socket socket(<#int#>, <#int#>, <#int#>);
2.创建服务器Socket struct sockaddr_in serverAddress;
3.连接到服务器(Socket编程) connect(<#int#>, <#const struct sockaddr *#>, <#socklen_t#>);
4.发送数据给服务器 send(<#int#>, <#const void *#>, <#size_t#>, <#int#>)
5.接收服务器返回的数据 recv(<#int#>, <#void *#>, <#size_t#>, <#int#>)
6.关闭 Socket close(socketNumber)