zoukankan      html  css  js  c++  java
  • 《数据通信与网络》笔记--SCTP

    SCTP(stream control transmission protocol)是一种新的可靠的,面向报文的传输层控制协议。它兼有UDP和TCP的特性,它是可靠的面向报文的协议,它保存报文的边界,同时它检测丢失的数据,重复的数据和时序的数据。它还有拥塞控制和流量控制。

    1.SCTP服务

    1.1.多流

    TCP客户端和TCP服务器的每一次连接都包含一个单一的流,这个方法存在的问题是流的任何一点丢失会阻塞其余的数据传递,但传输文本的时候,还可以接受,但是当传输的是实时数据(音视频)时,就接受不了了。SCTP在每一个连接中提供多流服务(multistream service),SCTP中称为关联。如果多流中某一个被阻塞。其余的流仍然可以传递他们的数据。

    1.2.多接口

    SCTP关联支持多接口服务(multihoming service),发送主机和接收主机对每一个关联在每一端可定义多个IP地址。在这个容错方法中,当一条通路发生故障时,可以用另一个接口不终端地传递数据。


    1.3.面向连接的服务

    SCTP是面向连接的协议,在SCTP中,连接被称为关联,站点A的进程要向站点B的进程发送或接收数据时,其步骤如下:
    1.连个SCTP彼此建立连接。
    2.双方交换数据。
    3.终止连接。

    1.4.可靠的服务

    SCTP是可靠的传输协议。它利用确认机制检测数据是否安全和可靠的到达。

    2.SCTP特性

    2.1.传输序列号

    SCTP的数据单元是数据大块(DATA chunk)。SCTP使用传输序列号(transmission sequence number,TSN)来对数据块进行编号。
    TSN所起的作用类似于TCP中的序列号,TSN是32位长,初始值可取0~2^32-1之间的随机数,每个数据大块的头部必须有相应的TSN。

    2.2流标识符

    在TCP中每一次连接只有一个流,在SCTP中,每次关联可以有多个流。因此需要用流标识符(SI)进行标识。每个数据大块的头部必须有SI。
    这样当他们到达目的端时,它可以正确地放入它的流中,SI是从0开始的16位数字。

    2.3流序列号

    当一个数据大块到达目的SCTP时,它被传递到适合的流中,并按原来序列进行排列。所以除了SI之外,SCTP还用流序列号
    (stream sequence number, SSN)对每个流中的每个数据大块进行定义。

    2.4分组

    SCTP的分组如下:


    SCTP分组和TCP段的不同:
    1.TCP中控制信息在头部,而在SCTP中,控制信息是在控制大块中的。
    2.一个TCP段中的数据作为一个实体处理,而一个SCTP分组可以携带多个数据大块,每个可能属于不同的流。
    3.选项可以是TCP段的一部分,而SCTP分组不存在选项,SCTP中的选项是由定义新的大块字节来处理的。
    4.TCP头部的强制性部分是20个字节。而SCTP头部仅是12个字节,SCTP头部较短是由于:
    a.SCTP序列号(TSN)属于每个数据大块,因此它位于数据大块的头部。
    b.确认号和窗口大小都是每个控制大块的一部分。
    c.SCTP头部的长度是固定的12个字节。因此不需要头部长度。不存在 用选项生成头部的长度。
    d.在SCTP中没有紧急指针。
    5.TCP中校验是16位,而在SCTP中是32位。
    6.SCTP中确认标签是关联的标识符。而在TCP中是没有的。TCP中的IP地址和端口地址一起定义了一个连接,
        而在SCTP中,用不同的IP地址是实现多接口,定义每个关联都需要唯一的确认标签。
    7.TCP端的头部有一个序列号,它定义了数据部分中的第一个字节编号,在SCTP分组可包含多个数据大块,
       用TSN,SI和SSN定义每个数据大块。
    8.TCP中有些段携带控制信息(SYN和FIN),它要占用一个序列号,而在SCTP中,控制大块不适用TSN,SI,
       和SSN。这三个标识符仅属于数据大块,而不是属于数据大块的。

    下面我们假定进程A用3个流发送11个报文给进程B,前面4个报文用第一个流,其次3个报文用第二个流,最后
    的4个报文用第三个流。

    3.SCTP关联

    3.1.关联建立

    SCTP的关联建立(association establishment)要求四次握手(four-way handshake)。正常的情况下,步骤如下:
    1客户端发送第一个分组,他是一个INIT大块(INIT chunk)。
    2.服务器发送第二分组,它是一个INIT ACK大块。(INIT ACK chunk).
    3.客户端发送第三个分组,它包含一个COOKIE ECHO大块(COOKIE ECHO chunk)。这是一个很简单的大块,
    它毫不改变地回应由服务器发送的cookie。
    4.服务器发送第4个分组,它包含对接受到COOKIE ECHO大块进行确认的COOKIE ACK大块。(COOKIE ACK)。

    在SCTP中可以防止TCP的SYN洪泛攻击(关于SYN洪泛攻击可以参见: http://blog.csdn.net/todd911/article/details/9877163),
    当发送方IP地址被确认时,这个策略是推迟资源分配只到接收到第3个分组:如果第一个分组的发送方式一个攻击者,那么服务器
    永远都不会接受到第3个分组,cookie丢失了,但是没有分配资源。

    3.2.数据传输

    下图,客户端发送4个DATA大块,从服务器接收两个DATA大块。


    1.客户端发送第一个分组,它携带TSN分别为7105和7106的2个DATA大块。
    2.客户端发送第二个分组,它携带TSN分别为7107和7108的两个DATA大块。
    3.第三个分组来自服务器,它包含了对收到的客户端的DATA大块进行确认所需要的SACK大块。与TCP相反,SCTP只有按顺序收到的
    最后一个TSN进行确认。而不是下一个所期待的。第三个分组还包含了TSN为121的来自服务器的第一个DATA大块。
    4.服务器发送另一个携带TSN为122的最后一个DATA大块的分组,但由于接收到来自客户端的最后的DATA大块已经被确认,所以在这个
    分组中不包含SACK大块。
    5.最后客户端发送一个分组,该分组包含了一个SACK大块,该SACK大块是对接收到来自服务器最后2个数据大块的确认。

    3.3.关联终止

    客户端和服务器的任一方都可以关闭连接,但是与TCP不同的是,SCTP不允许半关闭的情形,如果有一端关闭了,另一端必须
    停止发送新的数据,如果在终止请求队列中还有数据,那么可以将这些数据发送,并关闭关联。

    4.流量控制

    SCTP使用和TCP类似的窗口机制进行流量控制。

    5.差错控制

    SCTP使用和TCP类似的确认和重传机制来进行差错控制。

    5.1.确认

    在SCTP中,使用一个SACK大块向发送方报缺接收方缓冲区的状态。

    5.2.重发

    像TCP一样,为了控制丢失的或者丢弃的大块,SCTP使用两种策略:使用重发计时器和接收发到统一丢失大块的4个SACK。

    6.拥塞控制

    SCTP使用和TCP相同的策略进行拥塞控制。关于拥塞控制,会在以后进行说明。
  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3265229.html
Copyright © 2011-2022 走看看