TCP和UDP的不同之处 tcp和udp概念和区别( 二 )

  • 客户端主机收到服务端主机的确认应答后,即进入 FIN-WAIT-2(终止等待2) 的状态 。等待客户端发出连接释放的报文段 。
  • 当服务器主机没有数据发送后,应用进程就会通知 TCP 释放连接 。这时服务端主机会发出断开连接的报文段,报文段中 ACK = 1,序列号 seq = w,因为在这之间可能已经发送了一些数据,所以 seq 不一定等于 v + 1 。ack = u + 1,在发送完断开请求的报文后,服务端主机就进入了 LAST-ACK(最后确认)的阶段 。
  • 客户端收到服务端的断开连接请求后,客户端需要作出响应,客户端发出断开连接的报文段,在报文段中,ACK = 1, 序列号 seq = u + 1,因为客户端从连接开始断开后就没有再发送数据,ack = w + 1,然后进入到 TIME-WAIT(时间等待) 状态,请注意,这个时候 TCP 连接还没有释放 。必须经过时间等待的设置,也就是 2MSL 后,客户端才会进入 CLOSED 状态,时间 MSL 叫做最长报文段寿命(Maximum Segment Lifetime) 。
  • 服务端主要收到了客户端的断开连接确认后,就会进入 CLOSED 状态 。因为服务端结束 TCP 连接时间要比客户端早,而整个连接断开过程需要发送四个报文段,因此释放连接的过程也被称为四次挥手 。
  • UDP 不存在这条连接,所以它也不需要四次挥手操作 。
    所以总结一点:TCP 是面向连接的,它的数据传输前需要维护一条虚拟连接,数据传输需要在这条虚拟连接上进行,数据传输完毕后需要断开这条连接,而 UDP 传输不是面向连接的,UDP 发送数据不会建立连接,也不会关心接收端的状态 。
    可靠性的差异TCP 和 UDP 一个主要拿来作对比的就是可靠性,TCP 是一种可靠性的传输层协议,UDP 是一种不可靠的传输层协议 。TCP 的这种可靠性主要由下面这些特征来保证:
    通过序列号和应答号实现可靠性
    计算机网络主机之间的相互通信非常类似于我们日常生活中两个人之间打电话,这种对话通常是一问一答形式,如果你讲了一句话并没有收到任何回应,你通常需要再说一次来确保对方是否听到,如果对方给你回应了一句话,就说明他已经听到你的讲话了,这就是一个完整的通话流程(抛开建立连接不谈,我们着重点放在建立连接之后) 。
    "对方给你的响应" 在计算机网络中被称为确认应答(ACK),TCP 就是通过 ACK 来实现可靠的数据传输,也就是说,发送方在发出请求之后会等待目标主机的响应,如果没有收到响应,发送方在经过一段时间后就会重传请求 。所以,即使在发送过程中产生丢包,TCP 仍然能够通过重传来实现可靠性 。
    TCP和UDP的不同之处 tcp和udp概念和区别


    上面描述的情况属于发送方请求丢失,还有一种情况属于响应丢失,也就是说请求发送到目标主机后,目标主机会回发 ACK 给请求方,这个 ACK 也有可能丢失,如果 ACK 在链路中丢失,一段时间后请求方没有收到目标主机的 ACK ,仍然会选择重传未收到 ACK 的这个请求 。
    TCP和UDP的不同之处 tcp和udp概念和区别


    除了消息丢失之外,还存在一种延迟到达的现象,延迟到达指的是发送方发送一个报文段之后,这个报文也许是由于网络抖动或者网络拥堵导致一个报文段迟迟没有到达目标主机,或者目标主机的响应 ACK 迟迟没有到达发送方的现象 。这个一段时间判断的标准就是重传时间,一旦过了重传时间发送方会重传报文段,很可能存在重传报文段到达之后,第一次发送的报文段才刚到的情况,这就存在一个问题:目标主机收到了两个相同的报文段 。必须选择一个报文段进行丢弃,但是应该选择哪个报文段呢?

    推荐阅读