TCP连接建立可以总结为三次握手,TCP连接释放可以总结为四次挥手。
前言
- 客户端:主动发起请求的一端
- 服务端:被动连接的一端,服务启动后,处于
Listen状态,如nginx服务器
TCP 连接建立后,服务端和客户端可以相互发送和接受数据。
TCP 一些单词缩写说明:
SYN: synchronize表示同步序号,用来建立连接ACK: Acknowledgment NumberSEQ: Sequence NumberPACK: packetRST连接复位请求PSHPush操作,在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队FIN发送端已经达到数据末尾,双方的数据传送完成Window窗口大小,即滑动窗口,用来进行流量控制
三次握手
- 第一次握手:
客户端向服务端发送连接请求报文段,报文头:SYN=1,ACK=0,SEQ=x。请求发送后,客户端便进入SYN-SENT状态,其中SYN=1,ACK=0表示该报文为连接请求报文。其中 TCP 规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号SEQ=x中x为本次TCP通信字节流的初始序号
- 第二次握手:
服务端收到连接请求报文后,如果同意连接,会发送一个应答:SYN=1,ACK=1,SEQ=y,PACK=x+1。该应答发送完成后便进入SYN-RCVD状态SYN=1,ACK=1表示该报文为连接同意的应答报文SEQ=y表示服务端发送TCP通信字节流的初始序号PACK=x+1表示服务端希望下一个数据报发送序号(SEQ)从x+1开始的字节
- 第三次握手:当
客户端收到连接同意的应答后,还要向服务端发送一个确认报文段。该报文段的头部为:ACK=1,SEQ=x+1,PACK=y+1,其中客户端发完该报文段后进入ESTABLISHED状态服务端收到该应答后也进入ESTABLISHED状态- 此时TCP连接建立完成,服务端和客户端可以可以开始数据传输
意义
- 保证连接可信建立
- 防止因通信问题导致建立失败
- 本质:
- 网络上的传输是没有连接的,包括TCP也是一样的
- TCP所谓的
连接其实只不过是在通讯的双方维护一个连接状态,让它看上去好像有连接一样,如上面的SYN、ACK
四次挥手
连接断开时,可能是 客户端 或 服务端 发起,本示例以 客户端 发起连接断开为例:
- 第一次挥手:
客户端认为数据发送完成,需要向服务端发送连接释放请求,该请求只有报文头,内容为FIN=1,SEQ=x,此时:客户端将进入FIN-WAIT-1状态FIN=1表示该报文段是一个连接释放请求SEQ=x中x-1是客户端向服务端发送的最后一个字节的序号
- 第二次挥手:
服务端收到连接释放请求后,会通知相应的应用程序连接已经释放。此时服务端进入CLOSE-WAIT状态,并向客户端发送连接释放的应答,其报文头包含:ACK=1,SEQ=y,PACK=x+1,其中ACK=1表示应答(除TCP连接请求报文段外,TCP所有数据报中ACK=1均表示应答)SEQ=y中y-1是服务端向客户端发送的最后一个字节的序号PACK=x+1表示服务端已经成功接收了前x个字节,并希望下一个数据报发送序号(SEQ)从x+1开始的字节客户端收到该应答,进入FIN-WAIT-2状态,等待服务端发送连接释放请求- 第二次挥手完成后,
客户端到服务端方向的连接已经释放,服务端不会再接收数据,客户端也不会再发送数据。但服务端到客户端方向的连接仍然存在,服务端可以继续向客户端发送数据
- 第三次挥手:当
服务端向客户端发完所有数据后,向客户端发送连接释放请求,请求头:FIN=1,ACK=1,SEQ=y,PACK=x+1,其中服务端进入LAST-ACK状态
- 第四次挥手:
客户端收到释放请求后,向服务端发送确认应答客户端进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有服务端的重发请求的话,就进入CLOSED状态服务端收到确认应答后,也进入CLOSED状态
至此,TCP 连接释放完成。