前提
TCP/IP協(xié)議是一種網(wǎng)絡(luò)協(xié)議,并不是在Android中才有的,也不只是在java中有,其他的開(kāi)發(fā)語(yǔ)言中同樣也可以使用TCP/IP協(xié)議進(jìn)行網(wǎng)絡(luò)編程
網(wǎng)絡(luò)的分層
物理層-->數(shù)據(jù)鏈路層-->網(wǎng)絡(luò)層-->傳輸層-->會(huì)話(huà)層-->表示層-->應(yīng)用層
每個(gè)上一層都要基于底下一層而來(lái),我們的IP協(xié)議是位于網(wǎng)絡(luò)層似踱,TCP協(xié)議是位于傳輸層隅熙。TCP協(xié)議是基于IP協(xié)議的稽煤,但是由于TCP協(xié)議和IP協(xié)議是互補(bǔ)的,就組成了我們常說(shuō)的TCP/IP協(xié)議
應(yīng)用層 - 為應(yīng)用提供訪問(wèn)網(wǎng)絡(luò)服務(wù)接口
表示層 - 提供數(shù)據(jù)/信息表示變換囚戚,讓不同編碼計(jì)算機(jī)可相互理解
會(huì)話(huà)層 - 組織同步不同計(jì)算機(jī)的進(jìn)程通信(對(duì)話(huà))酵熙,對(duì)話(huà)的建立與拆除;還提供在數(shù)據(jù)流中插入同步點(diǎn)機(jī)制驰坊,數(shù)據(jù)傳輸中斷后匾二,也不必從頭開(kāi)始,僅重傳最近一個(gè)同步點(diǎn)以后的數(shù)據(jù)
傳輸層 - 源主機(jī)與目的主機(jī)的連接與數(shù)據(jù)傳輸(端到端的數(shù)據(jù)傳輸)
網(wǎng)絡(luò)層 - 尋找合適的路由拳芙,使網(wǎng)絡(luò)層數(shù)據(jù)傳輸單元(分組)可以正確找到目的站
數(shù)據(jù)鏈路層 - 兩個(gè)相鄰結(jié)點(diǎn)間無(wú)差錯(cuò)地以幀為單位的數(shù)據(jù)傳送
物理層 - 物理介質(zhì)傳輸察藐,比特流傳輸
CP/IP三次握手
(1)客戶(hù)端向服務(wù)器端發(fā)送連接請(qǐng)求包SYN(syn=j),等待服務(wù)器回應(yīng)舟扎;
(2)服務(wù)器端收到客戶(hù)端連接請(qǐng)求包SYN(syn=j)后分飞,將客戶(hù)端的請(qǐng)求包SYN(syn=j)放入到自己的未連接隊(duì)列,此時(shí)服務(wù)器需要發(fā)送兩個(gè)包給客戶(hù)端睹限;
? ? ?1.向客戶(hù)端發(fā)送確認(rèn)自己收到其連接請(qǐng)求的確認(rèn)包ACK(ack=j+1)譬猫,向客戶(hù)端表明已知道了其連接請(qǐng)求
?2.向客戶(hù)端發(fā)送連接詢(xún)問(wèn)請(qǐng)求包SYN(syn=k)讯檐,詢(xún)問(wèn)客戶(hù)端是否已經(jīng)準(zhǔn)備好建立連接,進(jìn)行數(shù)據(jù)通信染服;
(3) ?客戶(hù)端收到服務(wù)器的ACK(ack=j+1)和SYN(syn=k)包后别洪,知道了服務(wù)器同意建立連接,此時(shí)需要發(fā)送連接已建立的消息給服務(wù)器柳刮;
向服務(wù)器發(fā)送連接建立的確認(rèn)包ACK(ack=k+1)挖垛,回應(yīng)服務(wù)器的SYN(syn=k)告訴服務(wù)器,我們之間已經(jīng)建立了連接,可以進(jìn)行數(shù)據(jù)通信媚赖。
“三次握手”的目的是“為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端乡翅,因而產(chǎn)生錯(cuò)誤
三次握手可以消除舊有連接請(qǐng)求的SYN消息對(duì)新連接的干擾,同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換TCP 窗口大小信息闸准。
設(shè)想:如果只有兩次握手,那么第二次握手后服務(wù)器只向客戶(hù)端發(fā)送ACK包梢灭,此時(shí)客戶(hù)端與服務(wù)器端建立連接夷家。在這種握手規(guī)則下:?
? ? ? ?假設(shè):如果發(fā)送網(wǎng)絡(luò)阻塞,由于TCP/IP協(xié)議定時(shí)重傳機(jī)制敏释,B向A發(fā)送了兩次SYN請(qǐng)求库快,分別是x1和x2,且因?yàn)樽枞蛟客纾瑢?dǎo)致x1連接請(qǐng)求和x2連接請(qǐng)求的TCP窗口大小和數(shù)據(jù)報(bào)文長(zhǎng)度不一致义屏,如果最終x1達(dá)到A,x2丟失蜂大,此時(shí)A同B建立了x1的連接闽铐,這個(gè)時(shí)候,因?yàn)锳B已經(jīng)連接奶浦,B無(wú)法知道是請(qǐng)求x1還是請(qǐng)求x2同B連接兄墅,如果B默認(rèn)是最近的請(qǐng)求x2同A建立了連接,此時(shí)B開(kāi)始向A發(fā)送數(shù)據(jù)澳叉,數(shù)據(jù)報(bào)文長(zhǎng)度為x2定義的長(zhǎng)度隙咸,窗口大小為x2定義的大小,而A建立的連接是x1成洗,其數(shù)據(jù)包長(zhǎng)度大小為x1五督,TCP窗口大小為x1定義,這就會(huì)導(dǎo)致A處理數(shù)據(jù)時(shí)出錯(cuò)瓶殃。很顯然充包,如果A接收到B的請(qǐng)求后,A向B發(fā)送SYN請(qǐng)求y3(y3的窗口大小和數(shù)據(jù)報(bào)長(zhǎng)度等信息為x1所定義)碌燕,確認(rèn)了連接建立的窗口大小和數(shù)據(jù)報(bào)長(zhǎng)度為x1所定義误证,A再次確認(rèn)回答建立x1連接继薛,然后開(kāi)始相互傳送數(shù)據(jù),那么就不會(huì)導(dǎo)致數(shù)據(jù)處理出錯(cuò)了愈捅。
TCP/IP釋放連接需四次揮手
假設(shè)客戶(hù)機(jī)A向服務(wù)器B請(qǐng)求釋放TCP/IP連接遏考,則:
第一次揮手:主機(jī)A向主機(jī)B發(fā)送FIN包;A告訴B蓝谨,我(A)發(fā)送給你(B)的數(shù)據(jù)大小是N灌具,我發(fā)送完畢,請(qǐng)求斷開(kāi)A->B的連接譬巫。
第二次揮手:主機(jī)B收到了A發(fā)送的FIN包咖楣,并向主機(jī)A發(fā)送ACK包;B回答A芦昔,是的诱贿,我總共收到了你發(fā)給我N大小的數(shù)據(jù),A->B的連接關(guān)閉咕缎。
第三次揮手:主機(jī)B向主機(jī)A發(fā)送FIN包珠十;B告訴A,我(B)發(fā)送給你(A)的數(shù)據(jù)大小是M凭豪,我發(fā)送完畢焙蹭,請(qǐng)求斷開(kāi)B->A的連接。
第四次揮手:主機(jī)A收到了B發(fā)送的FIN包嫂伞,并向主機(jī)B發(fā)送ACK包孔厉;A回答B(yǎng),是的帖努,我收到了你發(fā)送給我的M大小的數(shù)據(jù)撰豺,B->A的連接關(guān)閉。
需四次揮手原因:由于TCP的半關(guān)閉特性然磷,TCP連接時(shí)雙全工(即數(shù)據(jù)在兩個(gè)方向上能同時(shí)傳遞)郑趁,因此刊驴,每個(gè)方向必須單獨(dú)的進(jìn)行關(guān)閉姿搜。這個(gè)原則就是:當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向上的連接。當(dāng)一端收到一個(gè)FIN后捆憎,它必須通知應(yīng)用層另一端已經(jīng)終止了那個(gè)方向的數(shù)據(jù)傳送舅柜。即收到一個(gè)FIN意味著在這一方向上沒(méi)有數(shù)據(jù)流動(dòng)了
感謝 Android中的TCP/IP協(xié)議,Socket躲惰,Http協(xié)議間的關(guān)系 - 牛仔面包 - CSDN博客