Unix Network Programming Episode 74

Exploring Head-of-Line Blocking

A stream in SCTP is not a stream of bytes (as in TCP), but a sequence of messages that is ordered within the association. These sub-ordered streams are used to avoid the head-of-line blocking found in TCP.

Head-of-line blocking occurs when a TCP segment is lost and a subsequent TCP segment arrives out of order. That subsequent segment is held until the first TCP segment is retransmitted and arrives at the receiver. Delaying delivery of the subsequent segment assures that the receiving application sees all data in the order in which the sending application sent it. This delay to achieve complete ordering is quite useful, but it has a downside. Assume that semantically independent messages are being sent over a single TCP connection.

复制代码
#include "unp.h"

void sctpstr_client_echoall(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)
{
    struct sockaddr_in peeraddr;
    struct sctp_sndrcvinfo sri;
    char sendline[SCTP_MAXLINE], recvline[SCTP_MAXLINE];
    socklen_t len;
    int rd_sz, i, strsz;
    int msg_flags;

    bzero(sendline, sizeof(sendline));
    bzero(&sri, sizeof(sri));
    while(fgets(sendline,SCTP_MAXLINE-9, fp)!=NULL)
    {
        strsz=strlen(sendline);
        if(sendline[strsz-1]=='\n')
        {
            sendline[strsz-1]='\0';
            strsz--;
        }
        for(i=0;i<SERV_MAX_SCTP_STRM;i++)
        {
            snprintf(sendline+strsz, sizeof(sendline)-strsz,".msg. %d",i);
            Sctp_sendmsg(sock_fd, sendline, sizoef(sendline),to, tolen,0,0,i,0,0);
        }
        for(i=0;i<SERV_MAX_SCTP_STRM;i++)
        {
            len=sizeof(peeraddr);
            rd_sz=Sctp_recvmsg(sock_fd, recvline, sizeof(recvline), (SA *)&peeraddr, &len, &sri, &msg_flags);
            printf("From str:%d seq:%d (assoc: 0X%X) :", sri.sinfo_stream, sri.sinfo_ssn, (u_int)sri.sinfo_assoc_id);
            printf("%.*s\n", rd_sz,recvline);
        }
    }
}

sctp_strcliecho

复制代码
for(i=0;i<SERV_MAX_SCTP_STRM;i++)
{
    snprintf(sendline+strsz, sizeof(sendline)-strsz,".msg. %d",i);
    Sctp_sendmsg(sock_fd, sendline, sizoef(sendline),to, tolen,0,0,i,0,0);
    snprintf(sendline+strsz, sizeof(sendline)-strsz, ".msg.%d 2",i);
    Sctp_sendmsg(sock_fd, sendline, sizeof(sendline), to, tolen, 0,0,i,0,0);
}
for(i=0;i<SERV_MAX_SCTP_STRM;i++)
{
    len=sizeof(peeraddr);

sctp_strcliecho modifications

Controlling the Number of Streams

复制代码
if(argc==2)
    stream_increment=atoi(argv[1]);
sock_fd=Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
bzero(&initm,sizeof(initm));
initm.sinit_num_ostreams=SERV_MORE_STRMS_SCTP;
Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_INITMSG, &initm,sizeof(initm));

Requesting more streams in our server

相关推荐
迎仔3 小时前
B-算力中心网络隔离的必要性:为什么必须隔离?
网络
松涛和鸣3 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
野指针YZZ4 小时前
一键配置RK3588网络与SSH远程连接
网络·ssh·rk3588
迎仔4 小时前
10-网络安全监控与事件响应:数字世界的智能监控与应急系统
网络·安全·web安全
上海合宙LuatOS4 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
深圳市恒星物联科技有限公司5 小时前
水质流量监测仪:复合指标监测的管网智能感知设备
大数据·网络·人工智能
爱吃生蚝的于勒6 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森6 小时前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
期待のcode6 小时前
Redis的主从复制与集群
运维·服务器·redis
翼龙云_cloud6 小时前
腾讯云代理商: Linux 云服务器搭建 FTP 服务指南
linux·服务器·腾讯云