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