從網(wǎng)上一搜一大把的三次握手流程圖示
首先我們來(lái)看一下tcp主要實(shí)現(xiàn)的功能
- 在兩端之間建立一條全雙工連接
- 保證連接之間的數(shù)據(jù)包不丟乡范、不重碳竟、有序
- 控制連接之間數(shù)據(jù)流量(窗口控制)
建立連接時(shí)首要保證兩端可以互相通信
首先是保證兩端之間是可以相互發(fā)送、接收數(shù)據(jù)的
A:你聽見了嗎车胡?
B:我聽見了棚放,你聽見了嗎?
A:我也聽見了
B:好的
假設(shè)只有一次握手灾杰,既A——>B蚊丐,就像你給暗戀的女生寫了一份情書,沒(méi)有給你任何回復(fù)艳吠,你就一廂情愿得認(rèn)為她已經(jīng)是你的女朋友了麦备,強(qiáng)行暗送秋波,人家是不會(huì)回應(yīng)的。
如果有兩次握手凛篙,既A——>B——>A黍匾,這回有戲了,女生答應(yīng)你了(也可能是慘遭拒絕)呛梆,如果真是談對(duì)象锐涯,關(guān)系基本就確立了。
確保歷史連接不被處理
在網(wǎng)絡(luò)世界里填物,事情有一點(diǎn)點(diǎn)變化全庸。這次回到真實(shí)的網(wǎng)絡(luò)環(huán)境,正常的連接情況如下:
Client:填寫IP:PORT融痛,填寫SEQ壶笼,發(fā)送連接請(qǐng)求
Server:收到請(qǐng)求,將收到的SEQ加一填入ACK返回給Client
Client:收到回復(fù)雁刷,判斷ACK中的值是否為之前發(fā)送的SEQ加一覆劈,如果是,建立連接并回執(zhí)給Sever沛励,如果不是則發(fā)送RST通知Server連接無(wú)效
Server: 收到回執(zhí)责语,建立或者丟棄連接
思考一種情況:
A發(fā)起連接后很久沒(méi)有收到B的回復(fù),A又重新發(fā)起了一次對(duì)B的連接目派;
接著B收到了A的前一次連接請(qǐng)求并回復(fù)坤候;
這個(gè)時(shí)候A就可以通過(guò)B返回的ACK中的值與自己當(dāng)前的SEQ值對(duì)比,如果對(duì)比失敗企蹭,就可以認(rèn)為是無(wú)效連接白筹,并通知到B丟棄無(wú)效連接。
為什么不是一次或者二次握手
我們前面討論了只有一次握手肯定是不行的(單相思)谅摄;
那么如果只進(jìn)行二次握手呢徒河?也就是沒(méi)有了A回執(zhí)給B的那一步,這個(gè)時(shí)候連接建立的時(shí)機(jī)就變成了B收到A的請(qǐng)求的時(shí)刻送漠,因?yàn)锽并不清楚收到的請(qǐng)求是新的請(qǐng)求還是已經(jīng)因?yàn)槌瑫r(shí)被A放棄的請(qǐng)求顽照,B只能被動(dòng)地建立連接進(jìn)行初始化,當(dāng)收到新的請(qǐng)求后闽寡,又需要斷開之前建立的連接代兵,造成資源浪費(fèi)。