首页 > 技术文章 > Tcp协议三次握手四次挥手

dump 2017-12-28 17:21 原文

一、什么是TCP

  TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。TCP在IP报文的协议号是6。 

 

二、什么是TCP链接  

  为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。

  TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。  

  当我们向服务器发送HTTP请求,获取数据、修改信息时,都需要建立TCP连接,包括三次握手,四次分手。   

 
 三、建立链接

  TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接 (也就是说三次握手之后才能够进行TCP的正式链接)  

(1)三次握手 

    三次握手(three times handshake;three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,

    根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。

  第1次

    建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
  第2次
    服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  第3次
    客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,
    完成三次握手。

 

  TCP标志位,有6种标示:

    SYN(synchronous建立联机)  ACK(acknowledgement 确认)  PSH(push传送)

    FIN(finish结束)  RST(reset重置)  URG(urgent紧急) 

    Sequence number(顺序号码) Acknowledge number(确认号码)

  完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。

 (2)四次挥手

   对于一个已经建立的连接,TCP使用改进的三次握手来释放连接(使用一个带有FIN附加标记的报文段)

   第1步

    当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。

  第2步
    主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,
    同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
  第3步  
    主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。
  第4步
    主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。
 
  至此,四次分手的流程就结束了。
  
  1、为什么要3次握手?    

    在谢希仁的《计算机网络》中是这样说的:

    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

    例子如下:

      "已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,

      以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。

      但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。

      于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。

      由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。

      但server却以为新的运输连接已经建立,并一直等待client发来数据。

      这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。

      server由于收不到确认,就知道client并没有要求建立连接。"

 

  2、为什么要4次挥手?

    TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,

    这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;

    但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,

    但是,主机2还是可以发送数据到主机1的;当主机2也发送了FIN 报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,

    之后彼此 就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

 

参考:http://network.51cto.com/art/201411/456783.htm

推荐阅读