Network concept


大部分網(wǎng)絡(luò)基于TCP/IP通信協(xié)議。對TCP/IP網(wǎng)絡(luò)模型基礎(chǔ)有一定的了解。
術(shù)語
包:header,包應(yīng)該發(fā)到哪里
payload,真實的數(shù)據(jù)
trailer,包含校驗和信息,確保獲得正確的包。(有些在header里,可以沒有這部分)
主機重組這些包,提供給程序,無論是字節(jié)流或者一系列的消息(取決于協(xié)議)。程序發(fā)送數(shù)據(jù)響應(yīng),主機分包發(fā)送。一個包包含另一個包叫做封裝。
Networking Layers
TCP/IP網(wǎng)絡(luò)模型包含四個基礎(chǔ)層:連接層,IP層,傳輸層,應(yīng)用層。
The Link Layer(連接/物理層)
網(wǎng)絡(luò)棧的這一層包含真實硬件用于與鄰近的物理主機通信。這層在相同的物理網(wǎng)絡(luò)上,從一個主機到另一個主機傳輸原始包。
一般遇到僅僅5種連接層:WIFI,蜂窩網(wǎng)絡(luò),Ethernet,藍牙,F(xiàn)ireWire。
網(wǎng)絡(luò)接口是硬件的一小部分,提供連接層互聯(lián)。一個主機可以有很多網(wǎng)絡(luò)接口。
所有的網(wǎng)絡(luò)一般連接一個或更多額外的接口。
The IP Layer
提供從一個主機到另一個的包傳輸,包能夠穿梭在多樣的物理網(wǎng)絡(luò)。
增加了路由的概念,可以發(fā)送遠距離目的地。包發(fā)送到鄰近的路由,路由到路由,一直到目的地。一次路由轉(zhuǎn)換叫做“跳”。
MTU
分割問題多,重復(fù)分割帶來繁重的開銷,一個包丟失全部失效?,F(xiàn)代技術(shù)通過path MTU discovery決定從一個主機到另一個的最大包,從而不用分割。
Transport Layer
寫網(wǎng)絡(luò)代碼,要與這層或更高層打交道。
TCP/UDP—基礎(chǔ)數(shù)據(jù)傳輸。增加了端口號的概念。
UDP不保證數(shù)據(jù)永遠到達目的地。低延遲。不確認之前發(fā)送的包,會造成驗證網(wǎng)絡(luò)堵塞。在一段時間與終端失去通信,確保能停止發(fā)包。如果傳輸高帶寬數(shù)據(jù),確保設(shè)計協(xié)議以便終端確定他們失敗接收的包數(shù)。當堵塞發(fā)生,確保兩點自動縮小他們的傳輸率。最好實現(xiàn)path MTU discovery。
TCP:
傳輸保證 -- 用TCP傳輸數(shù)據(jù)保證按順序被獲得。數(shù)據(jù)傳輸失敗,在timeout后斷開。
擁塞控制 -- 如果由于過度利用連接造成數(shù)據(jù)丟失,發(fā)送主機會降低傳輸速度。
流控制 ? ?-- ? 忙碌,告訴發(fā)送方等待。
基于流的數(shù)據(jù)控制 -- 軟件看一系列的字節(jié)而不是一系列具體記錄。想要發(fā)送具體數(shù)據(jù),必須編碼記錄。
path MTU discovery -- TCP選擇最大包大小,避免分割
UDP:
在IPv4廣播消息—包發(fā)送到廣播地址被在廣播域中的所有主機接收。
多播消息—包發(fā)送到多播地址,被任何訂閱它的主機接收。實踐中一般限制在LAN
保存記錄邊界—接收者視所有獨立的消息。而不是連續(xù)的流字節(jié)。
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地址改變,最小化服務(wù)中斷。
通過超過一個地址訪問主機
允許多物理主機偽裝成一個
在潛在技術(shù)能夠適應(yīng)改變
Packet Routing and Delivery
Link-layer addressing
邏輯地址到物理地址的轉(zhuǎn)換。
執(zhí)行這種會話的機制取決于什么種類的網(wǎng)絡(luò):
1. On Ethernet-like networks,OS能從IPv4地址包含硬件地址,通過運用address resolution protocol (ARP)。一個ARP請求包含一個廣播消息,在網(wǎng)絡(luò)中詢問有特定IP地址的主機。之后主機用自己的link-layer地址作為響應(yīng)。
IPv6通信,主機用相似協(xié)議:neighbor discovery protocol (NDP),這種協(xié)議基于ICMP。
2. Non-Ethernet-like networks,用多種網(wǎng)絡(luò)協(xié)議,但是一般行為相似。網(wǎng)絡(luò)驅(qū)動提供從IP地址到一些特定硬件值的映射,這些值用于唯一標識包的目的地。
3. Point-to-point networks,不需要執(zhí)行映射,因為在連接結(jié)束,每個包都被發(fā)送到主機。
4. On cellular networks,手機通過信號塔初始化通信,塔分配手機特定的頻率,時間槽。有點像點對點。
ARP協(xié)議搞不定兩主機長距離通信。限制在本地區(qū)域物理網(wǎng)絡(luò)。Internet用路由來進行長距離通信。路由器知道如何發(fā)送數(shù)據(jù)從一個范圍的IP到另一個范圍。
邊緣路由器—個人用戶的小型路由,只知道IP范圍。
Core routers —提供主干網(wǎng)的路由,多物理連接,保存大量路由表(給定IP范圍指明跳的方向)。用border gateway protocol (BGP),the routing information protocol (RIP)。
IPv4 Routing
網(wǎng)絡(luò)地址+主機地址
主機必須知道三:自己IP地址,目標主機IP,是否目標主機與自身其中一個地址在同一網(wǎng)絡(luò),在就直接發(fā)送,不在路由。
廣播地址
網(wǎng)絡(luò)地址
路由地址
IPv6 Routing
Firewalls and Network Address Translation
Dynamic Address Assignment
Dynamic Host Configuration Protocol (DHCP) and DHCPv6
客戶端廣播一個請求給IPv4地址,服務(wù)器分配一個,客戶端維持一個租約,使得IP地址持續(xù)特定的一段時間??蛻舳烁伦饧s直到過期,服務(wù)器沒有義務(wù)支持續(xù)約,但大部分服務(wù)器可以。
Neighbor Discovery and IPv6 Address Assignment
Link-Local Addressing and Bonjour
bonjour一種0配置的網(wǎng)絡(luò)實現(xiàn),包含三個部分:
(1)在IPv4的link-local地址,一種自我分配IP地址的方式,在沒有DHCP服務(wù)或者其他IP地址分配方法的時候。(IPv6內(nèi)置)
(2)組播DNS,當一個基礎(chǔ)架構(gòu)服務(wù)不被展示或者當本地不托管命名更加方便,提供DNS解決方案
(3)DNS服務(wù)發(fā)現(xiàn),一種注冊和發(fā)現(xiàn)服務(wù)。
Network OverView
1. 只傳輸需要完成任務(wù)足夠的數(shù)據(jù)
2. 無論什么時候盡可能避免超時
3. 設(shè)計用戶接口,允許用戶輕易的取消那些太久完成的任務(wù)
3. 優(yōu)雅的處理失敗
4. 當網(wǎng)絡(luò)表現(xiàn)不好時,優(yōu)雅的降級
5. 選擇任務(wù)合適的APIs
6. 小心設(shè)計軟件,以最小化安全風(fēng)險
Designing for Real-World Networks
一些網(wǎng)絡(luò)設(shè)計原則
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提供三種主要用戶空間的網(wǎng)絡(luò)API,F(xiàn)oundation & 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適用大多數(shù)開發(fā)者
CFNetService,高層C API適用在CF代碼
DNS Service Discovery,底層C API適用跨平臺代碼,比高層提供更多的靈活
GAME
more, Multipeer Connectivity Framework與你app的實例通信,關(guān)聯(lián)鄰近設(shè)備。
Bonjour Service Overview
包含三個部分:
服務(wù)名:唯一
服務(wù)類型:對程序所有實例相同,應(yīng)該被注冊IANA
域:
(1)Publishing a Network Service
三種方式:
OC & CF代碼,推薦CFNetServices API
便攜C代碼,除了OSX iOS,推薦DNS Service Discovery C API
發(fā)布步驟:
<1> 創(chuàng)建一個socket來監(jiān)聽對服務(wù)的連接,基于TCP的服務(wù)Networking Programming Topics
<2> 創(chuàng)建服務(wù)對象,提供socket的端口,domain,服務(wù)類型
F,NSNetService +initWithDomain:type:name:port:
CF,CFNetServiceRef + CFNetServiceCreate
DSD,調(diào)用DNSServiceRegister返回DNSServiceRef對象
<3> 分配代理和回調(diào)
F,NSNetService代理
CF,分配一個客戶端回調(diào)給CFNetServiceRef
DSD,
<4> 如果有必要,安排,重新安排服務(wù)
F,在當前run loop,默認mode,服務(wù)自動被安排。如果需要在另一個runloop,不同mode,需要解除,重新安排
CF,必須安排CFNetServicesRef在一個run loop。
DSD,調(diào)用DNSServiceSetDispatchQueue安排服務(wù)在一個dispatch queue上。
<5> 發(fā)布
F,調(diào)用publish
CF,調(diào)用CFNetServiceRegisterWithOptions
DSD,已經(jīng)發(fā)布。
當服務(wù)發(fā)布之后,當連接建立,你能在scoket上監(jiān)聽連接,設(shè)置輸入輸出流。
(2)Browsing for and Connecting to a Network Service
發(fā)現(xiàn)和解決網(wǎng)絡(luò)服務(wù)的過程和發(fā)布過程一樣簡單。為了瀏覽網(wǎng)絡(luò)服務(wù),OC,創(chuàng)建NSNetServiceBrowser,分配一個delegate。然后,調(diào)用searchForServicesOfType:inDomain:方法,一旦任何服務(wù)被發(fā)現(xiàn),代理方法netServiceBrowser:didFindService:moreComing:被調(diào)用。
為了連接服務(wù),首先停止瀏覽用stop,然后調(diào)用getInputStream:outputStream:,
CFNetServiceRef + CFStreamCreatePairWithSocketToNetService連接bonjour服務(wù)
NSNetService and Automatic Reference Counting (ARC)
(3)Resolving a Network Service
為了解決,首先stop瀏覽,然后調(diào)用resolveWithTimeout: + NSNetService。
當服務(wù)地址已經(jīng)解決,服務(wù)的代理方法netServiceDidResolveAddress:被調(diào)用。你能之后訪問服務(wù)器主機名,或者地址信息。
Multipeer Connectivity Overview
與鄰近設(shè)備的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
為了在用戶默認的瀏覽器或播放器中打開網(wǎng)頁和流URL。
iOS,用UIApplication的openURL:方法。
Launching the App Store from an iOS application
Displaying Web Content in Your Application
用WebKit引擎能很容易的加載和展示網(wǎng)頁,通過與Safari相同的渲染引擎
iOS,UIWebView的loadRequest:方法,初始化initWithFrame:
UIWebView Class Reference
Displaying Streaming Multimedia Content in Your Application
流媒體
iOS,Media Player Framework基礎(chǔ)播放,AV Foundation framework更多復(fù)雜的功能。
Multimedia Programming Guide &&AVFoundation Programming Guide.
Making HTTP and HTTPS Requests
當選擇API,應(yīng)該首先考慮為什么要做HTTP請求:
如果寫一個雜志的app,應(yīng)該用NKAssetDownload API在后臺下載文本
一般用NSURLSession & NSURLConnection APIs
Making Requests Using Foundation — NSURLSession & NSURLConnection
(1)Retrieving the Contents of a URL without Delegates
只需要通過URL獲取文本,用結(jié)果做一些事情?!鞣N熟悉的方法
(2)Retrieving the Contents of a URL with Delegates — delegate
大多數(shù)情況,NSURLSession和NSURLConnection功能相似,但是有幾點很重要的不同:
<1> NSURLSession API提供下載任務(wù)的行為很像NSURLDownload類,進一步描述在Downloading the Contents of a URL to Disk.
<2> 當你創(chuàng)建一個NSURLSession對象,提供了一個重用配置對象,它封裝了許多一般的配置選項。而NSURLConnection,你必須在每個連接獨立的設(shè)置這些選項
<3> NSURLConnection對象處理簡單的請求和在線追蹤的請求
NSURLSession對象管理多任務(wù),所有這些代表單個URL請求和在線追蹤請求。當你app發(fā)起時,你一般創(chuàng)建一個session,之后你創(chuàng)建任務(wù),用創(chuàng)建NSURLConnection差不多同樣的方式
<4> 對于NSURLConnection,每個連接對象有分離的delegate。對于NSURLSession,delegate在一個session中所有任務(wù)共享。如果你需要用不同的delegate,必須新建session
當你初始化NSURLSession or NSURLConnection對象,連接或會話在當前run loop的默認mode被自動安排。
你提供的delegate在連接的整個過程中獲得通知,包括間隙調(diào)用URLSession:dataTask:didReceiveData:or a target="_self" connection:didReceiveData:方法,當連接從服務(wù)器獲得額外的數(shù)據(jù)。代理的責(zé)任就是追蹤已經(jīng)獲得的數(shù)據(jù)。
(1)如果數(shù)據(jù)能一次處理一段,那就這么做
(2)如果太小,追加到NSMutableData
(3)如果太大,就寫入文件,在傳輸完成再處理
當URLSession:task:didCompleteWithError:or connectionDidFinishLoading:被調(diào)用,delegate獲得全部URL的數(shù)據(jù)。
(3)Downloading the Contents of a URL to Disk
你需要下載URL并存儲結(jié)果作為一個文件,但不想處理。NSURLSession用一步讓你直接下載URL到磁盤文件。NSURLSession也允許你停止和繼續(xù)下載,重新開始失敗下載,當app掛起,崩潰時候繼續(xù)下載。。。老版本iOS,必須用NSURLCon對象下載數(shù)據(jù)到內(nèi)存,然后自己寫數(shù)據(jù)到文件。
為了用NSURLSe來下載,代碼必須:
1.用自定義delegate創(chuàng)建session,你選擇的配置對象:
(1)如果你想當app沒運行繼續(xù)下載,當創(chuàng)建session時,必須提供后臺session配置對象(唯一標識符)
(2)如不關(guān)心后臺下載,可以用任何提供的session配置對象類型創(chuàng)建session
2.在session中創(chuàng)建和繼續(xù)一個或者更多下載任務(wù)
3.等待直到delegate獲得來自任務(wù)或者會話的調(diào)用。必須實現(xiàn):
URLSession:downloadTask:didFinishDownloadingToURL:+URLSession:task:didCompleteWithError:
(4)Making a POST Request
可以用相同的方式生成HTTP orHTTPS POST,主要的不同是,必須首先配置一個NSMutableURLRequest對象,提供給initWithRequest:delegate:。
需要構(gòu)建body data,以下三種方式之一:
<1> 上傳短的,在內(nèi)存數(shù)據(jù),你應(yīng)該URL編碼已存在的數(shù)據(jù)塊。描述在Encoding URL Data
<2> 從磁盤上傳文件數(shù)據(jù),setHTTPBodyStream:告訴NSMutableURLRequest去讀取NSInputStream和用結(jié)果數(shù)據(jù)作為body文本
<3> 大塊結(jié)構(gòu)數(shù)據(jù),CFStreamCreateBoundPair創(chuàng)建一對流,之后setHTTPBodyStream:告訴NSMutableURLRequest用其中一個流作為它body文本的源。通過寫入其他流,能一次發(fā)送一段數(shù)據(jù)。
(5)Configuring Authentication
對于NSURLSession,你的delegate要實現(xiàn)URLSession:task:didReceiveChallenge:completionHandler:。此方法中,你執(zhí)行無論什么你需要的操作來決定如何響應(yīng)。之后通過常量調(diào)用完成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唯一不同就是包文本
基于流的客戶端,初始化構(gòu)建通信渠道的方式非常不同
POSIX networking is discouraged
監(jiān)聽端口,非TCP連接,CFSocket
OC,F(xiàn) OC API
C,CF OC API
Using Networking Securely
Enabling TLS or SSL
Transport Layer Security (TLS) protocol提供基于socket通信的數(shù)據(jù)加密,與服務(wù)器認證一起防止客戶端被騙。
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
捕獲網(wǎng)絡(luò)支持
后臺
WIFI only連接
(1)Restrict Cellular Networking Correctly
SCNetworkReachability—>kSCNetworkReachabilityFlagsIsWWAN
iOS 5之前的特例~~~
F,NSMutableURLRequest —> setAllowsCellularAccess:來指定是否請求能發(fā)送通過蜂窩網(wǎng)絡(luò)。allowsCellularAccess
CF,kCFStreamPropertyNoCellular,CFSocketStream && CFHTTPStream
在老版本,繼續(xù)用kSCNetworkReachabilityFlagsIsWWAN最好了,決定是否流量被發(fā)送通過蜂窩連接,但是要知道它的限制。
(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,當你開發(fā)跨平臺工具或者高性能服務(wù)器軟件。
Avoid Synchronous Networking Calls on the Main Thread
如果你在主線程執(zhí)行網(wǎng)絡(luò)操作,必須只用異步調(diào)用。
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
如果應(yīng)用與web服務(wù)器或者FTP服務(wù)器交互超出了CFURL或者NSURL APIs的能力,應(yīng)該考慮用CFHTTPStream and CFFTPStream APIs。他們支持復(fù)雜的HTTP和FTP請求,如HTTP GET和POST請求,HTTP cookie和請求頭管理,F(xiàn)TP目錄讀取,F(xiàn)TP文件上傳。
5. Communicate Using Sockets
運用sockets,iOS提供run-loop socket集成在CF中的APIs。
6. Register and Discover Network Services