TCP运输管理分为三个阶段
建立连接
数据传送
断开连接
TCP的建立连接过程是采用CS模式的,假设C是客户端发起请求,S是服务端等待连接
S端的TCP进程被动的打开等待连接,C端的TCP进程主动打开,发送请求
首先S的TCP服务器进程先创建传输控制块TCB,然后就处于LISTEN状态;C的TCP客户进程也创建传输控制块TCB,然后向S发送请求。
SYN是TCP首部的码元比特中的一个位,用来连接建立是的同步序号,ACK是在连接时的确认号,就是说没有连接的时候ACK=0,当建立连接后所有的ACK=1;当SYN=1而ACK=0的时候表示是一个连接请求。
第一次握手:首先C发送请求报文,首部中的SYN=1,同时为自己选择一个初始序号seq=x,SYN报文段不能携带数据,但是消耗一个序列号,TCP客户进程进入SYN-SENT(同步已发送)状态。
第二次握手:S收到请求后,如果同意建立连接,则向S发送确认,也就是响应报文,这个时候需要SYN=1,ACK=1,确认号是seq=x+1,同时也为自己选择一个初始序号seq=y;这个报文也不携带数据,但是消耗一个序列号,TCP服务器进程进入SYN-RCVD(同步收到)状态。
第三次握手:TCP客户进程收到S的确认后,还要向S发送确认,确认报文段的ACK=1,确认号ack=y+1;而自己的确认号seq=x+1;这个报文段可以携带数据,但是如果不携带的话,下一个数据报的序号仍然是seq=x+1;这是TCP连接建立,C进入ESTABLISHED(已建立连接)状态,同时在S收到A的确认后也进入ESTABLISHED(已建立连接)状态。
为什么要采用三次握手而不是两次?
如果C向S放松一个请求连接报文,如果这个请求报文在网络中停滞了,所以超过了超时等待后,C会向S再次发送一个请求报文,假设当本次连接释放后,停滞的请求到达了S,S则误以为又是一次新的连接请求,于是发送一个响应,若不采用三次握手,而是两次,这个时候S就认为已经建立了连接,但是C并没有数据要发送,所以白白浪费了S的资源。