1. 程式人生 > >淺談TCP--三次握手及四次揮手

淺談TCP--三次握手及四次揮手

因為TCP是面向連線的,可靠流式服務,所以對於傳輸層中它是一個非常重要的協議,我們必須要掌握它。

接下來我們來看看連線過程(三次握手)及斷開連線(四次揮手)過程。

1:三次握手

連線的時候只能是客戶端主動連線伺服器,伺服器可不能請求連線客戶端(因為伺服器不會知道客戶端的IP與埠)。

首先呢我們可以看出客戶端給伺服器傳送一個連線請求SYN,然後伺服器收到這個請求,會給客戶端傳送一個SYN/ACK,表示收到請求並同意連線。然後客戶端收到之後會給伺服器傳送一個ACK確認資訊,確認自己收到了伺服器所發的訊息。

你可能就會有疑問,為什麼最後客戶端還要給伺服器傳送一個確認資訊呢,不是都連線上了嗎?為什麼要進行三次,兩次就不行嗎?兩次的確是不行的,因為TCP是可靠的傳輸,確保它可靠傳輸的一個很重要的機制就是超時重傳機制。所以,如果沒有第三次的確認,伺服器不知道是否已經連線上,他就會在一定的時間內採取超時重傳,源源不斷的給客戶端傳送。就有可能會導致伺服器傳送了很多次之後關閉,所以我們為了確保整個傳輸是可靠的,我們就必須有最後的一次確認。

2:四次揮手

斷開連線的時候,可以是客戶端發起的,也可以是伺服器發起的,我們這裡用客戶端發起斷開連線來舉例。

首先,客戶端給伺服器傳送一個FIN斷開連線請求,伺服器收到後會給客戶端傳送一個ACK,確認收到斷開連線的訊息。因為這個時候有可能伺服器還沒有處理完資料,所以他需要將資料處理完才能斷開連線。等到資料處理完,他會給客戶端傳送斷開連線的FIN訊息,然後客戶端收到後給伺服器傳送確認資訊ACK。如果沒有最後一次的確認資訊,還是和上面一樣,伺服器還是會不斷的傳送FIN訊息,所以最後一次的確認ACK絕對不能省略。但如果客戶端請求斷開的時候,伺服器端並沒有訊息要處理,那麼伺服器就會一次傳送FIN/ACK,可以省去一次,所以也有可能是三次揮手。