TCP的报文格式为:
其中有六个标记位:ACK、 SYN 、FIN、 RST、 PSH 、URG,这些标记位在TCP协议中起着很大的作用,各个标记为的值分别为0/1。
ACK包是ACK标记为1的包。SYN/ACK包是指SYN和ACK标记为均为1的包。下面列举包组合的常用用途:
SYN:同步
ACK:确认
SYN+ACK:初始化一个连接
ACK+FIN:关闭一个连接
RET:快速关闭一个连接,不需要等到对方的确认
FIN不可单独使用,否则会被认为是一个非法包。另外还有一些非法组合,例如SYN+FIN。
TCP建立连接和关闭连接过程:
状态迁移图:(只描述了正常情况下的状态迁移)
为什么会出现time_wait状态??是确保服务器端一定收到了ACK,在服务器端发送FIN后,进入到LAST_ACK转态,在它长时间等待后仍然收不到ACK包,它会认为包已经丢失,会重发FIN包。所以会设置一个等待时间2MSL以确保服务器端可以正常关闭。
参考来源:
http://blog.csdn.net/phunxm/archive/2009/12/27/5085792.aspx
http://www.hackbase.com/tech/2009-09-15/56055.html
http://lavafree.javaeye.com/blog/700885
http://tomyz0223.javaeye.com/blog/603187