Chinaunix

标题: 关于TCP的几个问题 [打印本页]

作者: yangpinglaji001    时间: 2014-01-03 16:33
标题: 关于TCP的几个问题
最近重温UNIX网络编程,心里有几个疑惑,自己没想清楚,希望能得到朋友们的解答。

1.  TCP有重传确认、排序两个功能。
      一个分节如果没有得到确认,会重传,并阻塞后续分节的发送,如果这样,分节还有乱序?排序的功能什么场景发挥?

2. 服务端accept的过程实际跟三次握手没有任何关系(在listen允许的积压范围内,协议栈自动完成三次握手)。
      有没有办法可以在协议栈(代码)层面限制最大连接个数,甚至过滤IP(类似Iptable)?

3. 当服务端listen允许的积压连接超出后,linux会忽略后面客户端的分节,但是在linux(3.0.8)测试发现,服务端协议栈实际上会回一个SYN+ACK,导致
    超出的客户端connect成功,并能send数据,当然客户端后续的握手的ACK及数据被丢弃,导致客户端一直在重发,但是客户端应用层很可能感知不到,这样会导致客户端以为数   据发送成功,而实际上没有。
    这是不是说明TCP并没有那么可靠,应用还是必须要有自己的响应确认机制,类似MSRP封装一下。
   
作者: yangpinglaji001    时间: 2014-01-03 16:36
第三个问题是不是我的内核的问题,3.0.8. 否则按照常理,不回应客户端,让它重传SYN知道服务端accept成功岂不是更好,为什么欺骗别人呢?
作者: yangpinglaji001    时间: 2014-01-03 16:46
哟有人吗?
作者: yangpinglaji001    时间: 2014-01-03 16:58
TCP的socket大家给点意见啊
作者: csumck    时间: 2014-01-03 19:00
本帖最后由 csumck 于 2014-01-03 19:07 编辑

1.  发送方按顺序将数据包发出后,可能是乱续到达接收方的,接收方的TCP协议栈会保证按照正确的顺序向上层传输数据
2.  针对某个端口我不知道怎么设置, 不过linux的允许你对整个系统网络进行配置,楼主可以搜sysctl net.ipv4.ip_local_port_range,通过这个可以限制本地分配的端口范围,把范围搞小,自然就限制了连接数了  我这个想法错了,这个只能限制单个来源IP的,多IP这种方法是无效的。
3.  没仔细观察过,感觉楼主问的这几个问题真心不错。
作者: shan_ghost    时间: 2014-01-03 19:35
1、中间可能经过不同路由,所以先后发出的几个包未必会按次序到达

2、似乎有内核参数可调

3、这个表现似乎是网络拥塞/缓冲不足导致协议中断。如果要禁止后续链接,应该是通过icmp返回禁止链接之类信息。不过这块我不熟……
作者: linux_c_py_php    时间: 2014-01-05 10:20
TCP的send本身就不保证消息到达对面,所以写网络程序应用层的容错(超时机制)一定要到位。
作者: BlueGuy_    时间: 2014-01-05 12:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: 316953425    时间: 2014-01-09 09:54
回复 7# linux_c_py_php
还得看send是阻塞还是非阻塞吧

   
作者: 316953425    时间: 2014-01-09 09:58
回复 1# yangpinglaji001
第三个问题中的“当然客户端后续的握手的ACK及数据被丢弃”
这句话,客户端的数据是被服务器丢弃吗,如果是被服务器丢弃的话,服务器应该给回rst啊,不应该让客户端一直重传


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2