TCP和UDP的區(qū)別與聯(lián)系
1,TCP為傳輸控制層協(xié)議,為面向連接的,可靠的,點(diǎn)到點(diǎn)的通信。
2,UDP為用戶(hù)數(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ī)制來(lái)保證可靠傳輸。
4,TCP使用累積確認(rèn)
5,TCP使用滑動(dòng)窗口來(lái)實(shí)現(xiàn)流量控制,通過(guò)動(dòng)態(tài)改變窗口的大小進(jìn)行擁堵控制
TCP連接的三次握手
三次握手:(Three-way Handshake),是指建立一個(gè)TCP連接時(shí),需要客戶(hù)端和服務(wù)器總共發(fā)送3個(gè)包。
三次握手的目的是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號(hào)和確認(rèn)號(hào),交換TCP窗口大小信息,在socket編程中,客戶(hù)端執(zhí)行connect()時(shí),將觸發(fā)三次握手
* 第一次握手(SYN=1, seq=x):
客戶(hù)端發(fā)送一個(gè) TCP 的 SYN 標(biāo)志位置1的包,指明客戶(hù)端打算連接的服務(wù)器的端口,以及初始序號(hào) X,保存在包頭的序列號(hào)(Sequence Number)字段里。
發(fā)送完畢后,客戶(hù)端進(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è)置為客戶(hù)的 ISN 加1,即X+1。
發(fā)送完畢后,服務(wù)器端進(jìn)入 `SYN_RCVD` 狀態(tài)。
* 第三次握手(ACK=1,ACKnum=y+1)
客戶(hù)端再次發(fā)送確認(rèn)包(ACK),SYN 標(biāo)志位為0,ACK 標(biāo)志位為1,并且把服務(wù)器發(fā)來(lái) ACK 的序號(hào)字段+1,放在確定字段中發(fā)送給對(duì)方,并且在數(shù)據(jù)段放寫(xiě)ISN的+1
發(fā)送完畢后,客戶(hù)端進(jìn)入 `ESTABLISHED` 狀態(tài),當(dāng)服務(wù)器端接收到這個(gè)包時(shí),也進(jìn)入 `ESTABLISHED` 狀態(tài),TCP 握手結(jié)束。
或者:TCP接通連接要進(jìn)行3次握手過(guò)程
(1)、主機(jī)A通過(guò)向主機(jī)B 發(fā)送一個(gè)含有同步序列號(hào)的標(biāo)志位的數(shù)據(jù)段給主機(jī)B ,向主機(jī)B 請(qǐng)求建立連接,通過(guò)這個(gè)數(shù)據(jù)段,主機(jī)A告訴主機(jī)B 兩件事:我想要和你通信;你可以用哪個(gè)序列號(hào)作為起始數(shù)據(jù)段來(lái)回應(yīng)我.
(2)、主機(jī)B 收到主機(jī)A的請(qǐng)求后,用一個(gè)帶有確認(rèn)應(yīng)答(ACK)和同步序列號(hào)(SYN)標(biāo)志位的數(shù)據(jù)段響應(yīng)主機(jī)A,也告訴主機(jī)A兩件事:我已經(jīng)收到你的請(qǐng)求了,你可以傳輸數(shù)據(jù)了;你要用哪佧序列號(hào)作為起始數(shù)據(jù)段來(lái)回應(yīng)我
(3)、主機(jī)A收到這個(gè)數(shù)據(jù)段后,再發(fā)送一個(gè)確認(rèn)應(yīng)答,確認(rèn)已收到主機(jī)B 的數(shù)據(jù)段:我已收到回復(fù),我現(xiàn)在要開(kāi)始傳輸實(shí)際數(shù)據(jù)了。
這樣3次握手就完成了,主機(jī)A和主機(jī)B 就可以傳輸數(shù)據(jù)了.
三次握手的特點(diǎn):沒(méi)有應(yīng)用層的數(shù)據(jù);SYN這個(gè)標(biāo)志位只有在TCP建立間接時(shí)才會(huì)被置為1;握手完成后SYN標(biāo)志位被置為0;
涉及到的名詞解釋?zhuān)?/h4>
(1)ACK:TCP報(bào)頭的控制位之一,對(duì)數(shù)據(jù)進(jìn)行確認(rèn).確認(rèn)由目的端發(fā)出,用它來(lái)告訴發(fā)送端這個(gè)序列號(hào)之前的數(shù)據(jù)段都收到了.比如,確認(rèn)號(hào)為X,則表示前X-1個(gè)數(shù)據(jù)段都收到了,只有當(dāng)ACK=1時(shí),確認(rèn)號(hào)才有效,當(dāng)ACK=0時(shí),確認(rèn)號(hào)無(wú)效,這時(shí)會(huì)要求重傳數(shù)據(jù),保證數(shù)據(jù)的完整性.
(2)SYN:同步序列號(hào),TCP建立連接時(shí)將這個(gè)位置1
(3)FIN:發(fā)送端完成發(fā)送任務(wù)位,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開(kāi)時(shí),提出斷開(kāi)連接的一方將這位置1
TCP和UDP的區(qū)別
TCP(傳輸控制協(xié)議)是面向連接的協(xié)議,也就是說(shuō)在收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的間接;這種協(xié)議可以提供面向連接的、可靠的、點(diǎn)到點(diǎn)的通信。
UDP(用戶(hù)數(shù)據(jù)包協(xié)議)是非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它向傳送時(shí)就簡(jiǎn)單的去抓取來(lái)自應(yīng)用程序的數(shù)據(jù),并盡可能快的吧它扔到網(wǎng)絡(luò)上;它可以提供非連接的不可靠的點(diǎn)到多點(diǎn)的通信。
TCP斷開(kāi)的四次揮手
TCP的連接的拆除需要發(fā)送四個(gè)包,因此稱(chēng)為四次揮手(Four-way handshake),也叫做改進(jìn)的三次握手。客戶(hù)端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作,在 socket 編程中,任何一方執(zhí)行 close() 操作即可產(chǎn)生揮手操作。
第一次揮手(FIN=1,seq=x)
假設(shè)客戶(hù)端想要關(guān)閉連接,客戶(hù)端發(fā)送一個(gè) FIN 標(biāo)志位置為1的包,表示自己已經(jīng)沒(méi)有數(shù)據(jù)可以發(fā)送了,但是仍然可以接受數(shù)據(jù)。
發(fā)送完畢后,客戶(hù)端進(jìn)入 FIN_WAIT_1 狀態(tài)。
第二次揮手(ACK=1,ACKnum=x+1)
服務(wù)器端確認(rèn)客戶(hù)端的 FIN 包,發(fā)送一個(gè)確認(rèn)包,表明自己接受到了客戶(hù)端關(guān)閉連接的請(qǐng)求,但還沒(méi)有準(zhǔn)備好關(guān)閉連接。
發(fā)送完畢后,服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài),客戶(hù)端接收到這個(gè)確認(rèn)包之后,進(jìn)入 FIN_WAIT_2 狀態(tài),等待服務(wù)器端關(guān)閉連接。
第三次揮手(FIN=1,seq=y)
服務(wù)器端準(zhǔn)備好關(guān)閉連接時(shí),向客戶(hù)端發(fā)送結(jié)束連接請(qǐng)求,F(xiàn)IN 置為1。
發(fā)送完畢后,服務(wù)器端進(jìn)入 LAST_ACK 狀態(tài),等待來(lái)自客戶(hù)端的最后一個(gè)ACK。
第四次揮手(ACK=1,ACKnum=y+1)
客戶(hù)端接收到來(lái)自服務(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)。
客戶(hù)端等待了某個(gè)固定時(shí)間(兩個(gè)最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,沒(méi)有收到服務(wù)器端的 ACK ,認(rèn)為服務(wù)器端已經(jīng)正常關(guān)閉連接,于是自己也關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)。
isMemberOfClass 和 isKindOfClass 聯(lián)系與區(qū)別
聯(lián)系:兩者都能檢測(cè)一個(gè)對(duì)象是否是某個(gè)類(lèi)的成員
區(qū)別:isKindOfClass不僅用來(lái)確定一個(gè)對(duì)象是否是一個(gè)類(lèi)的成員,也可用來(lái)確定一個(gè)對(duì)象是否派生自該類(lèi)的類(lèi)的成員,而isMemberOfClass只能做到第一點(diǎn)
例如:如 ClassA派 生 自NSObject 類(lèi) , ClassA *a = [ClassA alloc] init];,[a isKindOfClass:[NSObject class]] 可以檢查出 a 是否是 NSObject派生類(lèi) 的成員,但 isMemberOfClass 做不到。
(1)ACK:TCP報(bào)頭的控制位之一,對(duì)數(shù)據(jù)進(jìn)行確認(rèn).確認(rèn)由目的端發(fā)出,用它來(lái)告訴發(fā)送端這個(gè)序列號(hào)之前的數(shù)據(jù)段都收到了.比如,確認(rèn)號(hào)為X,則表示前X-1個(gè)數(shù)據(jù)段都收到了,只有當(dāng)ACK=1時(shí),確認(rèn)號(hào)才有效,當(dāng)ACK=0時(shí),確認(rèn)號(hào)無(wú)效,這時(shí)會(huì)要求重傳數(shù)據(jù),保證數(shù)據(jù)的完整性.
(2)SYN:同步序列號(hào),TCP建立連接時(shí)將這個(gè)位置1
(3)FIN:發(fā)送端完成發(fā)送任務(wù)位,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開(kāi)時(shí),提出斷開(kāi)連接的一方將這位置1
TCP(傳輸控制協(xié)議)是面向連接的協(xié)議,也就是說(shuō)在收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的間接;這種協(xié)議可以提供面向連接的、可靠的、點(diǎn)到點(diǎn)的通信。
UDP(用戶(hù)數(shù)據(jù)包協(xié)議)是非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它向傳送時(shí)就簡(jiǎn)單的去抓取來(lái)自應(yīng)用程序的數(shù)據(jù),并盡可能快的吧它扔到網(wǎng)絡(luò)上;它可以提供非連接的不可靠的點(diǎn)到多點(diǎn)的通信。
TCP的連接的拆除需要發(fā)送四個(gè)包,因此稱(chēng)為四次揮手(Four-way handshake),也叫做改進(jìn)的三次握手。客戶(hù)端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作,在 socket 編程中,任何一方執(zhí)行 close() 操作即可產(chǎn)生揮手操作。
假設(shè)客戶(hù)端想要關(guān)閉連接,客戶(hù)端發(fā)送一個(gè) FIN 標(biāo)志位置為1的包,表示自己已經(jīng)沒(méi)有數(shù)據(jù)可以發(fā)送了,但是仍然可以接受數(shù)據(jù)。
發(fā)送完畢后,客戶(hù)端進(jìn)入 FIN_WAIT_1 狀態(tài)。
服務(wù)器端確認(rèn)客戶(hù)端的 FIN 包,發(fā)送一個(gè)確認(rèn)包,表明自己接受到了客戶(hù)端關(guān)閉連接的請(qǐng)求,但還沒(méi)有準(zhǔn)備好關(guān)閉連接。
發(fā)送完畢后,服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài),客戶(hù)端接收到這個(gè)確認(rèn)包之后,進(jìn)入 FIN_WAIT_2 狀態(tài),等待服務(wù)器端關(guān)閉連接。
服務(wù)器端準(zhǔn)備好關(guān)閉連接時(shí),向客戶(hù)端發(fā)送結(jié)束連接請(qǐng)求,F(xiàn)IN 置為1。
發(fā)送完畢后,服務(wù)器端進(jìn)入 LAST_ACK 狀態(tài),等待來(lái)自客戶(hù)端的最后一個(gè)ACK。
客戶(hù)端接收到來(lái)自服務(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)。
客戶(hù)端等待了某個(gè)固定時(shí)間(兩個(gè)最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,沒(méi)有收到服務(wù)器端的 ACK ,認(rèn)為服務(wù)器端已經(jīng)正常關(guān)閉連接,于是自己也關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)。
聯(lián)系:兩者都能檢測(cè)一個(gè)對(duì)象是否是某個(gè)類(lèi)的成員
區(qū)別:isKindOfClass不僅用來(lái)確定一個(gè)對(duì)象是否是一個(gè)類(lèi)的成員,也可用來(lái)確定一個(gè)對(duì)象是否派生自該類(lèi)的類(lèi)的成員,而isMemberOfClass只能做到第一點(diǎn)
例如:如 ClassA派 生 自NSObject 類(lèi) , ClassA *a = [ClassA alloc] init];,[a isKindOfClass:[NSObject class]] 可以檢查出 a 是否是 NSObject派生類(lèi) 的成員,但 isMemberOfClass 做不到。