TCP_DEFER_ACCEPT
该选项的意思是:当接收到第一个数据之后,才会创建连接,这是为防止空连接的攻击,直接看代码吧。
[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相关推荐
- 使用sendfile()让数据传输得到最优化,TCP_CORK、TCP_DEFER_ACCEPT和TCP_QUICKACK优化网络...
当今国互联网的飞速发展让人们获益匪浅,同时人们对于互联网 的期望值也变得越来越高.这就形成了一个矛盾,虽然互联网的 发展已经是相当迅猛的了,但是人们还是期望从服务器到客户终 端的文件传输的速度能够比现 ...
- Nginx源码分析:核心数据结构ngx_cycle_t与内存池概述
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> 核心数据结构与内存池概述 在Nginx中的核心数据结构就是ngx_cycle_t结构,在初始 ...
- FastDFS + Nginx代理方式访问
FastDFS + Nginx代理方式访问 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.在storage上安装nginx 1>.下载nginx软件(http://ngi ...
- 通过ngx-lua来统计Nginx上的虚拟主机性能数据
Web server调研分析 Filed under: Web Server - cmpan @ 2012-10-29 20:38:34 摘要 简单可依赖的架构首先需要有一个简单可依赖的前端WebSe ...
- Linux下高性能网络编程中的几个TCP/IP选项
Linux下高性能网络编程中的几个TCP/IP选项 转自:http://blog.chinaunix.net/u/12592/showart.php?id=2064847 最近在新的平台上测试程序,以 ...
- tcp connection setup的实现
bind的实现: 先来介绍几个地址结构. struct sockaddr 其实相当于一个基类的地址结构,其他的结构都能够直接转到sockaddr.举个例子比如当sa_family为PF_INET时,s ...
- socket 与 vfs
首先来看整个与socket相关的操作提供了一个统一的接口sys_socketcall. 下面就是它的代码片段: Java代码 asmlinkage long sys_socketcall(int ...
- Nginx笔记系列(1)——Nignx的安装部署
2019独角兽企业重金招聘Python工程师标准>>> Nginx百科 服务器(软件)你能一口气说出几个?从当年"蹒跚学步"学java时开始用 Tomcat,到& ...
- linux(ubuntu版本)安装tengine
解压tengine压缩包 解压成功后,即多出一个文件夹 prefix表示将nginx安装到哪个目录下 想要Linux下安装Nginx作为WEB服务器,要先准备些必要的库和工具,通常必须安装的是:PER ...
最新文章
- 在系统中使用read函数读取文件内容
- (DML触发器)如何正确理解触发器的deleted表和inserted表(转)
- netty 之 telnet HelloWorld 详解
- idea设置打开文件窗口个数
- 通信教程 | 串口丢数据常见的原因
- ASP网页中 制作连续无缝滚动文字
- 如何查看Linux发行版内核版本及系统版本?
- AS打包出现app:transformClassesAndResourcesWithProguardForRelease错误
- 随滚动条移动的QQ在线客服代码
- 自动提示文本框与下拉列表
- pq分解法matlab编程,基于matlab的pq分解法电力系统潮流计算.pdf
- 2020全国网络安全知识竞赛链工宝答案 爬取 自动答题
- 银行招考计算机专业考什么,银行笔试一般都考什么?
- Unity使用UnityWebRequest实现本地日志上传到web服务器
- html5游戏 美术,cocos2d-html5游戏学习之绘画小熊
- 个人完成案例之乐学成语(显示所有动物类成语的列表和每条成语的详细信息)
- vue表格(table)计算总计
- 云计算 第七章 云安全(3)概述 云计算面临的安全问题 云安全问题的深层原因 云安全关键技术 云计算信息安全的国内外标准化
- 【视频播放器】potplayer调教教程
- 谷粒商城项目搭建思路