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 Guide,CFNetServices Reference.
DNS Service Discovery -- ReadDNS Service Discovery Programming Guide,DNS 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
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
OpenSSL
Common Mistakes
Designing Secure Helpers and Daemons
Secure Coding Guide
(1)Be Careful What Data You Trust
Validating Input and Interprocess Communication
(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
(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
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文件上傳。
5. Communicate Using Sockets
運用sockets,iOS提供run-loop socket集成在CF中的APIs。
6. Register and Discover Network Services