Linux 網路編程 之 TCP狀態裝換
從上面的圖中可以看出,TCP共有11狀態.由TCP發送和接收的資料有:ACK, FIN, SYN,RST.對於一個還未調用connect的client和未調用listen的server來說,它們都處於CLOSED狀態.ACK是應答資訊,任何一端(client或者server),在接收到資料(這裡的資料包括應用程式write或者TCP發出的資訊比如FIN)之後,都會發出的應答資訊.FIN是close一個socket後由TCP發出的資訊,SYN是握手資訊.RST資訊,則是client向server發送資料請求,但是server並沒有運行.則client會收到來自對方主機發送的RST資訊.
用戶端調用connect,會向server發送SYN資訊,此時client狀態有CLOSED轉變成SYN_SENT狀態.而server在調用listen之後,會由CLOSED狀態轉變成LISTEN狀態,此時,server就會一直監聽server的連接埠,接收來自client的資訊.在server接收到來自client的SYN訊號後,會向client發出一個SYN和ACK資訊,此時,server由LISTEN狀態轉變成SYN_RCVD狀態.client接收到server的SYN和ACK資訊之後,會向server回複一個ACK資訊,到此為止,client和server之間就建立起串連了.client和server的狀態都變成ESTABLISHED狀態.
在這11個狀態中,除了ESTABLISHED外,還有2個比較重要的狀態:CLOSED_WAIT和TIME_WAIT.CLOSE_WAIT狀態時有對方主動調用close,向本地(這裡本地,並不一定說的是client)發送FIN,本地接收到FIN,並向對方發送ACK之後,本地狀態會變成CLOSE_WAIT狀態.那麼,本地如果需要從CLOSE_WAIT狀態變成CLOSED狀態,需要本地向對方發送FIN,也就是需要本地主動調用close,本地進入LAST_ACK,在本地接收到ACK之後,就進入CLOSED狀態.
著作權申明:
轉載文章請註明原文出處http://blog.csdn.net/feiyinzilgd/archive/2010/09/19/5893995.aspx
並請聯絡譚海燕本人或者前往譚海燕個人首頁留言