用戶端和伺服器在使用TCP串連傳輸資料的過程中,需要經過三向交握建立串連和四次握手中斷連線操作。
具體如所示
描述了TCP串連從建立到斷開的詳細過程,以下就其中的具體報文細節展開討論。
在TCP三向交握建立串連階段,用戶端首先向伺服器發送一個SYN=1,Sequence=p的請求包。
如果伺服器同意授予用戶端該連結,則發送ACK=p+1,SYN=1,Sequence=q的回應包。
最後在用戶端收到伺服器的回應包以後,也會向伺服器發送一個回應包,具體內容為ACK=q+1,SYN=0,Sequence=p+1。
對於TCP的斷開則需要四次握手,為什麼不是三向交握呢,具體原因為:
當Server端收到Client端的SYN串連請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉串連時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回複一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
中斷連線的過程是由用戶端首先發起的,首先,用戶端會發送FIN=1,Sequence=m的中斷連線請求包。
伺服器端收到請求以後,會發送一個確認包ACK=m+1,Sequence=n。
此時,用戶端到伺服器端單方面的串連已經斷開了,用戶端不會再向伺服器端發送資料包。而伺服器還是可以向用戶端發送資料的,如果伺服器端發送s個資料包以後不需要向用戶端發送資料了,此時可以向用戶端發送中斷連線請求。FIN=1,Sequence=m+s,ACK=m+1。
用戶端收到伺服器的斷開請求以後,會發送一個確認包。Sequence=m+1,ACK=m+s+1;
注意,用戶端發送最後一次ACK包以後,還會等待2MSL(最大報文段存留時間),因為在網路中包有可能會丟失,用戶端等待2MSL的時間是擔心伺服器端沒有收到ACK包,從而重發FIN請求。
以上就介紹了TCP串連的三向交握和四次解散過程,包括了tcp串連,三向交握方面的內容,希望對PHP教程有興趣的朋友有所協助。