如何"设置"TCP传送中的最大包长度?--using maximun packet length to test

swirl0626 2003-11-13 09:52:23
本人正在做一个测试程序,要求能够设置TCP传送中的最大包长度.

分别设定为64bytes, 128bytes, 512bytes,1024bytes,测试在不同情况下的TCP Performance.

通过查资料,了解到可以用下面这个语句来设定:
setsockopt(sock,SOL_SOCKET, SO_SNDBUF,(char *)&Length,sizeof(Length));

其中,
sock: 套接字句柄;
SOL_SOCKET: 设置的level;
SO_SNDBUF: 设置对象(发送缓冲区大小);
Length: 设定的长度值;(取地址);
sizeof(Length)): Length的长度;

本来认为通过这种设定能够使得发送方以Length长度发送数据,但是通过用Ethereal抓包发现数据包的长度都是1460(MTU),其大小根本没有因为设定改变为Length长度.

请问哪位高手碰到过类似的问题,该用什么方式来设定这个值,来达到我想要的效果??

非常感谢!!

using maximun packet length to test
...全文
1988 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
swirl0626 2003-11-18
  • 打赏
  • 举报
回复
sevencat(七猫) 说的方法肯定能做到想要的效果.但是这样一来就不会很准确.因为这样一来TCP的发送窗口大小就不能发挥作用了.不能反映网络中的实际流量状态了.

不过谢谢sevencat(七猫) 的提醒,这个也不失为一个方法.
sevencat 2003-11-17
  • 打赏
  • 举报
回复
要不要把NAGLE算法关掉。
把缓冲区大小也设为你需要的大小,
每次发送的长度也正好是你需要的大小。
这样来试试看?
swirl0626 2003-11-17
  • 打赏
  • 举报
回复
我尝试了修改MTU,但是似乎这个只是对拨号上网发生作用的方式,所以现在实在不知道怎么办了.不知道那位大侠帮忙则个?:(
swirl0626 2003-11-17
  • 打赏
  • 举报
回复
谢谢sevencat(七猫) 的热心,可是问题确依然没有解决:(
swirl0626 2003-11-14
  • 打赏
  • 举报
回复
怎么没有人讨论?
swirl0626 2003-11-14
  • 打赏
  • 举报
回复
我贴一段Linux内核原代码讲 MSS的设置,sevencat大概就会明白了.:)

另外,我刚查到WINDOWS系统下使用可更改注册表中的MSS(MUT)数值.问题在于

1.我程序要求能不断更改MSS的值来测试.如下模式能行吗?

2.我一旦修改了MTU那么它的自动协商机制是否会失效

3.最后,我改变了发送端的MSS,接收端在接收时会出现问题吗?会随着发送方的改变而改变吗?

==========================================
Linux源代码:
附Linux內核TCP_MAXSEG設置源代碼與MSDN的關於SetSockOpt的說明如下:

Linux內核TCP_MAXSEG設置源代碼:

=====

Tcp.c

int tcp_setsockopt(struct sock *sk, int level, int optname, char *optval,

int optlen)

{

struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);

int val;

int err = 0;



if (level != SOL_TCP)

return tp->af_specific->setsockopt(sk, level, optname,

optval, optlen);



if(optlen<sizeof(int))

return -EINVAL;



if (get_user(val, (int *)optval))

return -EFAULT;



lock_sock(sk);



switch(optname) {

case TCP_MAXSEG:

/* values greater than interface MTU won't take effect. however at

* the point when this call is done we typically don't yet know

* which interface is going to be used

*/

if(val < 8 || val > MAX_TCP_WINDOW) {

err = -EINVAL;

break;

}

tp->user_mss = val;

break;

.....

===

Tcp_output.c

/* If user gave his TCP_MAXSEG, record it to clamp */

if (tp->user_mss)

tp->mss_clamp = tp->user_mss;



===

Sock.h : __u16 mss_clamp; /* Maximal mss, negotiated at connection setup */


xmndragon 2003-11-14
  • 打赏
  • 举报
回复
如果是在WINDOWS系统下使用可更改注册表中的MTU数值。
sevencat 2003-11-14
  • 打赏
  • 举报
回复
不好意思,是我理解错了,楼主不是想设得很大,而是在可能的范围内测试。不好意思。没理解对。
sevencat 2003-11-14
  • 打赏
  • 举报
回复
而且TCP传送的包能超过IP的传送包吗?
可能要到IP的发送的地方去看吧。
sevencat 2003-11-14
  • 打赏
  • 举报
回复
to:swirl0626(swirl)
我不认为这段代码能说明很多问题,你可以再去看一下传送时的代码。
zhan_yonghua 2003-11-14
  • 打赏
  • 举报
回复
有没有LINUX的好书介绍两本,学会了再跟你讨论!
zhan_yonghua 2003-11-14
  • 打赏
  • 举报
回复
LINUX好玩吗?我只会WINDOWS啊!
绿青蛙 2003-11-13
  • 打赏
  • 举报
回复
在开始设置TCP/IP里面有一个IP数据包长度的设置,估计在那里面设置了IP的数据包的长度为1460。所以后面你的设置都是没有效的!自定义的TCP/IP数据格式里面这些数据包的大小我也不知道么样改变。大家共同学习嘛!
sevencat 2003-11-13
  • 打赏
  • 举报
回复
LINUX下的原代码我稍微看过的。改得小确实可以,不过能讲一下改小的原因吗?改得大的话假如大得比到时候协商的还大的话,到时候还会自动改小。而且他不完全是按照你改的值的,你设定为50,他不一定会是50。
swirl0626 2003-11-13
  • 打赏
  • 举报
回复
通过查资料了解到在Linux 环境下,可以通过setsockopt设置IPPRO_TCP层的
TCP_MAXSEG对象来改变TCP最大数据段的大小MSS.通过设置,可以用户定义的MSS传送数据.

但是MSDN中明确指出TCP_MAXSEG设置是不支持的.也就是说在Windows环境下不能通过这种方式来实现MSS的设置.

大家都知道,一般而言MSS的值是在TCP连接建立时由双方协商确定的,一般无须人为设定.可能Windows因为考虑到这个问题,因此没有支持TCP_MAXSEG.

但是目前,因为测试需要,必须改变这个值.

不知道哪位有类似经验,或者能有什么变通的方式解决这个问题呢?
flagfly 2003-11-13
  • 打赏
  • 举报
回复
你设置的是发送缓冲区的大小,1460的长度你是设置不了的,由系统设置。
flinming 2003-11-13
  • 打赏
  • 举报
回复
setsockopt这个函数看看行不行。。。。。
zhan_yonghua 2003-11-13
  • 打赏
  • 举报
回复
高手~~~~~~~~``SOCKET还能控制到的传输层去?????????????
根据TCP/IP协议,IP数据包大小是固定的,能用SOCKET设置?????????你设置的发送缓冲区吧,老大!
sevencat 2003-11-13
  • 打赏
  • 举报
回复
你自己设吗?通过路由的时候人家还是会帮你分片的。
分包一般是网上自动发现的。IP包每经过一个路由器好像就与路由器对话一下最大包长度。
1500是一般的值。去掉一些头部的话就是1460了。

不然你设置成不分片选项,但那样很有可能送不到对方。

18,358

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧