建立TCP连接:三次握手
TCP在传输数据之前,首先需要建立好TCP连接,后续所有数据都基于这个已建立的连接来传输,建立TCP连接的过程通常被描述为三次握手
屏幕快照 2020-07-27 16.44.59
注意:广泛使用的三次握手概念并不合理,RFC文档中对建立TCP连接的过程称为three way handshark,按字面翻译,它应该被称为三路握手,对应于建立TCP连接过程中的三个包传输,应该被成为三包握手或三报文握手,而不应该是三次握手。三包握手是只有一次握手,但这次握手过程传输了三个包,从handshark是单数角度上也可以确定它只有一次握手

断开TCP连接:四次握手
建立TCP连接需要三次握手过程,在TCP连接断开(或释放)的时候则需要四次挥手的过程
屏幕快照 2020-07-27 16.46.46
在RFC793中,建议MSL设置为2分钟,但是对于现在的网络来说,2分钟的时间太长了,这意味着A在回复ACK包之后还需要等待4分钟才能真正关闭连接,实际上,是允许不同的TCP协议设置不同的MS值的。在这里,不管MSL的值具体为多少比较合适,需要关注的是为什么A在回复ACK之后不直接关闭而是需要等待2MSL时长才关闭?
这主要是为了保证A发送的最后一个ACK回复包能够被B收到。如果不等待2MSL而是直接关闭,那么B可能在超时时间内无法收到回复包,于是重传FIN+ACK包给A,但是A已经关闭了,不可能再接收到重传的包,于是最终B按照非正常状态退出连接。如果A等待一段时间,则可以保证在B重传FIN+ACK之后,A能够重新回复一个ACK包给B(A此时重设定时器为2MSL),使得B能够正常关闭连接

TCP状态机
为了更清晰的描述从建立TCP连接到释放TCP连接的过程,双方可能处于的状态,给出了TCP的有限状态和FSM(Finite State Machine)
屏幕快照 2020-07-27 16.48.36TCP三次握手和四次挥手_第1张图片
屏幕快照 2020-07-27 16.49.19
屏幕快照 2020-07-27 16.50.24TCP三次握手和四次挥手_第2张图片
屏幕快照 2020-07-27 16.51.30TCP三次握手和四次挥手