TCP(Transmission Control Protocol传输控制协议)协议的作用是为了确保数据传输的可靠性;为了更容易传送大数据,使用了字节流服务(ByteStream Service)将大块数据分割成报文段为单位的数据包进行管理和传输;而且TCP协议能够确认数据最终是否 送达到对方。
为了准确无误的将数据送达目标处,TCP采用了三次握手(three-way handshaking)的策略。用TCP协议把数据包送出去后,TCP会向对方确认数据是否送达成功。握手过程中使用了TCP的标志-----SYN(synchronize)和ACK(acknowledgement)。
三次握手的步骤:
- 服务器B处在Listen(监听)状态,等待来自客户机A的连接请求;
- 客户机A向服务器B发送连接请求报文SYN。
- 服务器B收到客户机A发来的请求报文SYN,如果同意连接,则向客户机A连接确认报文SYN ACK。
- 客户机A收到连接确认报文SYN ACK后,还要向服务器B发出确认报文ACK。
- 服务器B收到确认报文ACK后,连接建立完成。
若在握手过程中某个阶段莫名中断的话,TCP协议会再次以相同的顺序发送相同的数据包。
四次挥手:
FIN:Finish
MSL:Maximum Segment Lifetime(报文最大生存时间):它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
TIME-WAIT
客户端收到服务器端的FIN连接释放报文后进入此状态,而不是直接进入CLOSED状态,还需要等待一个时间计时器设置的时间2MSL;这么做的理由有两个:
- 确保最后一个确认报文ACK能够到达。如果服务器端没有收到客户端发来的确认报文ACK,那么需要重新发送连接释放请求报文FIN,客户端等待一段时间就是为了处理这种情况的发送。
- 等待一段时间是为了让本次连接持续时间内产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文SYN,从而错误的打开连接。
四次挥手的过程:
- 客户机A发送连接释放报文FIN。
- 服务器B收到FIN之后发出确认请求ACK,此时TCP属于半关闭状态,服务器B能向客户机A发送数据,但是客户机A不能向服务器B发送数据。
- 当服务器B不在需要连接时,发送连接释放报文FIN。
- 客户机A收到FIN后发出确认ACK,进入TIME-WAT状态,等待2倍的MSL(最大报文存活时间)后释放连接。
- 服务器B收到ACK后释放连接。
四次挥手的原因:
客户端发送了FIN连接释放报文之后,服务端收到了这个报文,就进入了CLOSE-WAIT状态。这个状态就是为了让服务器端发送还未完毕的数据,传送完毕之后,服务器端会发送FIN连接释放报文。