网络学习九-SCTP

SCTP是什么?

对于传输层协议很多人都知道tcp,udp,ip协议,而很少人知道sctp(流控制传输协议)这个和上述两个协议具有相同地位的协议。
SCTP提供的服务与TCP,UDP类似,或者甚至可以理解为其是TCP与UDP协议各自优点的组合后的产物。

SCTP的特点

(1)sctp连接的建立
sctp协议建立连接可调用

int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt);
//或者直接发送消息就可建立连接
int sctp_sendmsg(int s, const void *msg, size_t len, struct sockaddr *to,
         socklen_t tolen, uint32_t ppid, uint32_t flags,
         uint16_t stream_no, uint32_t timetolive, uint32_t context);

连接过程:


Paste_Image.png

四路握手过程:
(1)客户端给服务器发送一个INIT初始化消息,消息中包含有客户端要告诉服务器自己的IP地址的清单,初始化列号(可以和TCP初始化序列一样来理解),用于表示本关联中的所有分组的其实标志,客户请求以及能够支持流的数目等
(2)服务器给客户端回一个INIT ACK来确认刚收到的消息,并且还有和刚才客户端给服务器发的所有种类的服务器自己的信息,除此之外还会还有一个状态cookie
(3)客户端收到状态cookie之后,给服务器回一个COOKIE ECHO 并且此时还可以在此数据包中包含用户数据
(4)服务器收到客户端给其发的COOKIE ECHO之后在给其发个COOKIE ACK 此时同样也可以携带数据

断开连接:

SCTP断开连接和TCP的接口相同都是调用shutdown(),但是sctp不允许半关闭的关联
其具体流程如下图

Paste_Image.png

(3)多宿主机

TCP为客户与服务器之间提供连接,从而可以使双方安全的传送数据,而SCTP将连接改为了”关联”。
SCTP的bind接口如下:

int sctp_bindx(int sockfd, struct sockaddr *my_addrs, int addrcnt, int flags);

上面给出了TCP和STCP对应的绑定套接字的接口,我们逐一的对比其参数
(1)首先二者的第一个参数sockfd含义相同,都是指待绑定的套接字
(2)bind中的参数my_addr指的是要把哪个插座(IP地址和端口号)绑定到sockfd上,这相当与给了sockfd一个身份,之后网络中就可以唯一的标识该sockfd了,而sctp_bindx中对应位置的参数名变为my_addrs,细心的读者会发现这个参数变为了复数了。没错该参数并不是单一的某个sockaddr结构体的地址,而是sockaddr结构体数组的首地址,参数addrcnt表示该数组中元素的个数。既然相比TCP的bind接口,此处为多个地址,我们也不难理解sctp_bindx所做的工作是将这些地址都绑定到sockfd上。这样其和TCP的第一个不同点就出来了。即TCP的bind之后的socket只有一个身份(只绑定了一个地址),而SCTP bind之后socket有多个身份(绑定了多个地址)。关于flags参数我们之后在补充
SCTP其对应的客户端建立连接时调用的connect接口

int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt);

可以看出SCTP在建立连接时addrs也为一个sockaddr结构体数组
那么SCTP相较TCP的绑定端口和连接时使用了地址数组有什么用意呢?没错这就是我们这里最终想要说明的其多宿主的特性。服务器调用多个地址来标识自己,客户端可以和每一个地址建立一个路径。这样当客户端的哪条路劲失效时,可以自动切换到另一条路径上,应用程序甚至都不必知道发生了故障.

(4)多流解决头端阻塞
我们知道tcp是全双工协议,但是其读写各自只有一个流,如果采用了nagle算法那么一旦一个数据传输失败,将导致后面的数据阻塞,而sctp则不同,他采用了多流的方式

Paste_Image.png

如上图所示,因为TCP每一个方向上只有一个流,那么当该流中的某个部分的报文丢失之后,其后的所有报文都只能等待丢失部分重传之后,并在重新排序之后方可被送入应用的接受缓冲区。这种协议设定对发送数据有严格顺序要求时还可以接受,但如果对发送数据没有这么强的顺序限制时就显的不那么友好了。
一个具体的场景
当我们的一个web页面要展示好多张图片时,就像上图所示。在这种情况下其实图片1到4之间到达的先后顺序是完全不影响的。此时如果你用TCP这种单项流协议,那么图片1有数据丢失,导致你因此也看不了其实已经发来的图2到图4。如果你改用SCTP这种支持多流的协议,那么你的每张图片发送都使用不同的流号,到时候,当图1对应流号的数据有丢失,那么只有这一个流会等待重传,其他几张图片都不会被其影响,这样我们就可以先看到图2到图4了,完全不受图1丢失的影响。不知道读者此时会不会感觉出来点多流在此种场景下的巨大优势

(5)面向消息

SCTP是面向消息的协议,不像TCP那样没有包的概念,也意味着消息没有边界,边界只能由应用层来设计和划分,而SCTP一个包就是一个消息,这就大大降低了编程者的难度。其次它的发送接受接口还可以传递消息类型,接口具体如下

int sctp_sendmsg(int s, const void *msg, size_t len, struct sockaddr *to,
         socklen_t tolen, uint32_t ppid, uint32_t flags,
         uint16_t stream_no, uint32_t timetolive, uint32_t context);

上述的发送接口中flags参数就是用来标识消息类型的参数。通过这样直接获取消息类型由可以减少我们不必要的拆包操作,真的是方便之极

(6)一到多特性

SCTP的一到多特性其实和UDP的套接字一样,都能通过一个套接字接受多个消息,这意味着程序员可以不用像TCP那样管理大量的套接字了

SCTP常用接口

一下接口我们都是针对一到多形式的SCTP
(1)sctp_bindx端口绑定
该接口用来命名一个套接字

int sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt, int flags);
//成功返回0,出错返回1

该接口用来给sd绑定一组地址,或从addrs地址组中添加,删除某个地址。具体操作由flags来控制,由于之前我们以介绍过其他参数,这里值介绍flags

flags
SCTP_BINDX_ADD_ADDR 往套接字里添加地址
SCTP_BINDX_REM_ADDR 从套接字中删除地址

(2)sctp_connectx函数
该接口用于与服务器建立连接

int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt);

(3)sctp_sendmsg

如果之前没有调用sctp_connectx那么第一次调用该接口既负责建立连接也负责发送数据

int sctp_sendmsg(int s, const void *msg, size_t len, struct sockaddr *to,
         socklen_t tolen, uint32_t ppid, uint32_t flags,
         uint16_t stream_no, uint32_t timetolive, uint32_t context);

前5个参数与UDP的sendto参数含义相同,我们在此只讨论后4个
ppid参数指定将随数据块传递的净荷协议
flags参数标识消息类型
stream_no参数标识具体的流号
timetolive指定消息的生命期
context保存消息传输过程中可能产生的上下文

(4)sctp_recvmsg

该接口负责接受数据

int sctp_recvmsg(int s, void *msg, size_t len, struct sockaddr *from,
         socklen_t *fromlen, struct sctp_sndrcvinfo *sinfo,
         int *msg_flags);

由于前5个参数与UDP的recvfrom相同,在此我们同样也只讨论后几个参数
sinfo保存了消息相关的细节
msg_flags和sctp_sendmsg中的flags相对应

sctp服务器
sctp客户端
单流
多流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 1.1 网络常识 1)网络的7层网络协议 ISO按照逻辑划分出来7层网络协议 应用层:和应用程序打交道的,进行数据...
    vera姐姐阅读 451评论 0 1
  • 什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Inter...
    liuboxx1阅读 945评论 0 1
  • 第8章: ssize_t recvfrom(int sockfd, void * buff, size_t nby...
    joyyou陈嘉阅读 199评论 0 0
  • socket通信原理 socket又被叫做套接字,它就像连接到两端的插座孔一样,通过建立管道,将两个不同的进程之间...
    jiodg45阅读 1,068评论 0 1
  • 一、概念 首先,理清一些概念 TCP/IP和UDP,HTTP协议,Socket 1.TCP/IP和UDP,是网络中...
    _AJH阅读 4,052评论 0 18