Network

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容