TCP是面向连接的协议,运输连接是用来传送TCP报文的。运输连接有三个阶段:连接建立、数据传输、连接释放。
TCP的连接建立:
三次握手:
图解:
A主动打开连接,B被动打开连接
第一次握手:主机A发送位码为SYN=1,随机产生seq number=x的数据包到服务器,客户端进入SYN_SEND
状态,等待服务器的确认;主机B由SYN=1知道,A要求建立联机;
第一次握手:主机B收到请求后,若同意建立连接,则向A发送确认。在确认报文段中把SYN和ACK位都置1,确认号是ack=x+1,同时随机产生序号seq=y的包,此时服务器进入SYN_RECV
状态;
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ACK是否为1,若正确,主机A确认报文段的ACK置1,确认号ack=y+1,而自己的序列号seq=x+1。主机B收到后确认seq值与ack=1则连接建立成功。客户端和服务器端都进入ESTABLISHED状态。
为什么A要再发送一次确认?主要是防止已失效的连接请求报文段突然又传到B,从而产生错误。
注意:*ACK:仅当ACK=1时确认号字段才有效,当ACK=0时确认号无效,TCP规定在连接建立后所有传送的报文段都必须把ACK置1 *SYN同步位:在连接建立是用来同步序号。当SYN=1而ACK=0事,表明这是一个连接请求报文段。若对方同意建立连接,则响应的报文段是SYN=1和ACK=1.所以SYN置1就表示这是一个连接请求或者连接接受报文。 序号:本报文段所发送的数据的第一个字节的序号。确认号:希望收到对方的下一个报文段的第一个数据字节的序号。
四次挥手:
(图)
第一次挥手:主机1(可以使客户端,也可以是服务器端),设置seq=u,将FIN
报文段置1;此时,主机1进入FIN_WAIT_1
状态;这表示主机1没有数据要发送给主机2了;
第二次挥手:主机2收到了主机1发送的FIN
报文段,立即发出确认,确认号是ack=u+1,而自己的序号为v;主机1进入FIN_WAIT_2
状态等待2发出的连接释放报文段;主机2进入CLOSE_WAIT状态。主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;但是从2到1这个方向的连接并没有关闭。
第三次挥手:主机2向主机1发送FIN
报文段,2的序号为w同时发送确认号ack=u+1,请求关闭连接,同时主机2进入LAST——ACK状态;
第四次挥手:主机1收到主机2发送的FIN
报文段,必须对此发出确认,ACK置1.确认号ack=w+1,自己的序列号为u+1,然后主机1进入TIME_WAIT
状态;,经过时间等待计时器设置的时间2MSL后,1进入CLOSED状态。2收到1的确认后同样进入CLOSED状态。