TCP三次握手协议

    xiaoxiao2021-04-14  63

    TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。从协议分层模型方面来说,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。

    一、TCP报文格式

    TCP报文格式图如下:

    其中:

    序号:Seq,占32位,用来标识从TCP源端到目的端发送的字节流,发送方发送数据时对此进行标记。

    确认号:Ack,占32位,只有ACK标志位为1时,确认号字段才有效,Ack=Seq+1。

    标志位:共6个。即URG(紧急指针有效)、ACK(确认号有效)、PSH(接收方应该尽快将这个报文交给应用层)、RST(重置连接)、SYN(发起一个新连接)、FIN(释放一个连接)。

    二、三次握手协议

    所谓三次握手,即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个TCP报文以确认连接的建立。

                                                

    第一次握手:客户端将SYN标志位置1,随机产生一个值Seq=j,并将该数据包发送给服务器,随即进入SYN_SENT状态,等待服务器确认。

    第二次握手:服务器收到数据包后由SYN=1知道客户端请求建立连接,将客户端的请求包放入自己的未连接队列,接着服务器将标志位SYN和ACK都置1,Ack=j+1,随即产生一个值Seq=k,并将该数据包发送给客户端确认连接请求,服务器进去SYN_RCVD状态。(ACK=1向客户端标明自己收到其连接请求。SYN=1询问客户端是否已经准备好建立连接进行数据通信)。

    第三次握手:客户端收到确认后,检查Ack是否为j+1,ACK是否为1。如果是,则将标志位ACK置1,Ack=k+1,并将该数据包发送给服务器。服务器接收到后检查Ack是否为k+1,ACK是否为1。如果是则表示连接建立成功。客户端与服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器之间可以开始传输数据了。

    三、为什么不能只有两次握手

    三次握手的目的是为了解决网络中存在延迟的重复分组问题。

    谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段。但服务器收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送数据。但服务器却以为新的传输连接已经建立,并一直等待客户端发来数据。这样,服务器的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,客户端不会向服务器的确认发出确认。服务器由于收不到确认,就知道客户端并没有要求建立连接。”

    四、第四次挥手

    所谓四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。

     由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,另一方收到一个FIN只是意味着一个方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到另一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,

    第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIR_1状态。

    第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认号为序号+1.服务器端进入CLOSE_WAIT状态。

    第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器端进去LAST_ACK状态。

    第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器,确认号为序号+1。服务器收到ACK后,进去CLOSED状态,完成四次挥手。

    上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:

    转载请注明原文地址: https://ju.6miu.com/read-670183.html

    最新回复(0)