什么是三次握手
學(xué)過(guò)網(wǎng)絡(luò)編程的人,應(yīng)該都知道TCP建立連接的三次握手,下面簡(jiǎn)單描述一下這個(gè)過(guò)程。 ?
第一次握手:客戶(hù)端發(fā)送TCP包,置SYN標(biāo)志位為1,將初始序號(hào)X,保存在包頭的序列號(hào)(Seq)里。?
第二次握手:服務(wù)端回應(yīng)確認(rèn)包,置SYN標(biāo)志位為1,置ACK為X+1,將初始序列號(hào)Y,保存在包頭的序列號(hào)里。?
第三次握手:客戶(hù)端對(duì)服務(wù)端的確認(rèn)包進(jìn)行確認(rèn),置SYN標(biāo)志位為0,置ACK為Y+1,置序列號(hào)為Z。
我們先來(lái)將三次握手這個(gè)過(guò)程捋一遍。(S-服務(wù)端,C-客戶(hù)端)
第一次握手后,S可以確認(rèn)自己收?qǐng)?bào)文與C發(fā)報(bào)文的功能都正常,而C呢,它什么都不能確認(rèn)。?
第二次握手后,C可以確認(rèn)自己的收發(fā)報(bào)文與S的收發(fā)報(bào)文功能都正常,也就是認(rèn)為連接已建立。?
那么第三次呢,S也可以確認(rèn)雙方能夠正常通信。
假想一下,如果我們?nèi)サ袅说谌文兀?
因?yàn)槲覀儾贿M(jìn)行第三次握手,所以在S對(duì)C的請(qǐng)求進(jìn)行回應(yīng)(第二次握手)后,就會(huì)理所當(dāng)然的認(rèn)為連接已建立,而如果C并沒(méi)有收到S的回應(yīng)呢?此時(shí),C仍認(rèn)為連接未建立,S會(huì)對(duì)已建立的連接保存必要的資源,如果大量的這種情況,S會(huì)崩潰。?
因此第三次握手是必要的。
首先,如果樂(lè)于思考應(yīng)該會(huì)對(duì)上面有這樣的疑問(wèn):
既然沒(méi)法確認(rèn)第二次的握手,C是否可以收到,
那么怎么確定第三次握手S就可以收到呢?
不錯(cuò),這根本沒(méi)法確定,因?yàn)橥耆煽康耐ㄐ艆f(xié)議是根本不存在的,我們?nèi)魏蔚耐ㄐ艆f(xié)議都是在接受這樣的現(xiàn)實(shí)情況之上進(jìn)行的。?
而三次握手后,C和S至少可以確認(rèn)之前的通信情況,但無(wú)法確認(rèn)之后的情況。?
在這個(gè)道理上說(shuō),無(wú)論是四次還是五次或是更多次都是徒勞的。