TCP(Transmission Control Protocol)協(xié)議是一種面向連接的懈凹、相對(duì)可靠的傳輸控制協(xié)議(雖說是面向連接蜀变,其實(shí)也就是通信雙方保持一個(gè)‘連接’狀態(tài))
三次握手和四次揮手是TCP協(xié)議中比較重要的部分,它們都是為數(shù)據(jù)傳輸而服務(wù)的介评,一個(gè)是在數(shù)據(jù)傳輸開始之前建立連接库北,一個(gè)是在數(shù)據(jù)傳輸結(jié)束之后關(guān)閉連接,接下來就簡(jiǎn)單說一下這個(gè)過程:
關(guān)于各種狀態(tài)以及發(fā)送的報(bào)文信息们陆,上圖已經(jīng)表現(xiàn)的很清楚寒瓦,就不詳述了
三次握手
必須是client先發(fā)起請(qǐng)求
- Client向Server發(fā)起建立請(qǐng)求信息,“我想給你發(fā)數(shù)據(jù)棒掠,可以嗎孵构?”
(此步是為了讓Server端知道Client能夠發(fā)送數(shù)據(jù)) - Server端確認(rèn)Client發(fā)來的請(qǐng)求信息,同時(shí)向Client返回確認(rèn)信息烟很,“可以颈墅,你什么時(shí)候發(fā)?”
(此步是為了讓Client知道Server既能接收到數(shù)據(jù)也能發(fā)送數(shù)據(jù)) - Client收到Server的確認(rèn)信息雾袱,并向Server發(fā)送確認(rèn)信息恤筛,“我現(xiàn)在就發(fā),你接著吧芹橡!”
(此步是為了讓Server知道Client能夠接收數(shù)據(jù))
經(jīng)過上面的三次握手毒坛,會(huì)讓Client和Server確認(rèn)彼此雙方既能接收數(shù)據(jù)又能發(fā)送數(shù)據(jù),然后便可以進(jìn)入數(shù)據(jù)傳輸進(jìn)程了,一般來說煎殷,握手次數(shù)達(dá)到3就可以保證通信信息被正確傳達(dá)屯伞。
四次揮手
誰先發(fā)起請(qǐng)求都可以
因?yàn)镃lient和Server都能發(fā)起請(qǐng)求,所以我們此處用A和B替代通訊雙方
- A發(fā)起請(qǐng)求結(jié)束信號(hào)(A表示自己不會(huì)再傳輸數(shù)據(jù)了豪直,請(qǐng)求斷開)
- B向A發(fā)送確認(rèn)收到A發(fā)起的結(jié)束請(qǐng)求的確認(rèn)信號(hào)(B知道了A的請(qǐng)求劣摇,但是還有數(shù)據(jù)要處理,暫時(shí)還不能斷開)
- B向A發(fā)送請(qǐng)求結(jié)束信號(hào)(數(shù)據(jù)發(fā)送完成弓乙,B同意斷開)
- A向B發(fā)送確認(rèn)結(jié)束信號(hào)(A同意斷開末融,很愉快的中斷這次TCP連接)
由于TCP是全雙工的協(xié)議,也就是說兩端可以同時(shí)進(jìn)行數(shù)據(jù)傳輸暇韧,所以勾习,TCP連接的關(guān)閉在兩端都關(guān)閉之后才正式關(guān)閉。
相關(guān)疑問點(diǎn):
-
建立連接的第二次握手為什么要傳回SYN懈玻?
接收端傳回發(fā)送端所發(fā)送的SYN是為了告訴發(fā)送端巧婶,我接收到的信息確實(shí)就是你所發(fā)送的信號(hào)了。 -
傳了SYN酪刀,為啥還要傳ACK粹舵?
雙方通信無誤必須是兩者互相發(fā)送信息都無誤。傳了SYN骂倘,證明發(fā)送方到接收方的通道沒有問題,但是接收方到發(fā)送方的通道還需要ACK信號(hào)來進(jìn)行驗(yàn)證巴席。 -
為什么要三次握手历涝?
為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端,導(dǎo)致服務(wù)器端的一直等待而浪費(fèi)資源漾唉。
引用書中一個(gè)例子:
“已失效的連接請(qǐng)求報(bào)文段”的產(chǎn)生在這樣一種情況下:client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒有丟失荧库,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間的滯留了,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server赵刑。本來這是一個(gè)早已失效的報(bào)文段分衫。但server收到此失效的連接請(qǐng)求報(bào)文段后,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接請(qǐng)求般此。于是就向client發(fā)出確認(rèn)報(bào)文段蚪战,同意建立連接。假設(shè)不采用“三次握手”铐懊,那么只要server發(fā)出確認(rèn)邀桑,新的連接就建立了。由于現(xiàn)在client并沒有發(fā)出建立連接的請(qǐng)求科乎,因此不會(huì)理睬server的確認(rèn)壁畸,也不會(huì)向server發(fā)送數(shù)據(jù)。但server卻以為新的運(yùn)輸連接已經(jīng)建立,并一直等待client發(fā)來數(shù)據(jù)捏萍。這樣太抓,server的很多資源就白白浪費(fèi)掉了。采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生令杈。例如剛才那種情況腻异,client不會(huì)向server的確認(rèn)發(fā)出確認(rèn)。server由于收不到確認(rèn)这揣,就知道client并沒有要求建立連接悔常。”