了解TCP首先要简单了解OSI七层模型。OSI(开放系统互联)把网络通讯分为7层,即物理层、数据链层、网络层、传输层、会话层、表示层、应用层。HTTP是客户端浏览器或其他程序与web服务器之间的应用层通信协议,TCP/IP是在传输层用TCP协议的规则进行的封装,数据形式进行TCP协议的规则传输。
一、FLAGS字段标识
在TCP层,有一个FLAGS字段。这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG, ESTABLISHED, TIME_WAIT, CLOSE_WAIT。
1、SYN:同步序列编号,是TCP/IP建立使用的握手信号。
2、 ACK:表示响应
3、 FIN:表示关闭连接
4、PSH:表示有DATA传输
5、 RST: 表示连接重置
6、 ESTABLISHED:表示建立连接
7、 TIME_WAIT: 表示主动关闭,发送方会保持2MSL(多层交换)时间之后才会回到初始状态
8、 CLOSE_WAIT: 表示被动关闭
二、TCP的三次握手
1、过程
(1)首先客户端与服务端均处于未连接状态,并且客户端主动想服务器请求建立连接。
(2)客户端将报文段中的SYN=1,并选择一个seq=x(即该请求报文的序号为x),将这个报文发送到服务器。此时,客户端计入同步状态(SYN-SEND),SYN报文段不能携带数据,但要消耗掉一个序号。
(3)服务器收到请求报文后,若同意建立连接,则回复报文,SYN=1,ACK=1,并选择一个seq=y,且报文中确认号为x+1, 序号为y,此时服务器业计入同步接收状态(SYN-RCVD)。
(4)客户端收到服务端的同步确认后,对服务器发送确认的确认,将ACK=1,确认号为y+1,而报文首部的序号为x+1,将该报文发出后,客户端进入已连接状态(ESTABLISHED)。
(5)服务器收到客户端的确认后,也进入已连接状态。
2、简单的描述就是:
(1)A对B说:我的序号是x,我要向你请求连接;(第一次握手,发送SYN包,然后进入SYN-SEND状态)
(2)B听到之后对A说:我的序号是y,期待你下一句序号是x+1的话(意思就是收到了序号为x的话,即ack=x+1),同意建立连接。(第二次握手,发送ACK-SYN包,然后进入SYN-RCVD状态)
A听到B说同意建立连接之后,对A说:与确认你同意与我连接(ack=y+1,ACK=1,seq=x+1)。(第三次握手,A已进入ESTABLISHED状态)
(3)B听到A的确认之后,也进入ESTABLISHED状态。
3、使用三次握手机制的原因
客户端向服务器发送了第一条请求报文,但是该报文并未在网络中被丢弃,而是长时间阻滞在某处,而客户端收不到服务器确认,以为该报文丢失,于是重新发送该报文,这次的报文成功到达服务器,如果不使用三次握手,则服务器只需对该报文发出确认,就建立了一个连接。而在这个连接建立,并释放后,第一次发送的,阻滞在网络中的报文到达了服务器,服务器以为是客户端又重新发送了一个连接请求(实际上在客户端那里,该连接早已失效),就又向客户端发送一个确认,但客户端认为他没有发送该请求报文,因此不理睬服务器发送的确认,而服务器以为又建立了一个新的连接,于是一直等待A发来数据,造成了服务器资源的浪费,并且会产生安全隐患。因此,若使用三次握手机制,服务器发送了该确认后,收不到客户端的确认,也就知道并没有建立连接,因此不会将资源浪费在这种没有意义的等待上。
三、TCP的四次挥手(TCP连接的释放)
1、过程
(1)现假设客户端与服务器均处于连接建立状态,客户端主动断开连接
(2)客户端向服务器发送FIN报文:FIN=1,序号seq=上一个最后传输的字节序号+1=u,发送后,客户端进入FIN-WAIT-1状态。
(3)服务器接收到该报文后,发送一个确认报文:令ACK=1,确认序号ack = u+1,自己的报文序号seq=v,发送后,服务器进入CLOSE-WAIT状态。
(4)此时TCP连接进入连接半关闭状态,服务器可能还会向客户端发送一些数据。
(5)客户端收到来自服务器的确认之后,进入FIN-WAIT-2状态。等待服务器发送连接释放报文。
(6)如果服务器已经没有要发送的数据,则释放TCP连接,向客户端发送报文:令FIN=1,ACK=1,确认号ack =u+1,自己的序号seq = w(w可能等于v也可能大于v),服务器进入LAST-ACK状态。
(7)客户端收到服务器的连接释放报文后,对该报文发出确认,令ACK=1,确认号ack=w+1,自己的序号seq=u+1,发送此报文后,等待2个msl时间后,进入CLOSED状态。
(8)服务器收到客户端的确认后,也进入CLOSED状态并撤销传输控制块。客户端状态变化:未连接----->SYN-SEND----->ESTABLISHED----->FIN-WAIT-1----->FIN-WAIT-2----->TIME-WAIT----->CLOSED服务器状态变化:未连接----->SYN-RCVD----->ESTABLISHED----->CLOSE-WAIT----->LAST-ACK----->CLOSED。
2、简单描述
(1)A与B交谈结束之后,A要结束此次会话,对B说:我要关闭连接了(seq=u,FIN=1)。(第一次挥手,A进入FIN-WAIT-1)
(2)B收到A的消息后说:确认,你要关闭连接了。(seq=v,ack=u+1,ACK=1)(第二次挥手,B进入CLOSE-WAIT)
(3)A收到B的确认后,等了一段时间,因为B可能还有话要对他说。(此时A进入FIN-WAIT-2)
(4)B说完了他要说的话(只是可能还有话说)之后,对A说,我要关闭连接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次挥手)
(5)A收到B要结束连接的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手,然后A进入CLOSED)
(6)B收到A的确认后,也进入CLOSED。
四、TCP状态转换示意图