源码地址: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