首先我们要了解其过程必须要了解它的6个标志位,一个Seq的序号和一个确认号
6个标志位
1.URG(紧急) 紧急指针有效,为1表示某一位需要被优先处理,用于保护TCP的连接不被种断,督促中间设备尽快处理数据 2.ACK(确认) 确认标志,表示确认收到请求 置1时表示确认号合法,为0时表示数据段中不包含确认信息,确认号被忽略。 3.PSH(传送) 数据包到达接收端后,直接发给应用程序。 4.RST(重制) 重置复位标志,用来复位那些产生错误的连接,也被用于拒绝错误和非法的数据包。 5.SYN(建立联机) 表示同步序号,用来建立连接。 6.FIN(结束) 表示发送端已经到达数据末尾,也就是说双方的数据传送完成。
序列号Seq
占4个字节,用来标记数据段的顺序,TCP把连接中的所有数据字节都编上一个序号,第一个编号就是本地随机产生,Seq就是第一个编号的序号。
确认号ack
占4个子节,期待收到对方下一个报文段的第一个数据字节的序号;确认号指的是期待接收到下一个字节的编号,因此当前报文段最后一个字节的编号+1就是确认号
当我们了解了这些标志位和这些序列号和确认号的时候,这时候我们便好理解TCP的三次握手
第一次握手: 建立连接时,客户端发送SYN包(syn=y)与序列号(seq=x)到服务器,并进入SYN_SENT状态(同步已发送)等待服务器的回复。
第二次握手: 服务器接受到来自客户端的SYN包与序列号后,必须确认客户的SYN包并回复一个确认号(ack=y+1),同时服务器自己也发一个SYN包与ACK包与序列号(syn=k ACK=1 seq=z),并进入SYN_RCVD状态(同步已接受)
第三次握手: 客户端收到服务器的SYN+ACK包后,向服务器发送确认包ACK(ack=z+1)与序号seq=x+1,此包发送完毕后,客户端与服务端进入ESTABLISHED状态(连接已建立) ,故完成TCP的三次握手。
四次挥手过程: (1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加一)此时,客户端进入FIN-WAIT-1(终止等待1)状态。
(2)服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务器就进入CLOSE-WAIT(关闭等待)状态。TCP服务区通过高层的应用程序,客户端向服务就停止,这时客户端处在半关闭状态,客户端已经没有数据要发送了,但是服务端若发送数据,这个状态要持续一段时间,也是整个CLOSE-WAIT状态的持续时间。
(3)客户端收到服务器的确认请求后,客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文。
(4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ACK=1,ack=u+1,由于客户端处于半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号seq=w,此时,服务端就进入了LAST-ACK(最后确认)状态,待客户端的确认。
(5)客户端收到服务端的连接释放报文后,必须发出确认ACK=1,ack=w+1,而自己的序列号为seq=u+1,此时,客户端进入了TIME-WAlT(时间等待)状态,注意,此时的TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
(6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次TCP连接,服务端结束TCP比客户端要早。
这就是完整的TCP的三次握手四次挥手。
|