標籤:返回 開啟 描述符 描述 四次揮手 分享圖片 ima 情況下 函數
TCP是網際網路中的傳輸層協議,使用三向交握協議建立串連。當主動方發出SYN串連請求後,等待對方回答SYN+ACK[1],並最終對對方的 SYN 執行 ACK 確認。這種建立串連的方法可以防止產生錯誤的串連。[1]TCP三向交握的過程如下:用戶端發送SYN(SEQ=x)報文給伺服器端,進入SYN_SEND狀態。伺服器端收到SYN報文,回應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。用戶端收到伺服器端的SYN報文,回應一個ACK(ACK=y+1)報文,進入Established狀態。三向交握完成,TCP用戶端和伺服器端成功地建立串連,可以開始傳輸資料了。 tcp的三向交握
建立一個串連需要三向交握,而終止一個串連要經過四次握手,這是由TCP的半關閉(half-close)造成的。(1) 某個應用進程首先調用close,稱該端執行“主動關閉”(active close)。該端的TCP於是發送一個FIN分節,表示資料發送完畢。(2) 接收到這個FIN的對端執行 “被動關閉”(passive close),這個FIN由TCP確認。注意:FIN的接收也作為一個檔案結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其他資料之後,因為,FIN的接收意味著接收端應用進程在相應串連上再無額外資料可接收。(3) 一段時間後,接收到這個檔案結束符的應用進程將調用close關閉它的通訊端。這導致它的TCP也發送一個FIN。(4) 接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)確認這個FIN。[1]既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節。注意:(1) “通常”是指,某些情況下,步驟1的FIN隨資料一起發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合并成一個分節。[2](2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動資料是可能的,這稱為“半關閉”(half-close)。(3) 當一個Unix進程無論自願地(調用exit或從main函數返回)還是非自願地(收到一個終止本進程的訊號)終止時,所有開啟的描述符都被關閉,這也導致仍然開啟的任何TCP串連上也發出一個FIN。無論是客戶還是伺服器,任何一端都可以執行主動關閉。通常情況是,客戶執行主動關閉,但是某些協議,例如,HTTP/1.0卻由伺服器執行主動關閉。[2] tcp的四次揮手
python網路編程三向交握和四次揮手