源碼地址:https://coding.net/u/hust_wsh/p/MyChat/githtml
源碼詳解:http://www.cnblogs.com/hust_wsh/p/5162412.htmlgit
抓包環境:Ubuntu14.04 32位+WireShark1.10.6服務器
1.客戶端鏈接服務器端——TCP 3次握手spa
因爲服務器和客戶端都在本地,因此源地址和目的地址都是127.0.0.1,可是經過info列的端口能夠分辨出來自客戶端和服務器端的包。服務器端的監聽端口是8909,客戶端發送SYN包請求創建TCP鏈接,服務器端迴應SYN和ACK包確認,客戶端收到包後進入ESTABLISHED狀態,並最後發送一個ACK包,服務器收到ACK包以後也進入ESTABLISHED狀態。.net
2.退出客戶端,中斷TCP鏈接4次揮手htm
退出客戶端時,客戶端經過關閉SocketChannel向服務器發送結束鏈接的FIN包,此時客戶端進入FIN_WAIT1狀態,服務器收到客戶端發送的FIN包發送ACK給客戶端,客戶端進入FIN_WAIT2狀態,以後服務器進入CLOSE_WAIT狀態。收到客戶端的FIN包時,read()方法會返回-1,從而能夠在服務器端經過返回值爲-1來調用SocketChannel的close方法,向客戶端返回FIN包,這時服務器端進入LAST_ACK狀態,客戶端進入了TIME_WAIT狀態,最後服務器端收到客戶端返回的ACK包後完全釋放TCP鏈接。blog
參考連接:get
1.TCP3次握手4次揮手詳解:http://www.cnblogs.com/zmlctt/p/3690998.html源碼
2.TCP3次握手4次揮手圖解:http://blog.csdn.net/whuslei/article/details/6667471it