一、TCP的报文格式:
序号 Seq序号,是发送端对发送数据包的标识
确认号 Ack序号,标识发送端希望接收到的下一个数据包的序号,一般Ack = Seq +1。
标志位 ACK,表示TCP数据包的确认号有效
SYN,表示该TCP数据包用于发送一个连接请求
FIN,表示该TCP数据包用于请求断开连接。
二、TCP的状态机:
LISTEN 是服务器端监听请求队列时的服务器的状态机
SYN_SENT 发送完一个连接请求后等待一个匹配的连接请求
SYN_RECEIVE 接收到连接请求并且发送了连接请求后,等待连接请求确认
ESTABLISHED 表示一个打开的连接
FIN_WAIT_1 等待远端TCP的连接终止请求,或等待之前发送的连接终止请求的确认
FIN_WAIT_2 等待远端TCP的连接终止请求
CLOSE_WAIT 等待本地用户的连接终止请求
CLOSING 等待远端TCP的连接终止请求的确认
TIME_WAIT 等待足够的时间以确保远端TCP接收到它的连接终止请求的确认
三、TCP三次握手过程与对应的状态
1、TCP三次握手的过程
第一次,建立连接时,客户端向服务器发送SYN包,并且包的序号为x。此时TCP数据包的标志位为SYN,表示发送
一个连接请求。
第二次,服务器接收到SYN包,并向服务器发送一个序号为y,确认序号为x+1的确认包。此时TCP数据包中的标志位
ACK和SYN被设置,表示服务器向客户端发送连接请求,同时希望收到客户端的应答包。
第三次,客户端收到了服务器的确认包(SYN+ACK)后,向服务器再次发送确认包ACK,序号为x+1,确认序号为
y+1。此时TCP数据包的标志位为ACK。
2、TCP三次握手中的状态机
分析:
1、建立连接之前,客户端和服务器的状态都为CLOSED
2、服务器创建socket之后开始监听,变为LISTEN
3、客户端向服务器发送连接请求发送SYN报文,客户端的状态为SYN_SENT
4、服务器接收到客户端的连接请求(SYN报文),并向客户端做出应答,发送ACK和SYN报文,此时服务器的状态
为SYN_RCVD
5、客户端收到ACK和SYN数据包,向服务器做出应答发送ACK数据包,客户机的状态变为ESTABLISHED
6、当服务器接收到客户端发送的ACK应答包之后,服务器的状态变为ESTABLISHED,到这里三次握手过程结束。
四、TCP的四次回收过程与状态机
1、TCP的四次挥手过程
第一次挥手,由客户端向服务器发送FIN报文,请求断开连接,序号为x。此时TCP数据包的标志位为FIN。
第二次,服务器向客户端发送ACK报文,表示收到了客户端发送的断开连接请求的数据包,序号为y,确认序号为x+1。
此时TCP数据包的标志位ACK被设置为1。
第三次,有服务器向客户端发送FIN包,表示服务器向客户端发送结束请求包,序号为y,确认序号为x+1。
(可以理解为现实生活中的男女朋友分手:当一方提出分手时,另一方也提出分手,表示我TM不能让你甩了我,是
我甩了你。哈哈哈,有利于理解)
第四次,由客户端向服务器发送ACK报文,表示收到服务器的结束请求包,到这里所有流程走完,服务器与客户端
正式断开连接,TCP数据包的序号为x+1,确认号为y+1.
2、TCP四次挥手状态机
由于TCP是面向连接的,全双工的,因此断开时会比连接时更加麻烦。
1、客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1
2、服务器收到FIN报文后向客户端发送ACK,服务器的状态变为CLOSE_WAIT1
3、客户端收到ACK后进入FIN_WAIT2,此时连接已经断开了一半。如果服务器还有数据发送给客户端,则会继续
发送;直到服务器向客户端发送完数据之后就会发送FIN报文,此时服务器进入LAST_ACK状态。
4、客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态。再经过一段时间之后进入
CLOSED状态。
5、服务器收到客户端的ACK进入CLOSE,到此TCP的四次挥手过程结束。
注意:
CLOSING状态表示:客户端发送了FIN,但是没有收到服务器的ACK,却收到了服务器的FIN,这种情况发生在
服务器发送的ACK丢包的时候,因为网络传输过程中也会出现意外。