閱讀330 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Linux 網絡編程 之 TCP狀態轉換

                                               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狀態.

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/09/19/5893995.aspx

並請聯係譚海燕本人或者前往譚海燕個人主頁留言

最後更新:2017-04-02 06:51:25

  上一篇:go Glib編程
  下一篇:go C/C++:如何理解複雜的聲明