您好,登錄后才能下訂單哦!
TCP三次握手建立鏈接與四次揮手斷開鏈接的示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一步一個腳印。
先簡單介紹一下TCP協議。
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層協議。很復雜,但屬于不論程序員還是運維人員都必會的基本功。
面向對象的——連接雙方在通信前需要預先建立一條連接,這猶如實際生活中的打電話,電話必須撥通了以后才能交流。
可靠的——TCP協議中有諸多的規則來保障通信鏈路的可靠性,含應用數據分隔、重傳機制、對首部和數據校驗、對收到的數據進行排序,然后交給應用層、接收端會丟棄重復的數據、可進行流量控制。
TCP數據被封裝在一個IP數據報中,格式如下:
含:端口號[16bit]、序號[32bit]、偏移[4bit]、Reserved [6bit]、標志[6bit]、窗口大小(window)[16bit]、校驗和[16bit]、緊急指針[16bit]、TCP選項
這里需要注意的:
TCP的包是沒有IP地址的,那是IP層上的事,但是有源端口和目標端口。
一個TCP連接需要四個元組來表示是同一個連接(src_ip, src_port, dst_ip, dst_port)準確說是五元組,還有一個是協議。但因為這里只是說TCP協議,所以,這里我只說四元組。
Sequence Number是包的序號,用來解決網絡包亂序(reordering)問題。
Acknowledgement Number就是ACK——用于確認收到,用來解決不丟包的問題。
Window又叫Advertised-Window,也就是著名的滑動窗口(Sliding Window),用于解決流控的。
TCP Flag ,也就是包的類型,主要是用于操控TCP的狀態機的。
URG: 緊急指針有效
ACK:確認序號有效
PSH:接收方應盡快將這個報文段交給應用層
RST:重建連接
SYN:同步序號,用來發起一個連接
FIN: 發端完成發送任務(主動關閉)
三次握手建立鏈接
1.請求端(client客戶端)發送一個SYN=1指明客戶打算連接的服務器的端口,TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,因此聲明自己的初始序號seq為一個隨機數假定為seq=x。
2.服務端(server)對客戶端報文段進行確認,將確認序號設置為ACK=x+1。同時也請求連接客戶端,發送SYN=1,并且發送初始seq號假定為seq=y。
3.客戶端對服務端報文段進行確認,發送確認序號并同意與服務端建立連接ACK=y+1。
這三個報文段完成連接的建立。這個過程也稱為三次握手(three-way handshake)
四次揮手斷開鏈接
1.主機1(可以使客戶端,也可以是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了;
2.主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我也沒有數據要發送了,可以進行關閉連接了;
3.主機2向主機1發送FIN報文段,請求關閉連接,同時主機2進入CLOSE_WAIT狀態;
4.第主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,然后主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以后,就關閉連接;此時,主機1等待2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,主機1也可以關閉連接了。
至此,TCP的四次分手就這么愉快的完成了。
建立鏈接和斷開鏈接圖示如下:
下面來分解一下為什么是三次握手呢?
為了防止已失效的鏈接請求報文段突然又傳送到了服務器端,因而產生錯誤。舉一個“栗”子。
client發出的第一個連接請求報文段并沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段后,就誤認為是client再次發出的一個新的連接請求。于是就向client發出確認報文段,同意建立連接。假設不采用“三次握手”,那么只要server發出確認,新的連接就建立了。由于現在client并沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以為新的運輸連接已經建立,并一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。采用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由于收不到確認,就知道client并沒有要求建立連接。"
這就很明白了,防止了服務器端的一直等待而浪費資源。
那么又為什么是四次揮手呢?
TCP協議是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。TCP是全雙工模式,這就意味著,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2, 它的數據已經全部發送完畢了;但是,這個時候主機1還是可以接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,但是主機2還是可以發送數據到主機1的;當主機2也發送了FIN 報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,之后彼此 就會愉快的中斷這次TCP連接。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。
關于TCP三次握手建立鏈接與四次揮手斷開鏈接的示例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。