zoukankan      html  css  js  c++  java
  • 传输控制协议TCP

      传输控制协议TCP是互联网协议栈中传输层最重要的协议,也是互联网中最重要的协议。

      我们前面说过,网络层的协议都是尽最大努力交付数据,并不保证数据传输的可靠性,而数据传输的可靠性就由传输层的TCP协议来保证。

      1、TCP传输可靠性的实现

      TCP传输可靠性的实现主要由停止等待协议来完成。

      (1)停止等待协议

      TCP协议是全双工通信的,为了说明这个问题,我们假定目前只有一个发送方,一个接收方。

      首先,我们来假定发送的数据只有一个分组,传输等待协议:

      首先,发送方发送一个分组,TCP协议是字节流的,也就是按照字节为单位进行处理的。将这个分组发送到接收方,接收方接受到之后,给发送方一个确认收到信号,来确认这个分组已经收到。这是在没有出现差错的情况下。将一直按照这样下去。

      如果出现差错呢???

      假设,发送方发送了一个分组之后,一直没有收到确认信号,那么该怎么办呢???

      发送方每发送一个分组之后,就设置一个超时重传计时器,当计时器的数值超过设定的时间时,就重新向发送方发送这个分组,重新设置超时重传计时器,等待接收方的确认收到信号。

      还有一种情况,接收方接收到重复的分组时怎么办???为什么会接收到重复的分组,原因是接收方对发送方的确认信号可能在网络传输过程中丢失,或者迟到,那么发送方就会重复发送数据,因此会收到重复的分组。

      此时,接收方会丢弃收到的重复的分组,然后重新发送确认信号。

      以上就是一个分组的ARQ协议,但是我们会发现,每次发送一个分组时,信道的利用率非常低。

      因此,我们在实际中是采用连续ARQ协议,也就是我们不是一个分组一个分组地发送,而是一组分组一组分组地发送。

      我们每发送一组分组,这组分组称为发送窗口,每收到一个分组,发送窗口就向前移动一个分组。

      但在实际中,我们都是采用累积确认的方式,也就是对按序到达的分组,只发送收到的最后一个分组的确认信号。

      2、TCP可靠传输的实现

      我们前面说过,TCP协议是面向字节流的,虽然我们前面是以一个分组为单位来说明ARQ协议的,但是在发送的实际过程中,我们是以字节为单位的,也就是说实际上发送窗口和接收窗口的确认是以字节为单位进行的。

      3、TCP的流量控制

      所谓TCP的流量控制就是接收方控制发送方向网络发送数据的速率,让接收方来得及接收。

      流量控制是通过接收方来设置发送方的发送的窗口大小来实现的。TCP的窗口值是字节,而不是报文段。

      当发送方发送窗口为0时,表示发送方不再发送数据。此时就启动持续计时器,只要TCP的接受方启动零窗口通知,就启动持续计时器,每过一段时间就发送一个零窗口探测报文段。

      4、TCP拥塞控制方法

      5、TCP的连接管理

      (1)TCP的连接建立:

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


      1)第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务端,客户端进入SYN_SENT(同步已发送)状态,等待Server确认。
      2)第二次握手:服务器收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务端进入SYN_RCVD(同步收到)状态。
      (3)第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务端,服务端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED(连接建立)状态,完成三次握手,随后客户端与服务端之间可以开始传输数据了。

      四次握手只是在第二步时,服务端向客户端首先发送接收确认报文,之后再发送一次SNY报文,这称为四次握手。
      (2)TCP连接释放
      四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。

      由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
      1)第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1(终止等待1)状态。
      2)第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT(关闭等待)状态。
      3)第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK(最后确认)状态。
      4)第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT(时间等待)状态,接着发送一个ACK给服务端,确认序号为收到序号+1,服务端进入CLOSED(关闭)状态,完成四次挥手。

      客户端进入TIME_WAIT状态,等待2MSL(最长报文段寿命)时间后,再进入CLOSED状态,为什么要这么做呢???因为客户端最后给服务端的确认信号可能收不到,因此,如果服务端没有收到确认信号,那就重新上传终止报文段,等待最后确认,直到收到确认信号。

  • 相关阅读:
    4.10Python数据处理篇之Matplotlib系列(十)---文本的显示
    4.9Python数据处理篇之Matplotlib系列(九)---子图分布
    4.8Python数据处理篇之Matplotlib系列(八)---Figure的学习
    4.7Python数据处理篇之Matplotlib系列(七)---matplotlib原理分析
    4.6Python数据处理篇之Matplotlib系列(六)---plt.hist()与plt.hist2d()直方图
    4.5Python数据处理篇之Matplotlib系列(五)---plt.pie()饼状图
    4.4Python数据处理篇之Matplotlib系列(四)---plt.bar()与plt.barh条形图
    4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图
    Angular 定时器$timeout和$interval,延时调用
    javascript中top、clientTop、scrollTop、offsetTop的讲解(转载加总结)
  • 原文地址:https://www.cnblogs.com/PIRATE-JFZHOU/p/7976125.html
Copyright © 2011-2022 走看看