TCP协议的简单理解

尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。这里的面向连接是指:两个使用TCP的应用(通常是一个客户一个服务器)在彼此交换数据之前必须先建立一个TCP连接。

TCP的主要特点

  • TCP是面向连接的运输层协议
  • 每一条TCP连接只能两个短点,每一条TCP都是点对点的
  • 提供可靠交付服务
  • 提供全双工服务
  • 面向字节流

    TCP通过下列方式来提供可靠性

  • 应用数据被分割成TCP认为最合适发送的数据块。这个UDP完全不同,应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)
  • 当TCP发出一个段之后,它将启动一个定时器,等待目的端确认收到这个报文段,如果目的端不能及时确认接收,将重发这个报文段
  • 当TCP收到发至TCP连接的另一端的数据,它将发送一个确认。
  • TCP保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果检验和有差错,TCP将丢弃这个报文段和不确认接收此报文段,并希望另一端重传此报文段。
  • 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  • 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
  • TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机缓冲区溢出。

    停止等待协议

    停止等待协议用下面的图来说明:图片来源于《计算机网络第六版》谢希仁编著
    在全双工通信的情况下,每一端既是接收方也是发送方,为方便,简化为A向B发送数据.
  1. 在无差错的情况下,A向B发送数据分组M1,发送完了就等待B的确认。B确认接收M1之后向A发送确认收到M1的数据。A收到B发送的”确认收到M1”的消息后,再向B发送下一组数据分组。
  2. 在有差错的情况下,B收到的数据分组可能是内容不对,B就把数据直接丢弃;也可能是数据分组在 传输过程中丢失了,B什么也没有接收到。这两种情况下,B什么也不操作(不通知A数据有错或者没收到数据。等到过一段时间,A没有收到B的确认消息,就认为刚刚发送的数据丢失了,然后重新传输刚才发送的分组。这要求A在每次发送一个数据分组时,都要设计一个超时计数器。
    但是要注意
    1. A在发送完一个分组后,必须暂时保留已发送的分组的副本(超时重传)。只有等到分组确认后才能清除暂时保留的副本
    2. 分组和确认分组必须都进行编号
    3. 超时及时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。
      无差错左/有差错右
  3. 确认丢失和确认迟到
    下图左边的情况是B向A发送的确认收到M1的消息丢失了。A在设定的超时重传时间内没有收到确认,但并无法知道是自己发送的分组出错、丢失,或者是B发送的确认丢失了,因此A在超时计时器到期后就要重传M1。假定B又收到了重传的分组M1.这时应采取两个行动:
    1. 丢弃这个重复的分组M1,不向上层交付。
    2. 向A发送确认,不能认为已经发送过确认就不再发送,因为A之所以重传M1就表示A没有收到M1的确认。
      下图右边的情况是传输过程中没有出现差错,但是B对分组M1的确认迟到了,A会收到重复确认,然后丢弃掉,但是这时A已经重发数据分组M1了,B收到重复的分组M1胡同样丢弃重复的分组M1,并重传确认分组。
      确认丢失左/确认迟到右

      连续ARQ协议

        滑动窗口协议比较复杂。图片来源于《计算机网络第六版》谢希仁编著
      下图a表示发送发维持的发送窗口,它的意义是:位于发送窗口内的5个分组都可以连续发送出去,而不需要等待对方确认。
      连续ARQ协议规定,发送方每收到一个确认,就把窗口向前滑动一个分组的位置,b表示发送发收到了对第一个分组的确认,于是把发送的分组向前移动一个分组的位置。
      接收方一般都是采用累计确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已经正确收到了。
      发送窗口

      滑动窗口

        TCP的滑动窗口是以字节为单位的。现在假定A收到了B发来的确认报文段,其中窗口是20,而确认号是31(这表明B期望收到的下一个序号是31,到序号30为止的数据已经收到了)。根据这两个数据,A就构造出自己的发送窗口,如下图所示
      滑动窗口
        发送窗口表示:在没有收到B的确认情况下,A可以把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。
      发送窗口里面的序号表示允许发送的序号。显然,窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,因而可能获得更高的传输效率。但是接收方必须来得及处理这些收到的数据。
      发送窗口后延的后面部分表示已发送且已收到了确认。这些数据显然不需要再保留。而发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间。
        发送窗口的位置由窗口前沿和后延的位置共同确定。发送窗口后沿的变换情况有两种可能,即不懂(没有收到新的确认)和前移(收到了新的确认)。发送窗口后沿不可能向后移动,因为不能撤销掉已收到的确认。发送窗口前沿通常是不断向前移动,但也有可能不动。这对应于两种情况:一时没有收到信的确认,对方通知的窗口大小也不变;二是收到了新的确认但对方通知的窗口缩小了,使得发送窗口前沿正好不动。发送窗口前沿也可能向后收缩,但是TCP的标准强烈不赞成这么做。

      TCP连接的建立

      假定主机A运行的是TCP客户程序,而B运行TCP服务器程序。最初两端的TCP进程都处于CLOSED(关闭)状态。如下图所示。现在A主动打开连接,而B是被动打开连接。
      三次握手
        B的TCP服务器先创建传输控制块TCB,准备接受客户程序的连接请求,然后服务器进场就处于LISTEN(监听)状态,等待客户端的连接请求。如果有,即作出响应。
        A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同部位SYN=1,同时选择一个初始序号 seq=x 。TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。
        B收到连接请求报文段后,如果同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1 ,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。
        TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍然是seq=x+1。这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
        当B收到A的确认后,也进入ESTABLISHED状态
        A最后发送一次确认主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。

      TCP连接的释放

      数据传输结束后,通信的双方都可释放连接。
      四次挥手
        现在A和B都处于ESTABLISHED状态,A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,A把连接释放报文段首部的宗旨控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个直接的序号加1.这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。
        B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收,就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一些时间。
        A收到来自B的确认后,就进图FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
        若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使用FIN=1.现在假定B的序号为w(在半关闭状态B可能又发送了一些数据),B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。
        A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1,TCP规定,前面发送的FIN报文段要消耗一个序号。然后进入到TIME-WAIT(时间等待)状态。现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED状态,时间MSL叫做最长报文段寿命。
        B只要收到了A发出的确认,就进入CLOSED状态。同样,B在撤销相应的出书控制块TCB后,就结束了这次的TCP连接。B结束TCP连接的时间要比A早一些。

      TCP有限状态机

      有限状态机
      粗实线箭头表示对客户进程的正常变迁、粗虚线箭头表示对服务器进程的正常变迁、另一种细线箭头表示异常变迁。

以上文字和图片均来自于《计算机网络第6版》谢希仁著


以上


TCP协议的简单理解
https://blog.huangyuanlove.com/2017/07/03/TCP协议的简单理解/
作者
HuangYuan_xuan
发布于
2017年7月3日
许可协议
BY HUANG兄