1、TCP有限狀態機
其中各狀態的含義:
狀態含義closed初始狀態listen被動打開一方――監聽狀態syn_sent主動打開一方――連接建立已發送syn_rcvd被動打開一方――連接建立已接收established雙方――連接已經建立fin_wait1主動關閉一方――FIN已發送,等待確認fin_wait2主動關閉一方――確認已收到,等待對方關閉請求time_wait主動關閉一方――最後的確認已經發送,需要等待2MSLclose_wait被動關閉一方――詢問我方進程是否還有數據要發送,沒有也要發送FIN進行關閉last_ack被動關閉一方――我方的fin已經發送,想要收到你的最後的確認closing主動關閉一方――在發送完FIN之後沒有收到確認但是收到了對端的FIN
(場景:同時發送的FIN)
2、為什麼需要三次握手
1)合並了連接確認和連接請求,如圖上的2
2)最後一次的ACK,防止了已失效的連接請求報文
(client向server發送了SYN連接請求報文,但是由於鏈路問題,滯留很久,client認為這個報文丟失於是又重傳了一次;而在新連接過
程中,server收到了這個消失很久的報文,如果沒有三次握手,server就認為這是一個新連接,於是連接建立,server會向這個新連接
發送的數據都不會被client處理,server這樣就浪費了很多資源)
3、為什麼需要四次揮手
1)FIN報文和ACK報文是成對的,並且可以允許有半關閉的情況;一方關閉了自己的發送方向,不在發送數據;但是另外一方還有數據想要發送,這個時候是可以不發送FIN報文,繼續發送數據到對端,對端只不過是關閉了發送方向,接收方向依然可以接收數據
4、time_wait必須等待2MSL時間的理由
1)為了保證主動關閉一方發送的最後一個ACK報文能過到達被動關閉的一方
(因為這個報文有可能丟失,所以被動關閉的一方有可能重傳FIN報文,然後主動一方在2MSL中能收到這個重傳的報文,A在確認一次
並重啟2MSL)
2)防止“已失效的連接請求報文”,和上面的三次握手中最後一個ACK必須有的那種情況一樣,如果在2MSL中那個連接請求報文到了,我們不對這個遲到的報文做處理,讓其消失;不會讓這次釋放連接完成後,還有舊的連接請求存在。
本文出自 “momo就是辣麼萌” 博客,請務必保留此出處http://momo462.blog.51cto.com/10138434/1830226