setsocketopt函数使用的教训 linux c 语言

几天前写了个ftp作业 并不是很满意 不过学到了很多东西

为了做服务器的流量控制,尝试控制tcp传输的报文长度

本人比较笨,加之是菜鸟,manpage什么的也不懂得去看

绕了很多弯路 在此先盖个楼 考试复习无聊之余慢慢填满

在此总结下经验教训

1.使用这些函数首先要看api

setsocketopt:传送门

http://blog.csdn.net/chary8088/article/details/2486377

getsocketopt:传送门

http://blog.csdn.net/xioahw/article/details/4056514

2.不同等级的套接字选项对于套接字是否绑定有要求部分套接字必须放到blind之前 这个在manpage里边有规定

3.去manpage或者其他地方查询该项设置的省缺值和限定范围

http://www.linuxmanpages.com/

http://www.kernel.org/doc/man-pages/online/pages/man7/tcp.7.html

比如就曾经出现过如此尴尬的事情:

在manpage中规定的sndbuf的size最小为1024

使用测试代码时,本人将int size=1024负值

结论:setsocketopt参数返回0,失败

getsocketopt参数对于socket的sndbuf返回值为1024

wireshark抓包结果为系统缺省设置

结论:尽量设置在系统省缺值之外

疑问:待测试项,由于setsocketopt函数传入1024为sndbuf中理论为2048,当我设置为2048时,wireshark抓包tcp最大window结果为3k+的一个值。理论值为4096


4.关于mss与sndbuf

在测试过程中本人将mss设置为512(对于我的程序这是一个错误的未考虑tcp header 12个char 的数值)。 做内部环路测试与联机测试时,wireshark抓包结果为服务器端mss设置为512,对端为缺省设置。sndbuf理论上控制了tcp最大窗口大小,但是考虑实际情况,推测为内核分配一个指定长度的空间用于tcp接收详见5,而不是通常意义上的直接控制tcp的最大窗口大小。

疑问:根据tcp ip协议 建立连接三次握手后,是不是应该统一mss的大小和缓冲区的大小?为何实际上对端mss和window大小不变?

5关于缓冲区与mss以及tcp 最大窗口的关系

待检测

推测如下,最大窗口为mss的倍数,且小于等于内核设置的缓冲区大小。取缓冲区大小最接近的mss的整倍数。

ps:测试代码一瞥

printf("------success?:%d\n",setsockopt(socket_fd,SOL_SOCKET,SO_RCVBUF,&size,sizeof size));

printf("------success?:%d\n",setsockopt(socket_fd,SOL_SOCKET,SO_SNDBUF,&size,sizeof size));
printf("------success?:%d\n",setsockopt(socket_fd,IPPROTO_TCP,TCP_MAXSEG,&size2,sizeof size2));

printf("------success?:%d\n",setsockopt(socket_fd,IPPROTO_TCP,TCP_NODELAY,&one,sizeof one));       

2012 6 6 1:24第一次填写

2012 6 7 20:48 完成第一部分

发布了8 篇原创文章 · 获赞 0 · 访问量 5779

猜你喜欢

转载自blog.csdn.net/oe1019/article/details/7636511
今日推荐