5.為什麼關閉連線需要四次揮手?
syn(synchronous) 同時存在的,同步的, ack(acknowledgement) 確認字元如果是2次握手,那麼只要server發出確認,新的連線就建立了。但是這樣會遇到乙個新的問題?
(1)如果client傳送給server的請求是過期的請求,那當server接收到的請求的時候,可能client就不想建立連線了,此時如果只有server確認就能建立連線,顯示不行。
(2)如果server在接收到的請求後,傳送之後理論上就建立連線了,但是server傳送確認資訊,client也不一定能接收到,server不能知道是否client接收到自己的確認資訊。
第乙個包,即a傳送b的syn包中途被丟,沒有到達b
—> a會週期性超時重傳,直到收到b的確認
2.第二個包,即b發給a的syn和ack中途被丟,沒有到達a
----> b會週期性超時重傳,直到收到a的確認
3.第三個包,即a發給b的ack中途被丟,沒有到達b
–>此時a傳送完ack,單方面認為tcp已經建立了,但是b沒有認為連線建立了。
①:如果此時沒有資料傳送,b會週期性重傳syn和ack,直到收到a的ack為止
②:a傳送完ack,單方面認為連線已經建立,假定a有資料傳送,b收到a的data+ack。自然就可以建立連線了,也就可以接受data了
③:b如果有資料傳送,資料傳送不了,所以也會超時重傳syn和ack
fin(finish結束、斷開連線) ack(acknowledgement) 確認字元當a端和b端要斷開連線時,需要四次握手,這裡稱為四次揮手。
斷開連線請求可以由客戶端發出,也可以由伺服器端發出,在這裡我們稱a端向b端請求斷開連線。
四次揮手中客戶端收到伺服器的fin後,處於time_wait狀態,也叫2msl狀態 在這個狀態等候2msl時間有什麼用處呢,為什麼要等待2msl時間?1:可靠的實現tcp全雙工連線的終止
存在這種情況,如果客戶端收到伺服器的fin以後,傳送fin的ack給伺服器,但是伺服器沒有收到
這個ack,伺服器會超時傳送fin,如果客戶端不等待一段時間,將收不到重發的fin,就不會重發
ack,這樣就不能正確的關閉連線,那等待多久比較合適呢?首先伺服器有乙個超時時間,如果在這個
超時時間內,收到了客戶端的ack,就可以正常關閉,如果收不到,就會重傳fin,所以這兩段時間加起來就是
伺服器的timeout+fin的傳輸時間,為了保守起見,採用更加保守的等待時間2msl,如果2msl時間內沒有收到
伺服器的fin,那就說明伺服器端正確收到ack了,如果收到了伺服器的fin呢,就客戶端就重新傳送ack,這時候
客戶端又會等待2msl時間。
2: 允許老的重複位元組在網路中消逝。
關閉乙個tcp連線後,過段時間後用相同的位址和ip建立另乙個連線,新連線稱為老連線的
化身,因為他們的ip位址和埠號都相同,tcp必須防止來自前乙個連線的老的重複分組在該連線終止後再出現。
從而被新連線的報文,為了因對這個問題,tcp不允許處於time_wait的狀態的連線發起
新的化身。即不允許再使用處於time_wait階段的連線的ip 埠號進行連線,既然time_wait狀態的持續時間為2msl
就可以保證讓某個方向的分組最多存活msl秒就被丟棄,另乙個方向的應答報文最多存活msl秒就被丟棄,
通過實施這個規則,我們就能保證每成功建立每個tcp連線時,來自老連線老的重複分組都已經在網路中消逝了
四次揮手是tcp的半關閉造成的,所謂的半關閉就是tcp提供了連線的一端在結束他的傳送後還能接受另一端資料的能力
tcp連線時全雙工的,所以需要每個方向單獨進行關閉,那麼能將四次揮手中的第二步和第三步進行合併?這就變成了「三次揮手」了?
原因是有可能客戶端可以傳送ack的時候還需要傳送資料給客戶端,所以不能同時傳送ack和fin,只能先將ack傳送到客戶端,等服務端傳送完資料以後,再傳送fin到到客戶端
TCP IP三次握手和四次揮手
一 tcp協議 1 tcp協議是一種面向連線的 可靠的 基於位元組流的傳輸層通訊協議,採用全雙工通訊 full duplex 2 雙工通訊 full duplex 指通訊雙方都能在同一時刻進行傳送和接收操作,目前所有的交換機都支援雙工模式。3 半雙工方式 half duplex 指通訊雙方都能在同一...
TCP IP 三次握手和四次揮手
作用 建立tcp連線 1.三次握手是客戶端先發起請求到伺服器,此時伺服器處於listen監聽狀態,a會先傳送乙個連線請求的報文 syn 1,ack 0,seq x 這個包也稱為syn包,當客戶端傳送完syn包後,就進入syn sent狀態。2.伺服器b收到報文後,如果確認要與a建立tcp連線,要回覆...
TCP IP三次握手 四次揮手
一 tcp ip三次握手原理 建立連線協議 三次握手 1 客戶端向伺服器端傳送連線請求包syn syn j 等待伺服器回應 2 伺服器端收到客戶端連線請求包syn syn j 後,將客戶端的請求包syn syn j 放入到自己的未連線佇列,此時伺服器需要傳送兩個包給客戶端 1.向客戶端傳送確認自己收...