URL:
"URL":統(tǒng)一資源定位符。協(xié)議頭/主機地址/路徑。
請求協(xié)議:
1,file://訪問的是本地計算機上的資源。
2,ftp://訪問的是共享主機的文件資源。
3,mailto://訪問的是電子郵件地址。
4,http://超文本傳輸協(xié)議,訪問的是遠程的網(wǎng)絡(luò)資源。
TCP/IP協(xié)議。
IP按照層次劃分,IP網(wǎng)際協(xié)議位于網(wǎng)絡(luò)層,IP協(xié)議的作用就是把各種數(shù)據(jù)包傳送給對象。
TCP按照層次劃分,TCP協(xié)議位于傳輸層,提供了可靠的字節(jié)流服務(wù),字節(jié)流服務(wù)指為了翻遍傳輸大塊的數(shù)據(jù)分割成以報文段為單位的數(shù)據(jù)包進行管理。而且TCP協(xié)議能夠確認數(shù)據(jù)最終是否已經(jīng)送達到對方。
為了準(zhǔn)確無誤的將數(shù)據(jù)送達到目的地,TCP采用了三次握手的策略:握手工程中使用TCP的標(biāo)志、SYN和ACK。
三次握手過程:發(fā)送端首先發(fā)送一個帶SYN標(biāo)志的數(shù)據(jù)包給對方。接收端接收到后,回傳一個帶有SYN/ACK標(biāo)志的數(shù)據(jù)包,以表示傳達確認信息,最終發(fā)送端再回傳一個帶ACK標(biāo)志的數(shù)據(jù)包,標(biāo)識握手結(jié)束。
DNS服務(wù)和HTTP協(xié)議一樣位于應(yīng)用層,他提供域名到IP地址間的解析服務(wù)。
性能優(yōu)化:
出發(fā)點:1,努力消除或減少不必要的網(wǎng)絡(luò)延遲。2,將需要傳輸?shù)臄?shù)據(jù)壓縮至最少。
性能優(yōu)化的最佳實踐:
1,減少DNS查找:每次主機名的解析都需要一次網(wǎng)絡(luò)往返,從而增加了請求的延遲時間,同時還會阻塞后續(xù)的請求。
2,重用TCP連接:盡可能的使用持久連接,以消除因TCP握手和慢啟動導(dǎo)致的延遲。
3,減少HTTP重定向。HTTP沖定向需要額外的DNS查詢、TCP握手等非常耗時,最佳的重定向次數(shù)為0.
4,使用CDN(內(nèi)容分發(fā)網(wǎng)絡(luò)):把數(shù)據(jù)放在離用戶地理位置更近的地方,可以明顯減少每次TCP連接的網(wǎng)絡(luò)延遲,增大吞吐量。
5,刪除沒有必要請求的資源。
6,在客戶端緩存資源:緩存必要的應(yīng)用資源,避免每次都重復(fù)請求相同的內(nèi)容,例如多圖片下載可以考慮使用緩存。
7,內(nèi)容在傳輸前先壓縮:傳輸數(shù)據(jù)之前應(yīng)該先壓縮應(yīng)用資源,把要傳輸?shù)淖止?jié)減少到最小,在壓縮的時候確保對每種不同的資源采用最好的壓縮手段。
8,消除不必要的請求開銷:減少請求的HTTP首部數(shù)據(jù)(比如HTTP cookie).
9,并行處理請求和響應(yīng):請求和響應(yīng)的派對都會導(dǎo)致延遲,可以嘗試并行的處理請求和響應(yīng)(利用多個HTTP1.1連接實現(xiàn)并行下載,在可能的情況下使用HTTP管道計數(shù))。
10,針對協(xié)議版本采取優(yōu)化措施。升級到HTTP2.0。
網(wǎng)絡(luò)請求:
"GET和POST請求"區(qū)別在于參數(shù)的傳遞。GET參數(shù)在url后面,參數(shù)不能超過1KB,POST的請求放在請求體中,理論上POST傳遞的數(shù)據(jù)量沒有限制,具體還得按服務(wù)器的處理能力。
iOS中發(fā)送請求的方案:1,NSURLConnection:是03年推出的技術(shù),沒怎么接觸過。
2,NSURLSession:13年iOS7推出以后,用來取代NSURLConnection的技術(shù)。
3,第三方框架:AFNetworking。工作中用的比較多,方便快捷。
"使用NSURLSession發(fā)送網(wǎng)絡(luò)請求"創(chuàng)建task,然后執(zhí)行task。
NSURLSessionTask是一個抽象類,本身是不能使用的,只能使用它的子類:NSURLSessionDataTask、NSURLSessionUploadTask、NSURLSessionDownloadTask。
發(fā)送GET和POST請求
/*
發(fā)送GET請求:
1,創(chuàng)建NSURLSession對象(或者用單利對象)
NSURLSession *session = [NSURLSession sharedSession];
2,根據(jù)URL創(chuàng)建請求。(url后直接跟請求內(nèi)容)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
3,根據(jù)請求創(chuàng)建task。
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
//拿到響應(yīng)頭信息
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//4.解析拿到的響應(yīng)數(shù)據(jù)
NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
}];
4,還得執(zhí)行task。(task剛創(chuàng)建出來默認是掛起狀態(tài)的,需要調(diào)用該方法啟動任務(wù))
[dataTask resume];
還可以使用第二種方法:該方法可以直接填寫url參數(shù),內(nèi)部會將url包裝成請求
- (nullable NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error))completionHandler;
發(fā)送POST請求:
1,創(chuàng)建NSURLSession對象(或者用單利對象)
NSURLSession *session = [NSURLSession sharedSession];
2,根據(jù)URL創(chuàng)建請求對象。(url后請求內(nèi)容封閉到請求體內(nèi)部)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
3,修改請求模式為POST。
request.HTTPMethod = @"POST";
4,設(shè)置請求體:
request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
5,根據(jù)請求創(chuàng)建task。
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
//拿到響應(yīng)頭信息
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//解析拿到的響應(yīng)數(shù)據(jù)
NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
}];
6,執(zhí)行task。
[dataTask resume];