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

相关推荐
祐言QAQ8 分钟前
计算机网络之物理层——基于《计算机网络》谢希仁第八版
网络·网络协议·计算机网络
wang090717 分钟前
常用网络工具分析(ping,tcpdump等)
网络·tcpdump
真正的醒悟1 小时前
H3C交换机&路由器&防火墙FTP/TFTP服务器搭建。
服务器·网络·智能路由器
春生黎至10051 小时前
路由基本配置
网络·智能路由器
不修×蝙蝠1 小时前
Tomcat理论(Ⅰ)
java·服务器·java-ee·tomcat
望获linux1 小时前
如何在望获实时 Linux & 京博航友善 NanoPC-T6 上部署 Docker
linux·运维·服务器·docker·eureka·开源软件
wangchen_01 小时前
linux编译器和自动化构建工具(gcc与Makeile)
linux·运维·服务器
DC_BLOG2 小时前
Linux-Ansible命令
linux·运维·服务器·ansible
贩卖纯净水.2 小时前
REACT学习DAY02(恨连接不上服务器)
服务器·学习·react.js
Hacker_LaoYi2 小时前
x安全服务 y安全体系 z网络安全模型 网络安全体系设计
网络·安全·web安全