Linux 下TCP连接关闭情况分析
一、TCP连接关闭的几种方式:
1、“正常”关闭:调用close()关闭socket、没close但进程正常结束(当然这是不应该的做法)、进程core掉、在shell命令行中kill掉进程,都可抽象成“正常”关闭。因为即使core掉,内核也会马上帮应用程序回收(close)socket文件描述符。
“正常”关闭,默认情况下(非默认即设置Linger下面会介绍),关闭端即客户端TCP层会发FIN包,对端即服务器TCP层收到后,回ACK,客户端进入FIN_WAIT2状态。此时,TCP终止连接的4个分组中服务器应该发的第3个分组FIN包,其TCP层是不会主动发的,只有服务器端socket“正常”关闭,才会发出这个FIN包。至此,客户端进入TIME_WAIT状态。
2、“非”正常关闭:客户端崩溃了,此时肯定发不出FIN包了(当然啦,内核都没机会帮应用程序回收资源了)。这种情况,服务器端有如下两种情况:
A、服务器send数据,因为客户端已经崩溃,服务器收不到ACK自然会不停的重传。源自
Berkeley的重传机制,重传8次,相对第一次传的15分钟后仍没收到ACK,则返回
ETIMEDOUT或EHOSTUNREAC错误。如果服务器不理会这个错误,再次调用send,则
立马返回Broken Pipe错误。
注:15分钟超时可以在 /proc/sys/net/ipv4/tcp_retries2 中修改
B、 服务器不发任何数据了,那只有靠应用层心跳检测机制或Keepalive,来发觉TCP断连了。
二、SO_LINGER套接口选项
A、l_onoff设置为0,这也是默认情况,函数close()是立即返回的,然后TCP连接双方是通过
FIN、ACK4分组来终止TCP连接的。当然,发送缓冲区还有数据的话,系统将试着将这些数据
发送到对方。
B、l_onoff非0,l_linger设置0,函数close()立即返回,并发送RST终止连接,发送缓冲区的数据丢弃。
&
相关文档:
1. 学会写简单的makefile
2. 编一些应用
程序
,可以用makefile跑起来
3. 学会写驱动
的makefile
4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world,insmod后应该能够通过dmesg看到输出
。
5. 写一完整驱动, 加上read, write, ioctl, polling等� ......
原帖见http://www.inthirties.com/thread-685-1-1.html
1、什么裸设备?字符设备?块设备?
裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被Unix/Linux通过文件系统来读取的特殊字符设备。裸设备可以绑定一个分区,也可以绑定一个磁盘。
字符设备:对字符设备的读写不需要通过OS的buffer ......
Purpose
This examples shows how to create and stop a kernel thread.
The driver is implemented as a loadable module. In the init_module() routine five kernel threads are created. This kernel threads sleep one second, wake up, print a message and fall asleep again. On unload of the module (cle ......
原文地址:http://www.xxlinux.com/linux/article/development/embed/20080227/14047.html
Linux和uClinux
Linux正逐渐地应用于嵌入式设备,uClinux正是在这种氛围下产生的。uClinux就是Micro-Control-Linux,它也是一个 ......