TCP協(xié)議非常重要,這里把它的連接和釋放整理一下。
首先是三次握手:1、? 客戶端發(fā)起,像服務(wù)器發(fā)送的報(bào)文SYN=1,ACK=0,然后選擇了一個(gè)初始序號(hào):seq=x。
SYN是干什么用的?
在鏈接的時(shí)候創(chuàng)建一個(gè)同步序號(hào),當(dāng)SYN=1同時(shí)ACK=0的時(shí)候,表明這是一個(gè)連接請(qǐng)求的報(bào)文段。如果對(duì)方有意鏈接,返回的報(bào)文里面SYN=1,ACK=1,。從這個(gè)意義上來(lái)說(shuō),SYN=1的時(shí)候,就表明這是一個(gè)‘請(qǐng)求’或者‘接受請(qǐng)求’的報(bào)文。
SYN=1的報(bào)文段不能攜帶數(shù)據(jù)。但是要消耗掉一個(gè)序號(hào),
ACK是干什么用的?
僅當(dāng)ACK=1的時(shí)候,確認(rèn)字號(hào)(期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的編號(hào))才有效。因此,TCP規(guī)定,當(dāng)鏈接建立之后,所有往來(lái)的報(bào)文里面的ACK都應(yīng)該是1(事實(shí)上,也只有客戶端發(fā)起的鏈接請(qǐng)求報(bào)文的ACK沒(méi)有置1)。
現(xiàn)在的狀態(tài):客戶端進(jìn)入SYN-SEND狀態(tài);
2、? 服務(wù)器接收到了SYN=1,ACK=0的請(qǐng)求報(bào)文之后,返回一個(gè)SYN=1,ACK=1的確認(rèn)報(bào)文。
同時(shí),確認(rèn)號(hào)ack=x+1,同時(shí)也為自己選擇一個(gè)初始序號(hào)seq=y
現(xiàn)在的狀態(tài):服務(wù)器進(jìn)入SYN-REVD狀態(tài);
3、? 客戶端接收到了服務(wù)器的返回信息之后,還要給服務(wù)器返回最后一條確認(rèn),ACK=1,確認(rèn)號(hào)ack=y+1;
現(xiàn)在的狀態(tài):客戶端進(jìn)入ESTABLISHED狀態(tài)。
下面說(shuō)一下為什么兩次握手不行,非得三次:
首先說(shuō)明一種正常的情況,就是客戶端發(fā)送了一條請(qǐng)求鏈接的報(bào)文,但是由于網(wǎng)絡(luò)原因丟失了,所以,不可能接收到服務(wù)器端的確認(rèn)。這個(gè)時(shí)候,客戶端就就只有再一次發(fā)送原來(lái)的請(qǐng)求報(bào)文,這次服務(wù)器收到之后返回確認(rèn),客戶端再確認(rèn)一次,鏈接確立。
然后考慮一種不正常的情況,客戶端發(fā)了兩次請(qǐng)求鏈接的報(bào)文,第二條被服務(wù)器捕捉到,返回?cái)?shù)據(jù),完成了兩次握手。數(shù)據(jù)傳送完成之后,鏈接關(guān)閉。但是這時(shí)候,第一條擁塞的請(qǐng)求報(bào)文現(xiàn)在到達(dá)了服務(wù)器端,服務(wù)器還以為客戶端要又一次建立連接,于是發(fā)送確認(rèn),然后把自己敞開(kāi),等著客戶端發(fā)送過(guò)來(lái)數(shù)據(jù)。于是,很多的網(wǎng)絡(luò)資源就是這樣浪費(fèi)掉了。
要是實(shí)行三次握手,服務(wù)器收到了一條過(guò)期的請(qǐng)求報(bào)文,返回確認(rèn)信息,客戶端接收到了服務(wù)器的信息之后感到莫名其妙,心想:我他媽又沒(méi)要鏈接,你返回這個(gè)是不是瘋了。于是不置一詞。服務(wù)器過(guò)一段時(shí)間還沒(méi)有收到第三次握手的數(shù)據(jù),知道客戶端并沒(méi)有要求建立鏈接的請(qǐng)求,含淚離開(kāi)。
然后是四次分手:現(xiàn)在雙方的狀態(tài)都是ESTABLISHED狀態(tài)。
1、? 客戶端發(fā)起請(qǐng)求,請(qǐng)求斷開(kāi)鏈接。FIN=1,seq=u。u是之前傳送過(guò)來(lái)的最后一個(gè)字節(jié)的序號(hào)+1。
FIN:用來(lái)釋放一個(gè)鏈接,當(dāng)FIN=1的時(shí)候,表明此報(bào)文的發(fā)送方已經(jīng)完成了數(shù)據(jù)的發(fā)送,沒(méi)有新的數(shù)據(jù)要傳送,并要求釋放鏈接。
客戶端進(jìn)入FIN-WAIT-1狀態(tài),等著服務(wù)器返回確認(rèn);
2、? 服務(wù)器收到客戶端的請(qǐng)求斷開(kāi)鏈接的報(bào)文之后,返回確認(rèn)信息。ACK=1,seq=v,ack=u+1。
服務(wù)器進(jìn)入CLOSE-WAIT狀態(tài)。
這個(gè)時(shí)候,客戶端不能給服務(wù)器發(fā)送信息報(bào)文,只能接收。但是服務(wù)器要是還有信息要傳給服務(wù)器,仍然能傳送。
3、? 當(dāng)服務(wù)器也沒(méi)有了可以傳的信息之后,給客戶端發(fā)送請(qǐng)求結(jié)束的報(bào)文。FIN=1,ACK=1,
ack=u+1,seq=w。
這個(gè)時(shí)候的狀態(tài):服務(wù)器進(jìn)入LAST-ACK狀態(tài)。
4、? 客戶端接收到FIN=1的報(bào)文之后,返回確認(rèn)報(bào)文,ACK=1,seq=u+1,ack=w+1。
發(fā)送完畢之后,客戶端進(jìn)入等待狀態(tài),等待兩個(gè)時(shí)間周期。關(guān)閉。
為什么最后還要等待兩個(gè)時(shí)間周期呢?
1、? 客戶端的最后一個(gè)ACK報(bào)文在傳輸?shù)臅r(shí)候丟失,服務(wù)器并沒(méi)有接收到這個(gè)報(bào)文。這個(gè)候。
服務(wù)器就會(huì)超時(shí)重傳這個(gè)FIN消息,然后客戶端就會(huì)重新返回最后一個(gè)ACK報(bào)文,等待兩個(gè)時(shí)間周期,完成關(guān)閉。如果不等待這兩個(gè)時(shí)間周期,服務(wù)器重傳的那條消息就不會(huì)收到。服務(wù)器就因?yàn)榻邮詹坏娇蛻舳说男畔⒍鵁o(wú)法正常關(guān)閉。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-466623.html
2、? 預(yù)防上一次在三次握手中提到的失效的報(bào)文干擾。兩個(gè)時(shí)間周期過(guò)去之后,所有的報(bào)文都會(huì)在網(wǎng)絡(luò)中消失,保證下一次重新連接的時(shí)候有亂七八糟的報(bào)文影響。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-466623.html
到了這里,關(guān)于圖解TCP通信三次握手和四次分手的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!