TCP中的“三次握手”和“四次揮手”(全)

目錄

一、網絡協議模型

二、TCP/UDP

什麼時候應該使用TCP?

什麼時候應該使用UDP?

三、TCP報文

四、TCP三次握手

爲什麼要三次握手?

五、四次分手

爲什麼要四次分手?

爲什麼要等待2MSL?


我們在學習計算機網絡的過程中肯定會學習到它的傳輸方式,以及他的工作模型等。下面給大家分享自己借鑑總結的相關知識點,跟大家分享,大自然的搬運工。

一、網絡協議模型

首先,我們先了解下TCP/IP協議模型,並與OSI模型的對比參考

應用層   應用層
表示層  
會話層  
傳輸層   傳輸層
網絡層   網絡層
數據鏈路層   網絡接口層
物理層  

 

二、TCP/UDP

這次我們要分析的TCP屬於網絡層協議,其中還包括UDP(後邊一起吐槽),雖然都在網絡層,但也有不同的特性,同時也具有不同的應用場景,下邊對比分析。

  TCP UDP
可靠性 可靠 不可靠
連續性 面向連接 無連接
報文 面向字節流 面向報文
效率 傳輸效率低 傳輸效率高
雙工性 全雙工 一對一、一對多、多對一、多對多
流量控制 滑動窗口控制 無控制
擁塞控制 慢開始、擁塞避免、快重傳、快恢復
傳輸速度
應用場景 對效率要求低,對準確性要求高或者要求有連接的場景 對效率要求高,對準確性要求低
應用協議層 SMTP、TELNET、HTTP、FTP等 DNS、TFTP、SNMP、NFS等

什麼時候應該使用TCP?

當對網絡通訊質量有要求的時候,比如:整個數據要準確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。

什麼時候應該使用UDP?

當對網絡通訊質量要求不高的時候,要求網絡通訊速度能儘量的快,這時就可以使用UDP。

三、TCP報文

  16位 16位  
TCP首部 源 端 口 目 的 端 口 20字節的固定首部
序   號
確  認 號
數據偏移 保留 URG ACK PSH RST SYN FIN 窗  口
校 驗 緊 急 指 針
選項(長度可變) 填 充  
  數   據

URG(urgent) :緊急指針是否有效。爲1,表示某一位需要被優先處理
ACK(acknowledgement):確認號是否有效,一般置爲1
PSH(push):提示接收端應用程序立即從TCP緩衝區把數據讀走
RST(reset):對方要求重新建立連接,復位。
SYN(synchronous):請求建立連接,並在其序列號的字段進行序列號的初始值設定。建立連接,設置爲1
FIN (finish):希望斷開連接。

四、TCP三次握手

第一次握手:建立連接。客戶端發送連接請求報文段,將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三次握手。

TCP三次握手就好比兩個人在街上隔着50米看見了對方,但是因爲霧霾等原因不能100%確認,所以要通過招手的方式相互確定對方是否認識自己。

  1. 張三首先向李四招手(syn),李四看到張三向自己招手後,向對方點了點頭擠出了一個微笑(ack)。張三看到李四微笑後確認了李四成功辨認出了自己(進入estalished狀態)。
  2. 但是李四還有點狐疑,向四周看了一看,有沒有可能張三是在看別人呢,他也需要確認一下。
  3. 所以李四也向張三招了招手(syn),張三看到李四向自己招手後知道對方是在尋求自己的確認,於是也點了點頭擠出了微笑(ack),李四看到對方的微笑後確認了張三就是在向自己打招呼(進入established狀態)。
  4. 於是兩人加快步伐,走到了一起,相互擁抱

爲什麼要三次握手?

爲了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。

具體例子:“已失效的連接請求報文段”的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以後的某個時間纔到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段後,就誤認爲是client再次發出的一個新的連接請求。

五、四次分手

第一次分手:主機1(可以使客戶端,也可以是服務器端),設置Sequence 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斷開鏈接的過程和建立鏈接的過程比較類似,只不過中間的兩部並不總是會合成一步走,所以它分成了4個動作,張三揮手(fin)——李四傷感地微笑(ack)——李四揮手(fin)——張三傷感地微笑(ack)。

  1. 之所以中間的兩個動作沒有合併,是因爲tcp存在「半關閉」狀態,也就是單向關閉。
  2. 張三已經揮了手,可是人還沒有走,只是不再說話,但是耳朵還是可以繼續聽,李四呢繼續喊話。等待李四累了,也不再說話了,超張三揮了揮手,張三傷感地微笑了一下,才徹底結束了。

爲什麼要四次分手?

TCP協議是一種面向連接的、可靠的、基於字節流的運輸層通信協議。TCP是全雙工模式,這就意味着,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2,它的數據已經全部發送完畢了;但是,這個時候主機1還是可以接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,但是主機2還是可以發送數據到主機1的;當主機2也發送了FIN報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,之後彼此就會愉快的中斷這次TCP連接。

爲什麼要等待2MSL?

MSL:報文段最大生存時間,它是任何報文段被丟棄前在網絡內的最長時間。原因有二:

  • 保證TCP協議的全雙工連接能夠可靠關閉

  • 保證這次連接的重複數據段從網絡中消失

第一點:如果主機1直接CLOSED了,那麼由於IP協議的不可靠性或者是其它網絡原因,導致主機2沒有收到主機1最後回覆的ACK。那麼主機2就會在超時之後繼續發送FIN,此時由於主機1已經CLOSED了,就找不到與重發的FIN對應的連接。所以,主機1不是直接進入CLOSED,而是要保持TIME_WAIT,當再次收到FIN的時候,能夠保證對方收到ACK,最後正確的關閉連接。

第二點:如果主機1直接CLOSED,然後又再向主機2發起一個新連接,我們不能保證這個新連接與剛關閉的連接的端口號是不同的。也就是說有可能新連接和老連接的端口號是相同的。一般來說不會發生什麼問題,但是還是有特殊情況出現:假設新連接和已經關閉的老連接端口號是一樣的,如果前一次連接的某些數據仍然滯留在網絡中,這些延遲數據在建立新連接之後纔到達主機2,由於新連接和老連接的端口號是一樣的,TCP協議就認爲那個延遲的數據是屬於新連接的,這樣就和真正的新連接的數據包發生混淆了。所以TCP連接還要在TIME_WAIT狀態等待2倍MSL,這樣可以保證本次連接的所有數據都從網絡中消失。

 

 

 

————————————————
借鑑原文鏈接:
掘金:https://juejin.im/post/598ba1d06fb9a03c4d6464ab(關於 TCP/IP,運維必知必會的十個問題)
CSDN:https://blog.csdn.net/qq_25948717/article/details/80382766(TCP三次握手中SYN,ACK,Seq含義)
簡書:https://www.jianshu.com/p/573700560be0(TCP報文格式說明)
知乎:https://zhuanlan.zhihu.com/p/40667482(【TCP】詳解TCP 三次握手和四次揮手)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章