本文主要介绍TCP的三次握手与四次挥手过程,属于是基础知识了,还不太明白这块内容的小伙伴们可以看一下。
背景知识
TCP/IP网络模型
- 网络层(IP层)时不可靠的,他不能保证网络包的交付,不保证网络包的按序交付,也不保证网络包中数据的完整性;
- 传输层的TCP协议负责保障网络数据包的可靠性,能够确保接收端的网络包时无损坏、无间隔、非冗余和按序排列的。
TCP的定义
TCP是面向连接的、可靠的、基于字节流之间的传输层通信协议。
特征 | 说明 |
---|---|
面向连接 | 一对一连接 |
可靠的 | TCP能够保证报文完整到达对端 |
基于字节流 | 不限制传输消息的大小 |
TCP头部格式
名称 | 作用 |
---|---|
序列号 | 用来解决包乱序的问题 |
确认应答号 | 用来解决丢包的问题 |
ACK | 确认应答标志位 |
RST | 连接异常标志位 |
SYN | 建立连接标志位 |
FIN | 断开连接标志位 |
TCP建立连接(三次握手)
- 服务端首先开始监听某个端口,进入LISTEN状态;
- 客户端随机初始化序列号,填入TCP头部格式中的 序列号 字段,把 SYN 字段置为1,将报文发送至服务端,向服务端发起连接,进入SYS_SENT状态;
- 服务端收到连接请求后,自己也随机初始化一个序列号,填入TCP头部格式中的 序列号 字段,其次把 确认应答号 字段填入客户端发来的序列号+1,再把 SYN 和 ACK 字段置为1,将报文发送给客户端,进入SYN_RCVD状态;
- 客户端收到服务端的反馈报文后,再向服务端发送最后一个应答报文,把 确认应答号 字段填入服务端发来的序列号+1,再把 ACK 字段置为1,将报文发送给服务端,进入ESTABLISHED状态;
- 服务端收到ACK报文后,也进入ESTABLISHED状态,至此完成三次握手过程。
TCP断开连接(四次挥手)
- 客户端准备断开连接,将TCP头部格式中的 FIN 字段置为1,向服务端发送报文,进入FIN_WAIT_1状态,此时客户端不再发送数据,但还能够接收数据;
- 服务端收到客户端发来的断开连接请求后,立刻向客户端发送ACK应答报文,进入CLOSED_WAIT状态,此时服务端可能还有数据要处理和发送;
- 客户端收到服务端的ACK应答报文后,进入FIN_WAIT_2状态;
- 服务端全部数据处理、发送完后,发送FIN报文给客户端,表示可以关闭连接,服务端进入LAST_ACK状态;
- 客户端收到服务端的FIN报文后,回复一个ACK应答报文,进入TIME_WAIT状态;;
- 服务端收到ACK应答报文后,进入CLOSE状态关,闭连接;
- 客户端在经过2MSL后,进入CLOSE状态,关闭连接,至此完成四次挥手。