1:TCP考點(diǎn)
1:序號(hào):Seq序號(hào),占32位,用來(lái)標(biāo)識(shí)從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時(shí)對(duì)此進(jìn)行標(biāo)記
2:確認(rèn)序號(hào):ack序號(hào),占32位,只有ACK標(biāo)志位為1時(shí),確認(rèn)序號(hào)字段才有效,不是1,就無(wú)效。ack=Seq+1。
3:ACK:標(biāo)志位? 為了來(lái)說(shuō)明確認(rèn)序號(hào)有效。
5:RST :復(fù)位,重置連接
6:SYN:發(fā)起一個(gè)新連接。同步字段,當(dāng)SYN=1,表示這個(gè)是一個(gè)同步請(qǐng)求。
7: FIN 終止鏈接當(dāng)FIN=1的時(shí)候,表明數(shù)據(jù)已經(jīng)發(fā)送完畢,請(qǐng)求釋放鏈接
確認(rèn)序號(hào)ack與標(biāo)志位中的ACK
三次握手
TCP鏈接使用的是客戶端服務(wù)器方式
客戶端 Client (主動(dòng)端)發(fā)送數(shù)據(jù)
服務(wù)端 Server (開(kāi)啟端口) 主動(dòng)監(jiān)聽(tīng)
1:Client發(fā)送鏈接請(qǐng)求報(bào)文? SYN=1? seq=X (鏈接請(qǐng)求報(bào)文)
2:Server接受到了報(bào)文,由標(biāo)志位SYN=1知道Client請(qǐng)求建立連接。然后發(fā)送SYN=1 并且ACK=1? 使確認(rèn)號(hào)ack=X+1(已經(jīng)收到了X的序列號(hào)了,希望下一個(gè)是X+1的數(shù)據(jù)流),
同時(shí)自己發(fā)送一個(gè)seq=y。并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求
3:Client接受到信息后,檢查這個(gè)確認(rèn)序號(hào)ack是否=X+1.標(biāo)志位是否為1.再次發(fā)送ACK=1? 然后ack=y+1? (表明接受到了y的數(shù)據(jù)流了,希望下一個(gè)是y+1)? 同時(shí)seq=s+1
斷開(kāi)鏈接
分為2個(gè)部分 主動(dòng)關(guān)閉方A的分離和被動(dòng)關(guān)閉方B的分離
1:A 首先發(fā)送FIN=1 停止發(fā)送數(shù)據(jù) seq=x 等待B的鏈接 。 進(jìn)入FIN_WAIT_1狀態(tài)。
2:B 收到信息后 標(biāo)志位ACK=1 同時(shí)確認(rèn)號(hào) ack=X+1 自己再次發(fā)送這個(gè)seq=y。并將該數(shù)據(jù)包發(fā)送給A以確認(rèn)連接請(qǐng)求。? 進(jìn)入CLOSE_WAIT狀態(tài)。
此時(shí) 從A到B這個(gè)方向就釋放了,但是TCP鏈接還是半關(guān)閉狀態(tài) ,B發(fā)送數(shù)據(jù), A仍然要接受
3:B再次發(fā)送一個(gè)FIN =1 標(biāo)志位ACK=1 seq=w ack=X+1
4:A 收到鏈接釋放報(bào)文后,ack=w+1 seq=a+1
為什么建立連接是三次握手,而關(guān)閉連接卻是四次揮手呢??
這是因?yàn)榉?wù)端在LISTEN狀態(tài)下,收到建立連接請(qǐng)求的SYN報(bào)文后,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶端。而關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文時(shí),僅僅表示對(duì)方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對(duì)方了,所以己方可以立即close,也可以發(fā)送一些數(shù)據(jù)給對(duì)方后,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示同意現(xiàn)在關(guān)閉連接,因此,己方ACK和FIN一般都會(huì)分開(kāi)發(fā)送。