SO_LINGER

此选项指定函数close对面向连接的协议如何操作(如TCP)。缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。

SO_LINGER选项用来改变此缺省设置。使用如下结构:

struct linger {

int l_onoff;

int l_linger;

};

有下列三种情况:

l_onoff为0,则该选项关闭,l_linger的值被忽略,等于缺省情况,close立即返回;

l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;

l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0)或(b)延迟时间到。此种情况下,应用程序检查close的返回值是非常重要的,如果在数据发送完并被确认前时间到,close将返回EWOULDBLOCK错误且套接口发送缓冲区中的任何数据都丢失。close的成功返回仅告诉我们发送的数据(和FIN)已由对方TCP确认,它并不能告诉我们对方应用进程是否已读了数据。如果套接口设为非阻塞的,它将不等待close完 成。

l_linger的单位依赖于实现,4.4BSD假设其单位是时钟滴答(百分之一秒),但Posix规定单位为秒。

测试发现:

客户端connect之后,set linger,模拟一个夭折的连接(是不是set linger,并没有导致客户端发送RST?也就是不存在夭折连接?),linux服务器段照样会accept接受下来,再监听该端口,会产生读取EOF的行为。这个和steven描述的其他系统的处理不一致!

如果通过设置SO_LINGER,close时会发出RST,而不是上面的正常结束.网上都说不推荐使用.原因有二: (a)有些系统未实现;(b)TIME_WAIT很重要,因为网络上可能还有数据在传送,而若此sock的替身出现,会收到不该收的包.

apche 实现关闭,不用设置SO_LINGER实现,如下:

是否应该在这先setsockopt(linger)?这个应该先设置?以便后面超时调用close时产生RST?去掉TIME_WAIT状态?

参见lamp.linux.gov.cn/Apache/ApacheMenu/misc/perf-tuning.html

shutdown(s,1);关闭写端,产生FIN的发送,(正常对方会读取到EOF),进入FIN_WAIT2状态

alarm(2);设置2s的超时,等待读取客户端数据,

read数据;读到0字节,表示对方放送FIN,

close;超时,强制关闭,否则,正常关闭。

以下为另外一篇文章:

setsockopt的调用将依上面结构的两个值产生三种情况的某一种
1。如果l_onoff是0,选项被关闭。l_linger的值被忽略且前面讨论的TCP缺省设置生效,close立即返回。
2。如果l_onoff非0,且l_linger为0,那么当套接口关闭时TCP夭折连接。TCP将丢弃保留的套接口发送缓冲区的任何数据并发送一个 RST给对方,而不是通常的四分组连接终止序列。这避免了TCP的TIME_WAIT状态,但这样做也会有以下可能性。但这样做也会有以下可能性:在 2MSL妙内创建此连接的令一个化身,并使得老的来自刚被终止的连接上的重复分节不正确地传递到新的化身上。
     有些实现,尤其是solaris。不实现SO_LINGER选项的这个特性。TIME_WAIT状态是我们的朋友,它是有助于我们的(也就是说,使旧的重复分节在网络中超时消失)。不要试图避免这个状态。
3,如果l_onoff和l_linger都为非0。那么当套接口关闭时内核将拖延一段时间。也就是说,如果在发送缓冲区中仍有数据。进程将处于睡眠状 态,一直到(a)所有数据都已发送完且均被对方确认或(b)延滞时间到。如果套接口被设置为非阻塞型。它将不等待close完成,即使延滞时间为非0也是 如此。当使用SO_LINGER选项的这个特性时,应用进程检查close的返回值是非常重要的,因为,如果在数据发送完并被确认前延滞时间到的话, close将返回EWOULDBLOCK 错误且套接口发送缓冲区中的任何数据都丢失。
      第三种情况中对成员l_linger非0的解释是依赖不同的实现的。4.4BSD假设其单位是时钟滴答(一百分之一秒),但posix.1g规定其单位为 秒。现有的源自Berkeley的实现的另一个问题是成员l_linger(一个整数)是拷贝到16位的带符号整数内核变量so_linger上的,这就 限制了延滞时间最大为32767时钟滴答即327.67秒。

在HTTP应用中,存在一个问题,SERVER由于某种原因关闭连接,如KEEPALIVE的超时,这样,作为主动关闭的SERVER一方就会进入 FIN_WAIT2状态,但TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不象TIME_WAIT状态),所以如果CLIENT不关 闭,这个FIN_WAIT_2状态将保持到系统重新启动,越来越多的FIN_WAIT_2状态会致使内核crash

chdonald 回复于:2003-07-11 12:30:51

产生原因: 
1。常连接并且当连接一直处于IDLE状态导致SERVER CLOSE时,CLIENT编程缺陷,没有向SERVER 发出FIN和ACK包 
2。APACHE1.1和APACHE1.2增加了linger_close()函数,前面的帖子有介绍,这个函数可能引起了这个问题(为什么我也不清楚)

解决办法: 
1。对FIN_WAIT_2状态增加超时机制,这个特性在协议里没有体现,但在一些OS中已经实现 
如:LINUX、SOLARIS、FREEBSD、HP-UNIX、IRIX等 
2。不要用linger_close()编译 
3。用SO_LINGER代替,这个在某些系统中还能很好地处理 
4。增加用于存储网络连接状态的内存mbuf,以防止内核crash 
5。DISABLE KEEPALIVE

tcp 选项:SO_LINGER祥解(转)相关推荐

  1. #TCP/IP# TCP头部选项功能详解

    简单回顾下TCP报文格式 1)TCP报文:由 TCP首部 和 TCP数据 组成. 2)TCP首部:由 20字节的固定长度 和 可变长字段(选项和填充)组成. 3)TCP首部总长度:由TCP头中的&qu ...

  2. nginx配置文件祥解

    nginx配置文件祥解 nginx配置说明---------------------------- #运行用户 user  www www; #启动进程 worker_processes  2; #一 ...

  3. Linux如何关机与关机命令祥解

    Linux关机命令祥解 1.直接关电源 2.init 0 3.telinit 0 4.shutdown -h now 5.halt 6.poweroff 1.shutdown shutdown命令安全 ...

  4. 套接字选项SO_LINGER

    在说明套接字选项SO_LINGER之前,我们来先看一个问题.如果发送缓冲区中还有数据没有发送到对方协议栈,此时close发送端的socket会发生什么,下面代码给出答案. 服务端: #include ...

  5. 4-4:TCP协议之TCP头部格式详解

    文章目录 一:TCP头部格式详解 (1)4位首部长度 (2)序列号和确认应答号 A:可靠性问题 B:32位序号和确认号 (3)窗口大小 (4)标志位 (5)紧急指针 A:带外数据(out_of _ba ...

  6. tcpdump 命令祥解

    NAME        tcpdump - 转储网络上的数据流 总览 (SYNOPSIS)        tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F f ...

  7. 《TCP IP协议 详解》思考总结 · 三

    前言 这一篇文章主要围绕了IP协议,ICMP协议和UDP协议展开,希望可以在这里大概做一个总结,将<TCP/IP协议详解 卷一>书中TCP相关章节前面的内容做一个结束,在下一篇文章专心的去 ...

  8. 转载批处理之FOR语句祥解

    批处理之FOR语句祥解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN ...

  9. 批处理之FOR语句祥解

    批处理之FOR语句祥解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN ...

最新文章

  1. 【zookeeper+Dubbo】Dubbo与SpringBoot整合的三种方式
  2. return 和 exit
  3. win10 sshsecureshellclient删除profile保存的信息
  4. 创建和使用约束Constraint
  5. 【hihocoder 1554】最短的 Nore0061
  6. Windows XP Embedded SP2 + 简体中文语言包
  7. html点击图片局部放大,鼠标单击实现放大镜图片局部放大效果
  8. MySQL查询数据库日志的查询
  9. sql server 2008 mdf文件太大
  10. TCP-丢包率【传输中所丢数据包数量占发送数据包的比率=(输入报文-输出报文)/输入报文】【TCP只保证传输层消息可靠,并不保证应用层的消息可靠。想保证应用层的消息可靠性,需应用层自己实现逻辑做保障】
  11. 管理学必读书籍排行榜
  12. THUSC2018 (北京4日游)
  13. 【内网安全】——Windows提权姿势
  14. 自己的微信竟然延迟接收消息了,这是什么情况?
  15. go语言中的换行和分号
  16. 基于Layui自定义内容轮播插件
  17. VS2008 工程运行时候的一个R6034问题
  18. C++ using declaration
  19. 计算机科学与技术最轻松的工作,高薪又轻松的好工作排行榜 你的职业上榜了吗?...
  20. Android Gnss信息获取 绘制卫星图

热门文章

  1. AIGC:AI视频是下一个AI绘画吗?
  2. 区块链新宠CST空投糖果1000万free领取
  3. 钉钉H5应用修改导航栏标题名称
  4. 如何使用mybatis框架对数据库进行增删改查?
  5. SQL Server 上云最佳实践
  6. 农杆菌载体——Ti质粒的基本知识
  7. STM32F103VET6实现全彩LED灯
  8. C++程序设计项目开发——银行自动提款机(二)
  9. 三维数学基础1:坐标系、矢量
  10. pandas 数据比对