网络

Network

2016-01-10  本文已影响315人  钱嘘嘘

Network concept


大部分网络基于TCP/IP通信协议。对TCP/IP网络模型基础有一定的了解。

术语


包:header,包应该发到哪里

payload,真实的数据

trailer,包含校验和信息,确保获得正确的包。(有些在header里,可以没有这部分)

主机重组这些包,提供给程序,无论是字节流或者一系列的消息(取决于协议)。程序发送数据响应,主机分包发送。一个包包含另一个包叫做封装。

Networking Layers


TCP/IP网络模型包含四个基础层:连接层,IP层,传输层,应用层。

The Link Layer(连接/物理层)

网络栈的这一层包含真实硬件用于与邻近的物理主机通信。这层在相同的物理网络上,从一个主机到另一个主机传输原始包。

一般遇到仅仅5种连接层:WIFI,蜂窝网络,Ethernet,蓝牙,FireWire。

网络接口是硬件的一小部分,提供连接层互联。一个主机可以有很多网络接口。

所有的网络一般连接一个或更多额外的接口。

The IP Layer

提供从一个主机到另一个的包传输,包能够穿梭在多样的物理网络。

增加了路由的概念,可以发送远距离目的地。包发送到邻近的路由,路由到路由,一直到目的地。一次路由转换叫做“跳”。

MTU

分割问题多,重复分割带来繁重的开销,一个包丢失全部失效。现代技术通过path MTU discovery决定从一个主机到另一个的最大包,从而不用分割。

Transport Layer

写网络代码,要与这层或更高层打交道。

TCP/UDP—基础数据传输。增加了端口号的概念。

UDP不保证数据永远到达目的地。低延迟。不确认之前发送的包,会造成验证网络堵塞。在一段时间与终端失去通信,确保能停止发包。如果传输高带宽数据,确保设计协议以便终端确定他们失败接收的包数。当堵塞发生,确保两点自动缩小他们的传输率。最好实现path MTU discovery。

TCP:

传输保证 -- 用TCP传输数据保证按顺序被获得。数据传输失败,在timeout后断开。

拥塞控制 -- 如果由于过度利用连接造成数据丢失,发送主机会降低传输速度。

流控制    --   忙碌,告诉发送方等待。

基于流的数据控制 -- 软件看一系列的字节而不是一系列具体记录。想要发送具体数据,必须编码记录。

path MTU discovery -- TCP选择最大包大小,避免分割

UDP:

在IPv4广播消息—包发送到广播地址被在广播域中的所有主机接收。

多播消息—包发送到多播地址,被任何订阅它的主机接收。实践中一般限制在LAN

保存记录边界—接收者视所有独立的消息。而不是连续的流字节。

ICMP

用于报告连接失败。

The Application Layer

HTTP/TCP

这层程序直接控制

Understanding Latency


Addressing Schemes and Domain Names


Link-Layer Addressing  --  MAC

IP-Layer Addressing

IPv4 or IPv6

127.0.0.1

Domain Name System (DNS)


Domain names:

当IP地址改变,最小化服务中断。

通过超过一个地址访问主机

允许多物理主机伪装成一个

在潜在技术能够适应改变

Packet Routing and Delivery


Link-layer addressing

逻辑地址到物理地址的转换。

执行这种会话的机制取决于什么种类的网络:

1. On Ethernet-like networks,OS能从IPv4地址包含硬件地址,通过运用address resolution protocol (ARP)。一个ARP请求包含一个广播消息,在网络中询问有特定IP地址的主机。之后主机用自己的link-layer地址作为响应。

IPv6通信,主机用相似协议:neighbor discovery protocol (NDP),这种协议基于ICMP。

2. Non-Ethernet-like networks,用多种网络协议,但是一般行为相似。网络驱动提供从IP地址到一些特定硬件值的映射,这些值用于唯一标识包的目的地。

3. Point-to-point networks,不需要执行映射,因为在连接结束,每个包都被发送到主机。

4. On cellular networks,手机通过信号塔初始化通信,塔分配手机特定的频率,时间槽。有点像点对点。

ARP协议搞不定两主机长距离通信。限制在本地区域物理网络。Internet用路由来进行长距离通信。路由器知道如何发送数据从一个范围的IP到另一个范围。

边缘路由器—个人用户的小型路由,只知道IP范围。

Core routers —提供主干网的路由,多物理连接,保存大量路由表(给定IP范围指明跳的方向)。用border gateway protocol (BGP),the routing information protocol (RIP)。

IPv4 Routing

网络地址+主机地址

主机必须知道三:自己IP地址,目标主机IP,是否目标主机与自身其中一个地址在同一网络,在就直接发送,不在路由。

广播地址

网络地址

路由地址

IPv6 Routing

Firewalls and Network Address Translation


Dynamic Address Assignment


Dynamic Host Configuration Protocol (DHCP) and DHCPv6

客户端广播一个请求给IPv4地址,服务器分配一个,客户端维持一个租约,使得IP地址持续特定的一段时间。客户端更新租约直到过期,服务器没有义务支持续约,但大部分服务器可以。

Neighbor Discovery and IPv6 Address Assignment

Link-Local Addressing and Bonjour

bonjour一种0配置的网络实现,包含三个部分:

(1)在IPv4的link-local地址,一种自我分配IP地址的方式,在没有DHCP服务或者其他IP地址分配方法的时候。(IPv6内置)

(2)组播DNS,当一个基础架构服务不被展示或者当本地不托管命名更加方便,提供DNS解决方案

(3)DNS服务发现,一种注册和发现服务。



Network OverView


1. 只传输需要完成任务足够的数据

2. 无论什么时候尽可能避免超时

3. 设计用户接口,允许用户轻易的取消那些太久完成的任务

3. 优雅的处理失败

4. 当网络表现不好时,优雅的降级

5. 选择任务合适的APIs

6. 小心设计软件,以最小化安全风险

Designing for Real-World Networks


一些网络设计原则

1. Using Power And Bandwidth Efficiently

<1> Batch Your Transfers, and Idle Whenever Possible

<2> Download the Smallest Resource Possible, and Cache Resources Locally

NSURLCache

2. Handling Network Problems Gracefully

<1> Design for Variable Network Interface Availability

Reachability

SCNetworkReachability Reference

<2> Design for Variable Network Speed

<3> Design for High Latency

<4> Test Under Various Conditions

Network Link Conditioner

Assessing Your Networking Needs

OS X & iOS提供三种主要用户空间的网络API,Foundation & CFNetwork & POSIX

Common Networking Tasks


(1)Connect to a web server.

Making HTTP and HTTPS Requests

Displaying Web and Multimedia Content

(2)Use sockets or socket streams.

Using Sockets and Socket Streams

(3)Communicate securely

Transport Layer Security (TLS) protocol,Secure Sockets Layer (SSL)


Next Steps

Keep in mind

Discovering and Advertising Network Services


四个APIs做这些:

NSNetService,高层OC API适用大多数开发者

CFNetService,高层C API适用在CF代码

DNS Service Discovery,底层C API适用跨平台代码,比高层提供更多的灵活

GAME

more, Multipeer Connectivity Framework与你app的实例通信,关联邻近设备。

Bonjour Service Overview


包含三个部分:

服务名:唯一

服务类型:对程序所有实例相同,应该被注册IANA

域:

(1)Publishing a Network Service

三种方式:

OC & CF代码,推荐CFNetServices API

便携C代码,除了OSX iOS,推荐DNS Service Discovery C API

发布步骤:

<1> 创建一个socket来监听对服务的连接,基于TCP的服务Networking Programming Topics

<2> 创建服务对象,提供socket的端口,domain,服务类型

F,NSNetService +initWithDomain:type:name:port:

CF,CFNetServiceRef + CFNetServiceCreate

DSD,调用DNSServiceRegister返回DNSServiceRef对象

<3> 分配代理和回调

F,NSNetService代理

CF,分配一个客户端回调给CFNetServiceRef

DSD,

<4> 如果有必要,安排,重新安排服务

F,在当前run loop,默认mode,服务自动被安排。如果需要在另一个runloop,不同mode,需要解除,重新安排

CF,必须安排CFNetServicesRef在一个run loop。

DSD,调用DNSServiceSetDispatchQueue安排服务在一个dispatch queue上。

<5> 发布

F,调用publish

CF,调用CFNetServiceRegisterWithOptions

DSD,已经发布。

当服务发布之后,当连接建立,你能在scoket上监听连接,设置输入输出流。

(2)Browsing for and Connecting to a Network Service

发现和解决网络服务的过程和发布过程一样简单。为了浏览网络服务,OC,创建NSNetServiceBrowser,分配一个delegate。然后,调用searchForServicesOfType:inDomain:方法,一旦任何服务被发现,代理方法netServiceBrowser:didFindService:moreComing:被调用。

为了连接服务,首先停止浏览用stop,然后调用getInputStream:outputStream:,

CFNetServiceRef + CFStreamCreatePairWithSocketToNetService连接bonjour服务

NSNetService and Automatic Reference Counting (ARC)

(3)Resolving a Network Service

为了解决,首先stop浏览,然后调用resolveWithTimeout: + NSNetService。

当服务地址已经解决,服务的代理方法netServiceDidResolveAddress:被调用。你能之后访问服务器主机名,或者地址信息。


Multipeer Connectivity Overview

与邻近设备的app通信。

To Learn More

Multipeer Connectivity -- Multipeer Connectivity Framework Reference and the MultipeerGroupChat sample code project.

NSNetService -- NSNetServices and CFNetServices Programming Guide,NSNetServiceBrowser Class Reference,NSNetServiceBrowserDelegate Protocol Reference, NSNetServiceDelegate Protocol Reference.

CFNetService -- ReadNSNetServices and CFNetServices Programming GuideCFNetServices Reference.

DNS Service Discovery -- ReadDNS Service Discovery Programming GuideDNS Service Discovery C Reference.

Displaying Web and Multimedia Content


Opening Web Content or Streaming Media in the Default Application


为了在用户默认的浏览器或播放器中打开网页和流URL。

iOS,用UIApplication的openURL:方法。

Launching the App Store from an iOS application

Displaying Web Content in Your Application


用WebKit引擎能很容易的加载和展示网页,通过与Safari相同的渲染引擎

iOS,UIWebView的loadRequest:方法,初始化initWithFrame:

UIWebView Class Reference

Displaying Streaming Multimedia Content in Your Application

流媒体

iOS,Media Player Framework基础播放,AV Foundation framework更多复杂的功能。

Multimedia Programming Guide &&AVFoundation Programming Guide.

Making HTTP and HTTPS Requests


当选择API,应该首先考虑为什么要做HTTP请求:

如果写一个杂志的app,应该用NKAssetDownload API在后台下载文本

一般用NSURLSession & NSURLConnection APIs

Making Requests Using Foundation — NSURLSession & NSURLConnection


(1)Retrieving the Contents of a URL without Delegates

只需要通过URL获取文本,用结果做一些事情。—各种熟悉的方法

(2)Retrieving the Contents of a URL with Delegates — delegate

大多数情况,NSURLSession和NSURLConnection功能相似,但是有几点很重要的不同:

<1> NSURLSession API提供下载任务的行为很像NSURLDownload类,进一步描述在Downloading the Contents of a URL to Disk.

<2> 当你创建一个NSURLSession对象,提供了一个重用配置对象,它封装了许多一般的配置选项。而NSURLConnection,你必须在每个连接独立的设置这些选项

<3> NSURLConnection对象处理简单的请求和在线追踪的请求

NSURLSession对象管理多任务,所有这些代表单个URL请求和在线追踪请求。当你app发起时,你一般创建一个session,之后你创建任务,用创建NSURLConnection差不多同样的方式

<4> 对于NSURLConnection,每个连接对象有分离的delegate。对于NSURLSession,delegate在一个session中所有任务共享。如果你需要用不同的delegate,必须新建session

当你初始化NSURLSession or NSURLConnection对象,连接或会话在当前run loop的默认mode被自动安排。

你提供的delegate在连接的整个过程中获得通知,包括间隙调用URLSession:dataTask:didReceiveData:or a target="_self" connection:didReceiveData:方法,当连接从服务器获得额外的数据。代理的责任就是追踪已经获得的数据。

(1)如果数据能一次处理一段,那就这么做

(2)如果太小,追加到NSMutableData

(3)如果太大,就写入文件,在传输完成再处理

URLSession:task:didCompleteWithError:or connectionDidFinishLoading:被调用,delegate获得全部URL的数据。

(3)Downloading the Contents of a URL to Disk

你需要下载URL并存储结果作为一个文件,但不想处理。NSURLSession用一步让你直接下载URL到磁盘文件。NSURLSession也允许你停止和继续下载,重新开始失败下载,当app挂起,崩溃时候继续下载。。。老版本iOS,必须用NSURLCon对象下载数据到内存,然后自己写数据到文件。

为了用NSURLSe来下载,代码必须:

1.用自定义delegate创建session,你选择的配置对象:

(1)如果你想当app没运行继续下载,当创建session时,必须提供后台session配置对象(唯一标识符)

(2)如不关心后台下载,可以用任何提供的session配置对象类型创建session

2.在session中创建和继续一个或者更多下载任务

3.等待直到delegate获得来自任务或者会话的调用。必须实现:

URLSession:downloadTask:didFinishDownloadingToURL:+URLSession:task:didCompleteWithError:

(4)Making a POST Request

可以用相同的方式生成HTTP orHTTPS POST,主要的不同是,必须首先配置一个NSMutableURLRequest对象,提供给initWithRequest:delegate:。

需要构建body data,以下三种方式之一:

<1> 上传短的,在内存数据,你应该URL编码已存在的数据块。描述在Encoding URL Data

<2> 从磁盘上传文件数据,setHTTPBodyStream:告诉NSMutableURLRequest去读取NSInputStream和用结果数据作为body文本

<3> 大块结构数据,CFStreamCreateBoundPair创建一对流,之后setHTTPBodyStream:告诉NSMutableURLRequest用其中一个流作为它body文本的源。通过写入其他流,能一次发送一段数据。

(5)Configuring Authentication

对于NSURLSession,你的delegate要实现URLSession:task:didReceiveChallenge:completionHandler:。此方法中,你执行无论什么你需要的操作来决定如何响应。之后通过常量调用完成block

<1> Possible Responses to an Authentication Challenge

<2> Creating a Credential Object

NSURLCredential

(6)Further Information

URL Session Programming Guide

Setting Up Socket Streams && Stream Programming Guide

Making Requests Using Core Foundation closely


Core Foundation URL Access Utilities Reference

CFNetwork Programming Guide

完全控制

Working with Web Services


NSJSONSerialization

NSXMLParser— SAX

libxml2 — SAX-style (streaming) and DOM-style (tree-based)

Using Sockets and Socket Streams


socket通信,程序完全控制。

Choosing a Socket API


基于包的通信,CS唯一不同就是包文本

基于流的客户端,初始化构建通信渠道的方式非常不同

POSIX networking is discouraged

监听端口,非TCP连接,CFSocket

OC,F OC API

C,CF OC API

Using Networking Securely


Enabling TLS or SSL

Transport Layer Security (TLS) protocol提供基于socket通信的数据加密,与服务器认证一起防止客户端被骗。

Secure Sockets Layer (SSL) protocol

(1)Connecting Securely to a URL —https

(2)Connecting Securely Using Streams —NSStream

(3)Connecting Securely Using BSD Sockets

Secure Transport Reference

OpenSSL

Common Mistakes


Designing Secure Helpers and Daemons

Secure Coding Guide

(1)Be Careful What Data You Trust

Validating Input and Interprocess Communication

Secure Coding Guide

(2)Know That Many Tiny Leaks Can Add Up to a Flood

social engineering

(3)Install Certificates Correctly


Platform-Specific Networking Technologies

iOS Requires You to Handle Backgrounding and Specify Cellular Usage Policies

捕获网络支持

后台

WIFI only连接

(1)Restrict Cellular Networking Correctly

SCNetworkReachability—>kSCNetworkReachabilityFlagsIsWWAN

iOS 5之前的特例~~~

F,NSMutableURLRequest —> setAllowsCellularAccess:来指定是否请求能发送通过蜂窝网络。allowsCellularAccess

CF,kCFStreamPropertyNoCellular,CFSocketStream && CFHTTPStream

在老版本,继续用kSCNetworkReachabilityFlagsIsWWAN最好了,决定是否流量被发送通过蜂窝连接,但是要知道它的限制。

(2)Handle Backgrounding Correctly

Networking and Multitasking

(3)Register VoIP Sockets Correctly

App Programming Guide for iOS

(4)Register for Captive Network Support

CaptiveNetwork Reference

Avoiding Common Networking Mistakes

Clean Up Your Connections

Avoid POSIX Sockets and CFSocket on iOS Where Possible

最合适的时机,直接用socket,当你开发跨平台工具或者高性能服务器软件。

Avoid Synchronous Networking Calls on the Main Thread

如果你在主线程执行网络操作,必须只用异步调用。

Cocoa (Foundation) and CFNetwork (Core Foundation) Code

Threading Programming Guide

POSIX Code

Supporting IPv6 DNS64/NAT64 Networks





iOS Network

1. Get Up and Running

2. Become Proficient

3. Download Resources Using URLs

4. Interact with Web and File Servers Using HTTP and FTP Streams

5. Communicate Using Sockets

6 Register and Discover Network Services



3. Download Resources Using URLs

CFURL Reference

NSURL Class Objective-C Reference

4. Interact with Web and File Servers Using HTTP and FTP Streams

如果应用与web服务器或者FTP服务器交互超出了CFURL或者NSURL APIs的能力,应该考虑用CFHTTPStream and CFFTPStream APIs。他们支持复杂的HTTP和FTP请求,如HTTP GET和POST请求,HTTP cookie和请求头管理,FTP目录读取,FTP文件上传。

CFNetwork Programming Guide

CFHTTPStream Reference

CFFTPStream Reference  

5. Communicate Using Sockets

运用sockets,iOS提供run-loop socket集成在CF中的APIs。

CFNetwork Framework Reference

UNIX Socket FAQ

6. Register and Discover Network Services

NSNetServices and CFNetServices Programming Guide

CFNetServices Reference and NSNetService Class Reference

上一篇下一篇

猜你喜欢

热点阅读