linux下使用TCP存活(keepalive)定时器
2008-05-22 14:34
/*由
hi.baidu.com/zhihui3409
收集整理,转载时请附带
此行*/
一、什么是keepalive定时器?[
1]
在一
个空闲的(
idle
)
TCP
连接上,没有任
何的数据流,许多
TCP/IP
的初学者都对此感到惊奇。也就是说,如果
TCP
连
接两端没有任何一个进程在向对方发送数据,那么在这两个
TCP
模块之间没有任何的数据交换。你可能
在其它的网络协议中发现有轮询(
polling
),但在
TCP
中
它不存在。言外之意就是我们只要启动一个客户端进程,同服务器建立了
TCP
连接,不管你离开几小
时,几天,几星期或是几个月,连接依旧存在。中间的路由器可能崩溃或者重启,电话线可能
go down
或
者
back up
,只要连接两端的主机没有重启,连接依旧保持建立。
这就
可以认为不管是客户端的还是服务器端的应用程序都没有应用程序级(
application-level
)
的定时器来探测连接的不活动状态(
inactivity
),从而引起任何一个应用程序的终止。
然
而有的时候,服务器需要知道客户端主机是否已崩溃并且关闭,或者崩溃但重启。许多实现提供了存活定时器来完成这个任务。
存活
定时器是一个包含争议的特征。许多人认为,即使需要这个特征,这种对对方的轮询也应该由应用程序来完成,而不是由
TCP
中
实现。此外,
如果两个终端系统之间的某个中间网络上有连接的暂时中断,那么存活选项(
option
)
就能够引起两个进程间一个良好连接的终止。例如,如果正好在某个中间路由器崩溃、重启的时候发送存活探测,
TCP
就
将会认为客户端主机已经崩溃,但事实并非如此。
存活
(
keepalive
)并不是
TCP
规范的
一部分。在
Host Requirements RFC
罗列有不使用它的三个理由:(
1
)
在短暂的故障期间,它们可能引起一个良好连接(
good connection
)被释放(
dropped
),
(
2
)它们消费了不必要的宽带,(
3
)在以
数据包计费的互联网上它们(额外)花费金钱。然而,在许多的实现中提供了存活定时器。
一些
服务器应用程序可能代表客户端占用资源,它们需要知道客户端主机是否崩溃。存活定时器可以为这些应用程序提供探测服务。
Telnet
服
务器和
Rlogin
服务器的许多版本都默认提供存活选项。
个人
计算机用户使用
TCP/IP
协议通过
Telnet
登
录一台主机,这是能够说明需要使用存活定时器的一个常用例子。如果某个用户在使用结束时只是关掉了电源,而没有注
相关文档:
Unix中的函数select和poll用来,支持Unix中I/O复用的功能,在Unix中I/O模型可以分为以一几种:
(1)阻塞I/O
(2)非阻塞I/O
(3)I/O复用(select和poll)
(4)信号驱动I/O(SIGIO)
(5)异步I/O
其中,现在比较流行的I/O模型是阻塞I/O模型.阻塞I/O是当应用程序和内核交换数据时,由于内核还没有准备好 ......
< type="text/javascript"><!--
google_ad_client = "pub-3936520987820628";
//250x250, 创建于 07-12-28
google_ad_slot = "5080959190";
google_ad_width = 250;
google_ad_height = 250;
//-->
< src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javasc ......
内核启动的现在已经是开始执行函数start_kernel函数了。start_kernel函数在init/main.c中定义。start_kernel函数只是完成
相应的结构的初始化任务。
printk(KERN_NOTICE);
printk(linux_banner);
setup_arch(&command_line);
在uboot的一直过程中,uboo ......
安装程序所需要的共享库时需要注意的问题。
起因:安装libsqlite3.so.0 后,使用ldd test 时,却找不到该库文件。
在使用cpptest对原程序运行单元测试时,发现错误,即找不到库文件。
安装完libsqlite3.so.0后,其是存储在usr/local/lib的。所以问题在于,linux下的装载程序 ......