☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Mon Oct 24 14:09:09 2022) 提到:
[upload=1][/upload]
@wallyz
代码说话吧,server使用两个模式在两个线程发送localtime和gmttime,unordered模式总是先传完,而且不会发生阻塞。
每次测试10000条。更多也可以
unorder delivery就是种业务模式,和你说的异常处理,retransmission一毛钱关系没有。
☆─────────────────────────────────────☆
wallyz (哦) 于 (Mon Oct 24 19:50:51 2022) 提到:
既然点了我名,我就再继续回一贴,是否该删,请版主酌情处置:
为了避免帖子过长,我分开几贴回:
首先夸您一下,你的搜索能力挺好的,您的代码是从
https://blog.csdn.net/syzcch/article/details/8443043这里借的箭改造了一下,然后你加上了俩pthread_create吧?
先说一下,两个线程同时写一个socket,通常不值得鼓励,不过sctp_sendmsg实际上会调用lock_sock,所以这个实验你运气好;
如果你说你早就知道sctp_sendmsg会调用lock_sock,那我先就夸一句:您渊博
可是你设计的这个实验,能证明啥?
你在loopback上发送,根本不存在任何乱序,
你发送10000个消息,unordered的发送比ordered发送少花了几毫秒,你认为这就证明unordered能从无序传输中获益吗?
你有没有考虑是因为sctp_sendmsg本身因为SCTP_UNORDERED,少执行了几步代码,所以发送结束早了几毫秒呢?
【 在 iwannabe 的大作中提到: 】
: [upload=1][/upload]
: @wallyz
: 代码说话吧,server使用两个模式在两个线程发送localtime和gmttime,unordered模式总是先传完,而且不会发生阻塞。
: ...................
☆─────────────────────────────────────☆
wallyz (哦) 于 (Mon Oct 24 19:51:44 2022) 提到:
第二帖:
我给你把实验改造了一下:
先把你的代码改造一下:
把你的代码稍稍改造了一点点
root@ubuntu-ESXi:~/sctp# diff -Naru old/sctp-server.c sctp-server.c
--- old/sctp-server.c 2022-10-24 11:41:44.000000000 +0000
+++ sctp-server.c 2022-10-24 10:49:57.677196776 +0000
@@ -2,6 +2,10 @@
void *order_thread_func(void *args) {
+ struct timeval t1, t2;
+ double elapsedTime;
+ gettimeofday(&t1, NULL);
+
int connSock = *(int *)args;
int ret;
time_t currentTime;
@@ -12,9 +16,9 @@
currentTime = time(NULL);
/* Send local time on stream 0 (local time stream) */
snprintf( buffer, MAX_BUFFER, "%d:%s\n", id, ctime(¤tTime) );
- printf("Send Local: %s", buffer);
+ //printf("Send Local: %s", buffer);
ret = sctp_sendmsg( connSock,
- (void *)buffer, (size_t)strlen(buffer),
+ (void *)buffer, MAX_BUFFER,
NULL, 0, 0, 0, LOCALTIME_STREAM, 0, 0 );
if(ret < 0){
perror("sctp_sendmsg");
@@ -22,9 +26,18 @@
}
usleep(10);
}
+ gettimeofday(&t2, NULL);
+ elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;
+ elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;
+ printf("ordered send complete, time elapsed: %f ms\n", elapsedTime);
+
}
void *unorder_thread_func(void *args) {
+ struct timeval t1, t2;
+ double elapsedTime;
+ gettimeofday(&t1, NULL);
+
int connSock = *(int *)args;
int ret;
time_t currentTime;
@@ -37,9 +50,9 @@
snprintf( buffer, MAX_BUFFER, "%d,%s\n", id,
asctime( gmtime( ¤tTime ) ) );
- printf("Send GMT: %s", buffer);
+ //printf("Send GMT: %s", buffer);
ret = sctp_sendmsg( connSock,
- (void *)buffer, (size_t)strlen(buffer),
+ (void *)buffer, MAX_BUFFER,
NULL, 0, 0, SCTP_UNORDERED, GMT_STREAM, 0, 0 );
if(ret < 0){
perror("sctp_sendmsg");
@@ -47,6 +60,10 @@
}
usleep(10);
}
+ gettimeofday(&t2, NULL);
+ elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;
+ elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;
+ printf("unordered send complete, time elapsed: %f ms\n", elapsedTime);
}
@@ -73,6 +90,9 @@
/* Await a new client connection */
connSock = accept( listenSock,
(struct sockaddr *)NULL, (int *)NULL );
+ int nodelay = 1;
+ if (setsockopt(connSock, IPPROTO_SCTP, SCTP_NODELAY, &nodelay,
+ sizeof(nodelay)));
pthread_create(&order_thread, NULL, &order_thread_func, &connSock);
pthread_create(&unorder_thread, NULL, &unorder_thread_func, &connSock);
}
【 在 iwannabe 的大作中提到: 】
: [upload=1][/upload]
: @wallyz
: 代码说话吧,server使用两个模式在两个线程发送localtime和gmttime,unordered模式总是先传完,而且不会发生阻塞。
: ...................
☆─────────────────────────────────────☆
wallyz (哦) 于 (Mon Oct 24 20:00:41 2022) 提到:
第三贴:
我把client放在另一个机器跑,连接地址改为192.168.1.121:
root@ubuntu2:~/sctp# diff ../sctp-client.c sctp-client.c
16c16
< servaddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
---
> servaddr.sin_addr.s_addr = inet_addr( "192.168.1.121" );
然后我要开始实验了:
第一个实验:
root@ubuntu-ESXi:~/sctp# tc qdisc change dev ens33 root netem delay 50ms
root@ubuntu-ESXi:~/sctp# ./sctp-server
unordered send complete, time elapsed: 7288.581000 ms
ordered send complete, time elapsed: 7405.080000 ms
第二个实验:
root@ubuntu-ESXi:~/sctp# tc qdisc change dev ens33 root netem delay 50ms reorder 25% 50%
root@ubuntu-ESXi:~/sctp# ./sctp-server
unordered send complete, time elapsed: 17486.836000 ms
ordered send complete, time elapsed: 17689.117000 ms
我要问你问题了:
我第一个实验和第二个实验的差别仅仅是加了乱序,为什么unordered的发送所花的时间,和ordered发送所花的时间,都变长了,还都变长了基本相同的数量?
不是unordered是无序的吗?那它怎么还这么在意传输的顺序呢?和ordered相比,根本不遑多让啊
【 在 iwannabe 的大作中提到: 】
: [upload=1][/upload]
: @wallyz
: 代码说话吧,server使用两个模式在两个线程发送localtime和gmttime,unordered模式总是先传完,而且不会发生阻塞。
: ...................
☆─────────────────────────────────────☆
wallyz (哦) 于 (Mon Oct 24 20:06:42 2022) 提到:
第四贴:
我抓了实验二的pcap:
给你抓个图:
图里面wireshark的filter是筛选出来unordered并且被重传的包,你可以看到,有好多好多
那我这贴问你的问题是:
我只制造了乱序,没有制造丢包,按照你的说法,unordered的包不是不在乎顺序吗?那怎么还被重传了呢?包也没丢啊,为什么要重传?
编辑帖子补上图,刚下面回的贴不知道为何不显示
【 在 iwannabe 的大作中提到: 】
: [upload=1][/upload]
: @wallyz
: 代码说话吧,server使用两个模式在两个线程发送localtime和gmttime,unordered模式总是先传完,而且不会发生阻塞。
: ...................
☆─────────────────────────────────────☆
wallyz (哦) 于 (Mon Oct 24 20:25:04 2022) 提到:
好了,回贴结束
在你正确回答我上面两个问题之前,我不会回你任何贴
【 在 iwannabe 的大作中提到: 】
: [upload=1][/upload]
: @wallyz
: 代码说话吧,server使用两个模式在两个线程发送localtime和gmttime,unordered模式总是先传完,而且不会发生阻塞。
: ...................
☆─────────────────────────────────────☆
DreamDreams (光风霁月) 于 (Mon Oct 24 21:35:18 2022) 提到:
两位好身手,实打实的拿代码说话比空口比划强太多了。
可以为本版楷模
【 在 wallyz 的大作中提到: 】
: 标 题: Re: SCTP有序和无序传输测试代码
: 发信站: 水木社区 (Mon Oct 24 20:25:04 2022), 站内
:
: 好了,回贴结束
:
: 在你正确回答我上面两个问题之前,我不会回你任何贴
:
: 【 在 iwannabe 的大作中提到: 】
: : [upload=1][/upload]
: : @wallyz
: : 代码说话吧,server使用两个模式在两个线程发送localtime和gmttime,unordered模式总是先传完,而且不会发生阻塞。
: : ...................
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 123.168.94.*]
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Mon Oct 24 23:12:46 2022) 提到:
【 在 hgoldfish 的大作中提到: 】
: 话说这么讲。但实际工作中,又需要把流切成一个个的包。
: TCP 的几个特性:顺序、拥塞控制、差错检测,有时候我们只需要拥塞控制、差错检测
: 两个特性就够了。目前貌似没有一个协议是满足的。
是不是满足拥塞控制,差错检测?而不要求顺序?
这不正好吗?
【 在 wallyz 的大作中提到: 】
: 好了,回贴结束
: 在你正确回答我上面两个问题之前,我不会回你任何贴
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Mon Oct 24 23:13:56 2022) 提到:
我当然不是用这个证明unordered在这种情况下获益,
只是告诉你unordered delivery不是像你说的那样,只是用在异常处理,它可以用在正常
的业务逻辑当中
发信人: wallyz (哦), 信区: Programming
标 题: Re: socket多线程编程的问题
发信站: 水木社区 (Sat Oct 22 11:00:58 2022), 站内
你谈多个流里面的无序,这就是诡辩了,
实际上SCTP一个连接开几个流,在连接建立阶段就得确定好,
对于正常的应用设计,不同的session或者连接,每个都会只常驻一个流,而不会这个消
息
用这个流,下一个用另外一个流,否则就是自寻烦恼
你能说下,你实际上用SCTP设计过什么应用,或者你见过什么应用,会同一个session跨
流
乱序传输吗?
【 在 wallyz 的大作中提到: 】
: 既然点了我名,我就再继续回一贴,是否该删,请版主酌情处置:
: 为了避免帖子过长,我分开几贴回:
: 首先夸您一下,你的搜索能力挺好的,您的代码是从
https://blog.csdn.net/syzcch/a: rticle/details/8443043这里借的箭改造了一下,然后你加上了俩pthread_create吧?
: ...................
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Mon Oct 24 23:19:52 2022) 提到:
另外,你可以把order_thread屏蔽掉,单独一个Unorder_thread仍然可以传输,
也就是说,你用sctp创建一个流,同样可以做无序传输,并且可以实现拥塞控制以及错误
检测。
【 在 iwannabe 的大作中提到: 】
: 标 题: Re: SCTP有序和无序传输测试代码
: 发信站: 水木社区 (Mon Oct 24 23:13:56 2022), 站内
:
: 我当然不是用这个证明unordered在这种情况下获益,
: 只是告诉你unordered delivery不是像你说的那样,只是用在异常处理,它可以用在正
: 常
: 的业务逻辑当中
:
: 发信人: wallyz (哦), 信区: Programming
: 标 题: Re: socket多线程编程的问题
: 发信站: 水木社区 (Sat Oct 22 11:00:58 2022), 站内
:
:
: 你谈多个流里面的无序,这就是诡辩了,
:
: 实际上SCTP一个连接开几个流,在连接建立阶段就得确定好,
:
: 对于正常的应用设计,不同的session或者连接,每个都会只常驻一个流,而不会这个
: 消
: 息
: 用这个流,下一个用另外一个流,否则就是自寻烦恼
刚好我的这个程序就是一个消息一个流,你觉得是自寻烦恼吗?
:
: 你能说下,你实际上用SCTP设计过什么应用,或者你见过什么应用,会同一个session
: 跨
: 流
: 乱序传输吗?
:
:
: 【 在 wallyz 的大作中提到: 】
: : 既然点了我名,我就再继续回一贴,是否该删,请版主酌情处置:
: : 为了避免帖子过长,我分开几贴回:
: : 首先夸您一下,你的搜索能力挺好的,您的代码是从
https://blog.csdn.net/syzcch: /a
: : rticle/details/8443043这里借的箭改造了一下,然后你加上了俩pthread_create吧
: ?
: : ...................
:
: --
:
: ※ 修改:·iwannabe 于 Oct 24 23:15:05 2022 修改本文·[FROM: 120.229.14.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 120.229.14.*]
☆─────────────────────────────────────☆
wallyz (哦) 于 (Mon Oct 24 23:27:11 2022) 提到:
这个帖子又变烂了,我不想和某人来回扯了,版主来删吧
@javaboy
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Mon Oct 24 23:33:21 2022) 提到:
: SCTP第一个字是Stream,如果顺序都没了,谈什么Stream?
我猜你在因为我说粘包和neagle算法没有任何关系时,你希望用这句话来教育我,自己也
不知道sctp有unordered delivery模式吧。
然后为了这句大话,花了无数脑细胞,超了n长的rfc。
【 在 wallyz 的大作中提到: 】
: 这个帖子又变烂了,我不想和某人来回扯了,版主来删吧
: @javaboy
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Mon Oct 24 23:58:20 2022) 提到:
【 在 iwannabe 的大作中提到: 】
: 标 题: Re: SCTP有序和无序传输测试代码
: 发信站: 水木社区 (Mon Oct 24 23:19:52 2022), 站内
:
: 另外,你可以把order_thread屏蔽掉,单独一个Unorder_thread仍然可以传输,
: 也就是说,你用sctp创建一个流,同样可以做无序传输,并且可以实现拥塞控制以及错
: 误
: 检测。
:
:
:
: 【 在 iwannabe 的大作中提到: 】
: : 标 题: Re: SCTP有序和无序传输测试代码
: : 发信站: 水木社区 (Mon Oct 24 23:13:56 2022), 站内
: :
: : 我当然不是用这个证明unordered在这种情况下获益,
: : 只是告诉你unordered delivery不是像你说的那样,只是用在异常处理,它可以用在
: 正
: : 常
: : 的业务逻辑当中
: :
: : 发信人: wallyz (哦), 信区: Programming
: : 标 题: Re: socket多线程编程的问题
: : 发信站: 水木社区 (Sat Oct 22 11:00:58 2022), 站内
: :
: :
: : 你谈多个流里面的无序,这就是诡辩了,
: :
: : 实际上SCTP一个连接开几个流,在连接建立阶段就得确定好,
对了,再抓一个bug,sctp连接开几个流,在连接创立阶段并不需要指定,从代码里可以
看出,sctp_sendmsg里指定stream的id就行了。客户端会自动获取stream id。
真搞不清楚你为啥有那么大自信。
: :
: : 对于正常的应用设计,不同的session或者连接,每个都会只常驻一个流,而不会这
: 个
: : 消
: : 息
: : 用这个流,下一个用另外一个流,否则就是自寻烦恼
: 刚好我的这个程序就是一个消息一个流,你觉得是自寻烦恼吗?
:
: :
: : 你能说下,你实际上用SCTP设计过什么应用,或者你见过什么应用,会同一个
: session
: : 跨
: : 流
: : 乱序传输吗?
: :
: :
: : 【 在 wallyz 的大作中提到: 】
: : : 既然点了我名,我就再继续回一贴,是否该删,请版主酌情处置:
: : : 为了避免帖子过长,我分开几贴回:
: : : 首先夸您一下,你的搜索能力挺好的,您的代码是从
https://blog.csdn.net/syzc: ch
: : /a
: : : rticle/details/8443043这里借的箭改造了一下,然后你加上了俩pthread_create
: 吧
: : ?
: : : ...................
: :
: : --
: :
: : ※ 修改:·iwannabe 于 Oct 24 23:15:05 2022 修改本文·[FROM: 120.229.14.*]
: : ※ 来源:·水木社区 mysmth.net·[FROM: 120.229.14.*]
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 120.229.14.*]
☆─────────────────────────────────────☆
wallyz (哦) 于 (Tue Oct 25 00:21:26 2022) 提到:
你那些车轱辘话的帖子,我肯定不会回了,回了也是一滩烂泥
但是你的这个错误,我还是要指出来的:
“
sctp连接开几个流,在连接创立阶段并不需要指定,从代码里可以看出,sctp_sendmsg里指定stream的id就行了”
你的错误何在,自己看截图,同时附送一份pcap,你自己好好看一下吧,
你到底懂不懂SCTP,我觉得就算之前不了解SCTP的旁人,也已经看出来了
话到这里,我就不用你的话取笑你了。
“真搞不清楚你为啥有那么大自信。”
【 在 iwannabe 的大作中提到: 】
:
: 对了,再抓一个bug,sctp连接开几个流,在连接创立阶段并不需要指定,从代码里可以
: 看出,sctp_sendmsg里指定stream的id就行了。客户端会自动获取stream id。
: ...................
[upload=1][/upload][upload=2][/upload]
☆─────────────────────────────────────☆
wallyz (哦) 于 (Tue Oct 25 00:53:18 2022) 提到:
顺便说一嘴,我知道阁下好面子,善于用搜索现学现卖,
我可以预先模拟一下你的行为,
首先你会搜索为什么sctp default stream number 10,
于是你会见到这个链接:
https://sourceforge.net/p/lksctp/mailman/message/22144594/然后根据这个链接,你会搜sctp stream reset
然后翻上几页之后,你会见到rfc6525,
如果你要用rfc6525来给你上面的错误找个穿凿附会的理由,我不会再回复,答案我预先放在这里:请看pcap,这个实验里面没有RE-CONFIG Chunk
如果你要吹毛求疵,说,你看这不是可以动态增加stream吗?
我也不会再回复,答案我也预先放在这里了:
首先,这个是扩展,不是核心协议里面的,前面我回另一个网友说了,说到扩展我就没得说了,万物皆可扩展
其次,SCTP的stream number是个16 bits, 最多只有65536个stream,
对比一下http2, stream number 31 bits,实际上这也不够用
所以QUIC, 64 bits起,
所以这种扩展只是挣扎
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Tue Oct 25 00:57:00 2022) 提到:
我说的是stream instance,你说的是stream number,况且number并不需要在代码里指定
。
我可以在代码里直接用stream id发送和接收就可以了。
【 在 wallyz 的大作中提到: 】
: 你那些车轱辘话的帖子,我肯定不会回了,回了也是一滩烂泥
: 但是你的这个错误,我还是要指出来的:
: “
sctp连接开几个流,在连接创立阶段并不需要指定,从代码里可以
: 看出,sctp_sendmsg里指定stream的id就行了”
: ...................
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Tue Oct 25 00:59:05 2022) 提到:
很不幸,你都猜错了,我只是凭借记忆,认为sctp可以实现乱序的功能而已。
找的内容只是为了佐证这一点
实际上这也是我反驳你的主要观点。
你举了一堆例子和rfc,也圆不会你认为sctp 乱序传输不能用的错误。
【 在 wallyz 的大作中提到: 】
: 顺便说一嘴,我知道阁下好面子,善于用搜索现学现卖,
: 我可以预先模拟一下你的行为,
: 首先你会搜索为什么sctp default stream number 10,
: ...................
☆─────────────────────────────────────☆
hgoldfish (老鱼) 于 (Tue Oct 25 01:11:07 2022) 提到:
两位都是大牛,提出的材料很详实。不必互相置气。能让我这种普罗大众学到新知识真是感激万分。
【 在 iwannabe 的大作中提到: 】
: 很不幸,你都猜错了,我只是凭借记忆,认为sctp可以实现乱序的功能而已。
: 找的内容只是为了佐证这一点
: 实际上这也是我反驳你的主要观点。
: ...................
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Tue Oct 25 09:36:07 2022) 提到:
建了多少条stream,可有创建的动作?只是设置了一个值而已。
我说的是代码里的操作,明白吗?
【 在 wallyz 的大作中提到: 】
: 又来了,你嘴里的“stream instance”是什么?
: “number并不需要在代码里指定”,不代表LKSCTP没有默认值,不代表INIT和INIT_ACK
: 里面可以不带,因为它们必须带:
: The INIT chunk contains the following parameters. Unless otherwise
: ...................
☆─────────────────────────────────────☆
pangwa (学门手艺,混口饭吃.) 于 (Tue Oct 25 09:36:07 2022) 提到:
哈哈哈,确实, 看不懂, 感觉两位说的都有道理, 不过似乎在的频道不太一样...
【 在 hgoldfish 的大作中提到: 】
: 两位都是大牛,提出的材料很详实。不必互相置气。能让我这种普罗大众学到新知识真是感激万分。
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Tue Oct 25 09:43:27 2022) 提到:
【 在 wallyz 的大作中提到: 】
: 如果你觉得能用,那你就好好回答我开头的两个问题,最根本的就一个问题:
: 为什么unordered chunk会和ordered chunk一样,特别在意传输的顺序?
在意和不在意都没有区别,你就说实际应用里unordered delivery能不能用吧
还是两个问题
1、单个stream里能不能用unordered delivery
2、unordered delivery有没有实际应用场景
其实代码我不用写的,lksctp-tools里的sctp_test 和我实现的功能差不多。
-o order-pattern
0 = all unordered(default)
1 = all ordered
2 = alternating
3 = random
看看
: 不要车轱辘翻来覆去,你翻来覆去的车轱辘,我没空理
: ...................
☆─────────────────────────────────────☆
iwannabe (I wanna be) 于 (Tue Oct 25 09:45:00 2022) 提到:
你这才是车轱辘呢,不愿意正面回答问题,去扣字眼。
看到unordered transmission和delivery的争论,我就觉得好笑
【 在 wallyz 的大作中提到: 】
: 如果你觉得能用,那你就好好回答我开头的两个问题,最根本的就一个问题:
: 为什么unordered chunk会和ordered chunk一样,特别在意传输的顺序?
: 不要车轱辘翻来覆去,你翻来覆去的车轱辘,我没空理
: ...................
☆─────────────────────────────────────☆
leadu (leadu) 于 (Tue Oct 25 13:40:48 2022) 提到:
unordered reliable本身性能就是在unreliable和ordered reliable之间
wallyz上来说话太冲了,俩人顶上了。俩人聊聊也挺好,活跃一下脑细胞
【 在 pangwa 的大作中提到: 】
: 哈哈哈,确实, 看不懂, 感觉两位说的都有道理, 不过似乎在的频道不太一样...
修改:iwannabe FROM 120.229.14.*
FROM 120.229.14.*