TCP协议的3次握手和4次挥手
一、為什么需要三次握手
先通俗解釋一下為什么需要3次而不是2次或者4次.
好比打電話:
3次:
‘喂,聽得到嗎?’
‘恩恩,聽得到,你聽得到我嗎?’
‘聽得到,我給你說啊吧啦吧啦’
2次(無限循環(huán))
‘喂,聽得到嗎?’
‘聽得到,你聽得到我嗎’
‘喂喂,聽不聽得到我說話啊’
‘靠,聽得到啊,你說啊’
‘喂,你TM到底聽不聽得到啊’
‘。。。。。?!?
4次
‘喂,聽得到嗎?’
‘恩恩,聽得到,你聽得到我嗎?’
‘聽得到,你聽得到我說話嗎’
‘。。。。不想和傻逼說話’
再解釋為什么網(wǎng)絡(luò)通信需要3次握手過程:主要是為了防止已經(jīng)失效的報文段突然再次發(fā)送到服務(wù)端,因而為此產(chǎn)生錯誤。假如客戶端發(fā)出一個連接請求報文段,該報文段并沒有丟失而是在某個網(wǎng)絡(luò)節(jié)點長時間滯留了,以至于在連接失效了之后才到達服務(wù)器,這本來是一個實效的報文段了,但是服務(wù)器卻以為這是客戶端重新發(fā)起的請求,于是服務(wù)器就向客戶端發(fā)送確認報文段,同意建立連接。假如此時沒有三次,服務(wù)器發(fā)出確認連接,此時TCP連接建立。但是這并不是客戶端發(fā)出的新的請求,所以并不理會服務(wù)器的確認,同時也不會向上發(fā)送信息,而此時的服務(wù)器以為連接已經(jīng)建立并等待客戶端發(fā)送數(shù)據(jù),這樣服務(wù)器的很多資源就會白白浪費。采用三次握手就不會出現(xiàn)這種現(xiàn)象,客戶端不向服務(wù)器的確認發(fā)出確認,服務(wù)器收不到確認,就知道客戶端并沒有發(fā)送建立新連接的請求。
解釋下為什么需要4次揮手斷開連接:TCP協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的運輸層通信協(xié)議。TCP是全雙工模式,這就意味著,當主機1發(fā)出FIN報文段時,只是表示主機1已經(jīng)沒有數(shù)據(jù)要發(fā)送了,主機1告訴主機2,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了;但是,這個時候主機1還是可以接受來自主機2的數(shù)據(jù);當主機2返回ACK報文段時,表示它已經(jīng)知道主機1沒有數(shù)據(jù)發(fā)送了,但是主機2還是可以發(fā)送數(shù)據(jù)到主機1的;當主機2也發(fā)送了FIN報文段時,這個時候就表示主機2也沒有數(shù)據(jù)要發(fā)送了,就會告訴主機1,我也沒有數(shù)據(jù)要發(fā)送了。
二、3次握手、數(shù)據(jù)傳輸、4次揮手的過程
先來看看3次握手
第一次握手:建立連接??蛻舳税l(fā)送連接請求報文段,將SYN位置為1,Sequence Number為x;然后,客戶端進入SYN_SEND狀態(tài),等待服務(wù)器的確認;
第二次握手:服務(wù)器收到SYN報文段。服務(wù)器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設(shè)置Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要發(fā)送SYN請求信息,將SYN位置為1,Sequence Number為y;服務(wù)器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一并發(fā)送給客戶端,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK報文段。然后將Acknowledgment Number設(shè)置為y+1,向服務(wù)器發(fā)送ACK報文段,這個報文段發(fā)送完畢以后,客戶端和服務(wù)器端都進入ESTABLISHED狀態(tài),完成TCP三次握手。
再來看看4次揮手:
第一次分手:主機1(可以是客戶端,也可以是服務(wù)器端),設(shè)置Sequence Number和Acknowledgment Number,向主機2發(fā)送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態(tài);這表示主機1沒有數(shù)據(jù)要發(fā)送給主機2了;
第二次分手:主機2收到了主機1發(fā)送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態(tài);主機2告訴主機1,我“同意”你的關(guān)閉請求;
第三次分手:主機2向主機1發(fā)送FIN報文段,請求關(guān)閉連接,同時主機2進入LAST_ACK狀態(tài);
第四次分手:主機1收到主機2發(fā)送的FIN報文段,向主機2發(fā)送ACK報文段,然后主機1進入TIME_WAIT狀態(tài);主機2收到主機1的ACK報文段以后,就關(guān)閉連接;此時,主機1等待2MSL后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉,那好,主機1也可以關(guān)閉連接了。
總結(jié)
以上是生活随笔為你收集整理的TCP协议的3次握手和4次挥手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: for循环中pairs与ipairs的区
- 下一篇: TCP/IP协议是什么