TCP和UDP的區(qū)別與聯(lián)系
1,TCP為傳輸控制層協(xié)議霜浴,為面向連接的晶衷,可靠的,點(diǎn)到點(diǎn)的通信阴孟。
2晌纫,UDP為用戶數(shù)據(jù)報(bào)協(xié)議,非連接的不可靠的點(diǎn)到點(diǎn)的通信
3永丝,TCP側(cè)重可靠傳輸锹漱,UDP側(cè)重快速傳輸
TCP的特性:
1,TCP提供一種面向連接的,可靠的字節(jié)流服務(wù)
2慕嚷,在一個(gè)TCP連接中哥牍,僅有兩方可以彼此通信毕泌,廣播和多播不能用于TCP
3,TCP使用校驗(yàn),確認(rèn)嗅辣,和重傳機(jī)制來保證可靠傳輸懈词。
4,TCP使用累積確認(rèn)
5辩诞,TCP使用滑動(dòng)窗口來實(shí)現(xiàn)流量控制坎弯,通過動(dòng)態(tài)改變窗口的大小進(jìn)行擁堵控制
TCP連接的三次握手
三次握手:(Three-way Handshake),是指建立一個(gè)TCP連接時(shí),需要客戶端和服務(wù)器總共發(fā)送3個(gè)包译暂。
三次握手的目的是連接服務(wù)器指定端口抠忘,建立TCP連接,并同步連接雙方的序列號(hào)和確認(rèn)號(hào)外永,交換TCP窗口大小信息崎脉,在socket編程中,客戶端執(zhí)行connect()時(shí)伯顶,將觸發(fā)三次握手
* 第一次握手(SYN=1, seq=x):
客戶端發(fā)送一個(gè) TCP 的 SYN 標(biāo)志位置1的包囚灼,指明客戶端打算連接的服務(wù)器的端口,以及初始序號(hào) X,保存在包頭的序列號(hào)(Sequence Number)字段里祭衩。
發(fā)送完畢后灶体,客戶端進(jìn)入 `SYN_SEND` 狀態(tài)。
* 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答掐暮。即 SYN 標(biāo)志位和 ACK 標(biāo)志位均為1蝎抽。服務(wù)器端選擇自己 ISN 序列號(hào),放到 Seq 域里路克,同時(shí)將確認(rèn)序號(hào)(Acknowledgement Number)設(shè)置為客戶的 ISN 加1樟结,即X+1。
發(fā)送完畢后精算,服務(wù)器端進(jìn)入 `SYN_RCVD` 狀態(tài)瓢宦。
* 第三次握手(ACK=1,ACKnum=y+1)
客戶端再次發(fā)送確認(rèn)包(ACK)灰羽,SYN 標(biāo)志位為0驮履,ACK 標(biāo)志位為1,并且把服務(wù)器發(fā)來 ACK 的序號(hào)字段+1谦趣,放在確定字段中發(fā)送給對(duì)方疲吸,并且在數(shù)據(jù)段放寫ISN的+1
發(fā)送完畢后,客戶端進(jìn)入 `ESTABLISHED` 狀態(tài)前鹅,當(dāng)服務(wù)器端接收到這個(gè)包時(shí)摘悴,也進(jìn)入 `ESTABLISHED` 狀態(tài),TCP 握手結(jié)束舰绘。
TCP斷開的四次揮手
TCP的連接的拆除需要發(fā)送四個(gè)包蹂喻,因此稱為四次揮手(Four-way handshake)葱椭,也叫做改進(jìn)的三次握手】谒模客戶端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作孵运,在 socket 編程中,任何一方執(zhí)行 close() 操作即可產(chǎn)生揮手操作蔓彩。
第一次揮手(FIN=1治笨,seq=x)
假設(shè)客戶端想要關(guān)閉連接,客戶端發(fā)送一個(gè) FIN 標(biāo)志位置為1的包赤嚼,表示自己已經(jīng)沒有數(shù)據(jù)可以發(fā)送了旷赖,但是仍然可以接受數(shù)據(jù)。
發(fā)送完畢后更卒,客戶端進(jìn)入 FIN_WAIT_1 狀態(tài)等孵。
第二次揮手(ACK=1,ACKnum=x+1)
服務(wù)器端確認(rèn)客戶端的 FIN 包蹂空,發(fā)送一個(gè)確認(rèn)包俯萌,表明自己接受到了客戶端關(guān)閉連接的請(qǐng)求,但還沒有準(zhǔn)備好關(guān)閉連接上枕。
發(fā)送完畢后咐熙,服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài),客戶端接收到這個(gè)確認(rèn)包之后姿骏,進(jìn)入 FIN_WAIT_2 狀態(tài)糖声,等待服務(wù)器端關(guān)閉連接。
第三次揮手(FIN=1分瘦,seq=y)
服務(wù)器端準(zhǔn)備好關(guān)閉連接時(shí),向客戶端發(fā)送結(jié)束連接請(qǐng)求琉苇,F(xiàn)IN 置為1嘲玫。
發(fā)送完畢后,服務(wù)器端進(jìn)入 LAST_ACK 狀態(tài)并扇,等待來自客戶端的最后一個(gè)ACK去团。
第四次揮手(ACK=1,ACKnum=y+1)
客戶端接收到來自服務(wù)器端的關(guān)閉請(qǐng)求穷蛹,發(fā)送一個(gè)確認(rèn)包土陪,并進(jìn)入 TIME_WAIT狀態(tài)臣嚣,等待可能出現(xiàn)的要求重傳的 ACK 包擦盾。
服務(wù)器端接收到這個(gè)確認(rèn)包之后菩颖,關(guān)閉連接誓竿,進(jìn)入 CLOSED 狀態(tài)蘸际。
客戶端等待了某個(gè)固定時(shí)間(兩個(gè)最大段生命周期涉瘾,2MSL厘线,2 Maximum Segment Lifetime)之后奄毡,沒有收到服務(wù)器端的 ACK ,認(rèn)為服務(wù)器端已經(jīng)正常關(guān)閉連接励烦,于是自己也關(guān)閉連接谓着,進(jìn)入 CLOSED 狀態(tài)。
Scoket連接和HTTP連接的區(qū)別
HTTP協(xié)議是基于TCP連接的坛掠,是應(yīng)用層協(xié)議赊锚,主要解決如何包裝數(shù)據(jù)。Socket是對(duì)TCP/IP協(xié)議的封裝屉栓,Socket本身并不是協(xié)議舷蒲,而是一個(gè)調(diào)用接口(API),通過Socket系瓢,我們才能使用TCP/IP協(xié)議阿纤。
HTTP連接:短連接,客戶端向服務(wù)器發(fā)送一次請(qǐng)求夷陋,服務(wù)器響應(yīng)后連接斷開欠拾,節(jié)省資源。服務(wù)器不能主動(dòng)給客戶端響應(yīng)(除非采用HTTP長(zhǎng)連接技術(shù))骗绕,iPhone主要使用類NSURLConnection藐窄。
Socket連接:長(zhǎng)連接,客戶端跟服務(wù)器端直接使用Socket進(jìn)行連接酬土,沒有規(guī)定連接后斷開荆忍,因此客戶端和服務(wù)器端保持連接通道,雙方可以主動(dòng)發(fā)送數(shù)據(jù)撤缴,一般多用于游戲.Socket默認(rèn)連接超時(shí)時(shí)間是30秒刹枉,默認(rèn)大小是8K(理解為一個(gè)數(shù)據(jù)包大小)
類別與匿名類別的比較
類別作用:對(duì)原有類(官方類屈呕,第三方類微宝,自定義類等)增補(bǔ)方法,不會(huì)對(duì)原有類產(chǎn)生影響
1,增加成員方法或類方法虎眨,不能增加成員變量蟋软。
2,在類別中可以訪問原類中的成員方法嗽桩,可以訪問原類中的成員變量
類別的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):1岳守,不需要通過增加子類而增加現(xiàn)有類的方法,且類別中的方法與原始類方法基本沒有區(qū)別
2碌冶,通過類別可以將龐大的一個(gè)類的方法進(jìn)行劃分湿痢,便于代碼的日后維護(hù),更新等
缺點(diǎn):1种樱,無法向類別添加實(shí)例變量蒙袍,如果需要增加實(shí)例變量俊卤,之恩給你通過定義子類的形式
2,類別中的方法與原始類及父類方法相比具有更高的優(yōu)先級(jí)害幅,如果覆蓋父類的方法消恍,可能導(dǎo)致super消息的斷裂,因此以现,最好不要付費(fèi)原始類中的方法
匿名類別:匿名類別中可以有屬性和方法狠怨,成員變量,在類外不能直接調(diào)用邑遏,只可以在類內(nèi)調(diào)用佣赖。子類中不能直接訪問匿名類別中生命的方法和成員變量
isMemberOfClass 和 isKindOfClass 聯(lián)系與區(qū)別
聯(lián)系:兩者都能檢測(cè)一個(gè)對(duì)象是否是某個(gè)類的成員
區(qū)別:isKindOfClass不僅用來確定一個(gè)對(duì)象是否是一個(gè)類的成員,也可用來確定一個(gè)對(duì)象是否派生自該類的類的成員记盒,而isMemberOfClass只能做到第一點(diǎn)
例如:如 ClassA派 生 自NSObject 類 , ClassA *a = [ClassA alloc] init];,[a isKindOfClass:[NSObject class]] 可以檢查出 a 是否是 NSObject派生類 的成員,但 isMemberOfClass 做不到憎蛤。
關(guān)于OC中的字符串生成及內(nèi)存管理
一,創(chuàng)建字符串
1纪吮,不需要內(nèi)存管理:NSString *str = @“你好俩檬,我是一個(gè)不需要內(nèi)存管理的字符串,我是存儲(chǔ)在數(shù)據(jù)段的碾盟,系統(tǒng)管我”;
NSLog([NSString stringWithFormat:@"一個(gè)NS字符串"]);
//這種快速方法返回的是一個(gè)retain為1棚辽,autorelease的對(duì)象,不需要操心它的內(nèi)存管理
2冰肴,需要內(nèi)存管理:NSString *str1 =[ [NSString alloc] initWithFormat:@“我是一個(gè)需要內(nèi)存管理的字符串”];
//從一個(gè)文件名中讀取所需要的內(nèi)容
- (id)initWithContentsOfFile:(NSString*)path encoding:(NSStringEncoding)enc error:(NSError**)error;
//從一個(gè)地址讀取需要的內(nèi)容
- (id)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error