该选项的意思是:当接收到第一个数据之后,才会创建连接,这是为防止空连接的攻击,直接看代码吧。

[mapan@localhost sockOption]$ ls
client.cpp  makefile  server.cpp
[mapan@localhost sockOption]$ cat server.cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <netinet/tcp.h>
#define MAXLINE 4096int main()
{int listenfd,acceptfd;int val=10;struct sockaddr_in servaddr;listenfd=socket(AF_INET,SOCK_STREAM,0);int ret= setsockopt(listenfd,SOL_TCP,TCP_DEFER_ACCEPT,&val,sizeof(val));printf("ret=%d\n",ret);memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(6666);servaddr.sin_addr.s_addr=htonl(INADDR_ANY);bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));listen(listenfd,10);acceptfd=accept(listenfd,(struct sockaddr *)NULL,NULL);   getchar();close(acceptfd);close(listenfd); return 0;
}
[mapan@localhost sockOption]$ cat client.cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#define MAXLINE 4096int main(int argc,char **argv)
{int connfd,ret;char sendbuf[400000]={0};struct sockaddr_in servaddr;if(argc != 2){printf("error\n");}connfd=socket(AF_INET,SOCK_STREAM,0);memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(6666);inet_pton(AF_INET,argv[1],&servaddr.sin_addr);connect(connfd,(struct sockaddr *)&servaddr,sizeof(servaddr));getchar();write(connfd,sendbuf,sizeof(sendbuf));getchar(); close(connfd);return 0;
}
[mapan@localhost sockOption]$ cat makefile
all:server clientserver.o:server.cppg++ -c server.cpp
client.o:client.cppg++ -c client.cpp
server:server.og++ -o server server.o
client:client.og++ -o client client.oclean:rm -f server client *.o
[mapan@localhost sockOption]$

编译并运行:

[mapan@localhost sockOption]$ make
g++ -c server.cpp
g++ -o server server.o
g++ -c client.cpp
g++ -o client client.o
[mapan@localhost sockOption]$ ./server
ret=0
[mapan@localhost sockOption]$ ./client 127.0.0.1

看看此时的网络状态:

[mapan@localhost net_04S]$ netstat -na | grep 6666
tcp        0      0 0.0.0.0:6666                0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:6666              127.0.0.1:59226             SYN_RECV
tcp        0      0 127.0.0.1:59226             127.0.0.1:6666              ESTABLISHED
[mapan@localhost net_04S]$

服务端并没有建立连接,其实服务端没有调用accept。服务端忽略了客户端最后发送过来了一个ACK,仅仅把这个socket标记位acked,然后丢弃它。然后就是服务端启动超时重传机制,重传SYN/ACK,达到一定次数之后,然后开始计时到val秒。我这边linux内核是2.6.32的,超时时间过之后,客户端还没有数据发送过来,服务端就会丢掉这个请求,2.6.18内核会删除SYN_RECV这个状态的连接。

如果重传SYN/ACK时,客户端及时响应ACK但是没有数据到来,那么服务端会定时重传SYN/ACK,保持连接状态SYN/ACK不变。

参考地址:http://blog.sina.com.cn/s/blog_3fde82520101fmxw.html

TCP_DEFER_ACCEPT相关推荐

  1. 使用sendfile()让数据传输得到最优化,TCP_CORK、TCP_DEFER_ACCEPT和TCP_QUICKACK优化网络...

    当今国互联网的飞速发展让人们获益匪浅,同时人们对于互联网 的期望值也变得越来越高.这就形成了一个矛盾,虽然互联网的 发展已经是相当迅猛的了,但是人们还是期望从服务器到客户终 端的文件传输的速度能够比现 ...

  2. Nginx源码分析:核心数据结构ngx_cycle_t与内存池概述

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> 核心数据结构与内存池概述 在Nginx中的核心数据结构就是ngx_cycle_t结构,在初始 ...

  3. FastDFS + Nginx代理方式访问

    FastDFS + Nginx代理方式访问 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.在storage上安装nginx 1>.下载nginx软件(http://ngi ...

  4. 通过ngx-lua来统计Nginx上的虚拟主机性能数据

    Web server调研分析 Filed under: Web Server - cmpan @ 2012-10-29 20:38:34 摘要 简单可依赖的架构首先需要有一个简单可依赖的前端WebSe ...

  5. Linux下高性能网络编程中的几个TCP/IP选项

    Linux下高性能网络编程中的几个TCP/IP选项 转自:http://blog.chinaunix.net/u/12592/showart.php?id=2064847 最近在新的平台上测试程序,以 ...

  6. tcp connection setup的实现

    bind的实现: 先来介绍几个地址结构. struct sockaddr 其实相当于一个基类的地址结构,其他的结构都能够直接转到sockaddr.举个例子比如当sa_family为PF_INET时,s ...

  7. socket 与 vfs

    首先来看整个与socket相关的操作提供了一个统一的接口sys_socketcall. 下面就是它的代码片段: Java代码   asmlinkage long sys_socketcall(int  ...

  8. Nginx笔记系列(1)——Nignx的安装部署

    2019独角兽企业重金招聘Python工程师标准>>> Nginx百科 服务器(软件)你能一口气说出几个?从当年"蹒跚学步"学java时开始用 Tomcat,到& ...

  9. linux(ubuntu版本)安装tengine

    解压tengine压缩包 解压成功后,即多出一个文件夹 prefix表示将nginx安装到哪个目录下 想要Linux下安装Nginx作为WEB服务器,要先准备些必要的库和工具,通常必须安装的是:PER ...

最新文章

  1. 在系统中使用read函数读取文件内容
  2. (DML触发器)如何正确理解触发器的deleted表和inserted表(转)
  3. netty 之 telnet HelloWorld 详解
  4. idea设置打开文件窗口个数
  5. 通信教程 | 串口丢数据常见的原因
  6. ASP网页中 制作连续无缝滚动文字
  7. 如何查看Linux发行版内核版本及系统版本?
  8. AS打包出现app:transformClassesAndResourcesWithProguardForRelease错误
  9. 随滚动条移动的QQ在线客服代码
  10. 自动提示文本框与下拉列表
  11. pq分解法matlab编程,基于matlab的pq分解法电力系统潮流计算.pdf
  12. 2020全国网络安全知识竞赛链工宝答案 爬取 自动答题
  13. 银行招考计算机专业考什么,银行笔试一般都考什么?
  14. Unity使用UnityWebRequest实现本地日志上传到web服务器
  15. html5游戏 美术,cocos2d-html5游戏学习之绘画小熊
  16. 个人完成案例之乐学成语(显示所有动物类成语的列表和每条成语的详细信息)
  17. vue表格(table)计算总计
  18. 云计算 第七章 云安全(3)概述 云计算面临的安全问题 云安全问题的深层原因 云安全关键技术 云计算信息安全的国内外标准化
  19. 【视频播放器】potplayer调教教程
  20. 谷粒商城项目搭建思路

热门文章

  1. postman测试传入json
  2. Java并发程序设计(四)JDK并发包之同步控制
  3. 取得select框的text
  4. 汇编cli(Clear Interrupt,禁止中断、关中断,对应的sti是开中断)
  5. Centos7.6 下部署Cobbler
  6. 2018-2019-1 20189218《Linux内核原理与分析》第五周作业
  7. 3星|《数据思维:从数据分析到商业价值》:有趣的数据分析案例
  8. SylixOS 无Uboot版BSP
  9. 云供应商安全评估:小心落入陷阱
  10. 完全掌握JavaMail