背景
tcp/ip协议中,最重要的协议莫过于面向连接的tcp协议。
- 面向连接
- 可靠传输
tcp协议解决网络的不可靠的缺点。
三次握手
参考流程图:https://www.processon.com/view/link/5d1e0c26e4b05dcb43974c77
- 客户端未连接状态,服务端处于监听状态
- 客户端发起syn握手同步请求
- 客户端改变自己的状态到SYN_SENT状态,表示自己已经发送了握手请求
- 服务端收到SYN,改变自己的状态为SYN_RECEIVED状态
- 服务端回复SYN+ACK响应,客户端变更状态为ESTABLESHED
- 客户端发起ACK,服务端变更为ESTABLISHED状态
- 客户端开始向服务端发送有效数据
三次握手的过程就是一个连接状态改变的过程,其中每一步都有可能出现丢包而导致过程中断,都会从第一步重新开始
四次挥手
参考流程图:https://www.processon.com/view/link/5d1e0c26e4b05dcb43974c77
- 发送端和接收端(这里发送端可能是客户端也可能是服务端)都处于ESTABLESHED连接状态
- 发送端发送fin包,自己改变状态为FIN_WAIT_1
- 接收端接收到fin包,改变状态为CLOSE_WAIT,并且发送ACK包
- 接收端发送ack包,发送端改变自己的状态FIN_WAIT_2
- 接收端处理还没有中断的数据传输,并且发送FIN包,改变自己的状态为LAST_ACK
- 发送端接收到FIN包,改变自己的状态为TIME_WAIT状态,并发送ACK包
- 接收端接收到ACK包,改变自己的状态CLOSED,并且不再回复
- 发送端超时没有收到其他包,认为连接已经关闭,改变自己的状态为CLOSED
我们发现,发送端最后的状态是TIME_WAIT和CLOSED,这一点在linux服务器经常会发生。例如我们执行netstat -nap,发现很多连接都是TIME_WAIT状态
,这个时候其实就是因为服务器作为发送端,终止的tcp连接。