TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的家里和释放是每一次面向连接的通信中必不可少的过程。因此,运输连接就有三个阶段,即:连接建立、数据传输和连接释放。
TCP位于传输层,提供可靠的字节流服务。
所谓字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理,而可靠的传输服务是指,能够把数据准确可靠的传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否发送达到对方。
为了准确无误地将数据送给对方,TCP协议采用三次握手(three-way handshaking)策略。用TCP协议把数据包发送出去后,TCP不会对传输后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中采用TCP的标志(flag)—-SYN(synchronize)和ACK(acknowledgement)
请注意:发送端A主动打开连接,而B是被动打开连接。
三次握手传送的内容:
- 第一次
第一次握手:建立连接时,客户端A向服务端B发送请求报文段,这时首部中的同步位SYN =1,同时选择一个初始序号seq= x.TCP规定SYN=1报文段不能携带数据,但是要消耗一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态,等待服务器确认。
- 第二次
第二次握手:服务器收到请求报文后,如同意连接,则向A发送确认,同时自己也发送一个确认报文段,确认报文段中SYN和ACK都置1,确认号ack = x+1,同时自己也为自己选择一个初始序号seq =y。注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。
- 第三次
第三次握手:客户端A收到B的确认后,还要向B给出确认报文段。确认报文段的ACK=1,确认号ack =y+1,而自己的序号seq=x+1.此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
为什么客户端A还要发送一次确认呢?主要是为了防止已失效的连接请求报文段突然又传送到了服务端B,因而产生错误。