首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

关于TCP和UDP的小疑点

2013-02-25 
关于TCP和UDP的小问题本帖最后由 cscycd1 于 2013-01-17 18:45:26 编辑TCP是安全的 需要双方确认的所以需

关于TCP和UDP的小问题
本帖最后由 cscycd1 于 2013-01-17 18:45:26 编辑 TCP是安全的 需要双方确认的   所以需要并发处理  即多客户端长连接  

1。例如     我linux服务器绑定的端口是  9000      如果一个客户机连入     那如果服务器 新开线程 去服务  那 连入的还一定是9000着个端口吗?我的意思是说  linux系统内核会不会自动将这个 9000端口 接到的东西 给新分配一个端口 去服务 例如 实际是 9000给 端口8000 去提供服务?
产生这样的疑问是因为看下面这个网站的动西
http://blog.csdn.net/guowake/article/details/6615728
Linux下高并发socket最大连接数所受的各种限制
面的系统限制。
2、修改网络内核对TCP连接的有关限制(参考对比下篇文章“优化内核参数”)
在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功建立新的TCP连接的现象。出现这种现在的原因有多种。
第一种原因可能是因为Linux网络内核对本地端口号范围有限制。此时,进一步分析为什么无法建立TCP连接,会发现问题出在connect()调用返回失败,查看系统错误提示消息是“Can’t assign requestedaddress”。同时,如果在此时用tcpdump工具监视网络,会发现根本没有TCP连接时客户端发SYN包的网络流量。这些情况说明问题在于本地Linux系统内核中有限制。[color=#FF0000][color=#FF0000]其实,问题的根本原因在于Linux内核的TCP/IP协议实现模块对系统中所有的客户端TCP连接对应的本地端口号的范围进行了限制(例如,内核限制本地端口号的范围为1024~32768之间)。当系统中某一时刻同时存在太多的TCP客户端连接时,由于每个TCP客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败[/color],并将错误提示消息设为“Can’t assignrequested address”。有关这些控制逻辑可以查看Linux内核源代码,以linux2.6内核为例,可以查看tcp_ipv4.c文件中如下函数:
static int tcp_v4_hash_connect(struct sock *sk)
请注意上述函数中对变量sysctl_local_port_range的访问控制。变量sysctl_local_port_range的初始化则是在tcp.c文件中的如下函数中设置:
void __init tcp_init(void)
内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_local_port_range = 1024 65000[/color]
主要是红色 的字体 我不理解   我在服务器 绑定一个端口!  可是每个客户端连接进来都需要占用服务器的一个本地端口我实在不理解 这中情况是在什么时候产生的?  因为 我在终端  netstat 发现 所有的客户端都是连接在9000这个我监听的端口上的 并没有用其他端口 纠结

2。udp是无连接的  那是否需要并发处理呢  ???因为 也许会有很多人同时访问的话  udp  不并发处理的话  就应该是用队列的形式吧 若人很多的话 处理的是不是会很慢???
[解决办法]
你需要了解控制端口的概念,请 wiki 一下 INAN

比较简单的例子就是回想一下 ftp passive 方式和 port 方式就明白了

udp也是一个连接,只是无握手协议,状态不可察(或者说瞬间即逝)

热点排行