TCP三次握手原理与SYN攻击
本文内容包括以下几点
1.TCP三次握手四次挥手解析
2.迭代型服务器程序编写,并给出客户端,结合这一模式详细介绍Berkeley套接字的使用
3.介绍SYN攻击的原理
TCP连接建立,传输数据,连接释放上层图解。
结合此图来说明SYN攻击。SYN攻击发生在TCP连接的第二个阶段,服务器确认客户端同步信息(SYN),用32位确认号(ACK)确认SYN信息。
可以提出这样一个假设,客户端(client)给服务器发syn之后就不存在了,那么第二次握手失败,服务器会根据预先设置的超时时间继续做第二次握手,时间可以假设如下
第一轮第二次握手等待5s,过了五秒等不到客户端的第三次握手则继续第二轮第二次握手等待15s,依次迭代,直到等待时间超过某个阈值。(注:此处5s,15s均为假设值)。服务器不断的在进行第二次握手,消耗系统资源。
知道了SYN攻击的原理,那么如何进行SYN攻击?我们可以不断的发送TCP连接请求,同时把自己隐藏好,不让服务器发现。可以伪造IP,服务器根据IP来寻找客户端,由于IP是伪造的,所以TCP第二次握手会失败。伪造大量的IP可以大幅度消耗系统资源。从技术的角度上说,我们可以利用原始套接字伪造大量IP,从而构造大量数据包,利用原始套接字构造IP数据与服务器进行第一次握手,服务器忙于在处理队列中的连接,从而消耗系统资源。SYN攻击是TCP协议的bug造成,无法避免,除非重新修改TCP协议,但是这样子做不显示。
接下来是学习编写的代码,包括一个迭代型服务器和一个简易客户端,基本上每个编写网络程序的朋友第一次编写网络程序都类似下面的代码
服务器端:server.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h> int main(int argc, char **argv){ /* variable */
int sock_fd, connect_fd;
struct sockaddr_in server, client;
char buff[];
int ret; /* socket */
sock_fd = socket(PF_INET, SOCK_STREAM, );
if(sock_fd < ){
perror("socket failed");
exit();
} server.sin_family = PF_INET;
//server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons();
if(inet_pton(PF_INET, "127.0.0.1", &server.sin_addr) < ){
perror("inet_pton");
exit();
}
/* bind */
ret = bind(sock_fd, (struct sockaddr*)&server, sizeof(server));
if(ret < ){
perror("bind failed");
exit();
} /* listen */
if(listen(sock_fd, )<){
perror("listen failed\n");
exit();
}
/* accept */
while(){
memset(buff, , sizeof(buff));
connect_fd = accept(sock_fd, (struct sockaddr*)NULL,NULL); if((ret = recv(connect_fd, buff, sizeof(buff), )) < ){
perror("recv");
exit();
}
else if(ret == )
printf("read end\n");
else{
printf("receive message %s retval:%d\n", buff, ret);
}
close(connect_fd);
} /* close */
close(sock_fd);
return ;
}
客户端:client.c
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h> #define LEN(str) (sizeof(char)*strlen(str)) int main(int argc, char **argv){ /* variable */
int sock_fd;
struct sockaddr_in server;
char buff[];
int ret; /* socket */
sock_fd = socket(PF_INET, SOCK_STREAM, );
if(sock_fd < ) {
perror("socket failed");
exit();
} server.sin_family = PF_INET;
server.sin_port = htons();
if(inet_pton(PF_INET, "127.0.0.1", &server.sin_addr) < ){
perror("inet_pton");
exit();
}
/* connect */
if((ret = connect(sock_fd, (struct sockaddr*)&server,
sizeof(server)) )< ){
perror("connect failed");
exit();
}
/* send buff */
sprintf(buff, "Hello World");
if(( ret = send(sock_fd, buff, LEN(buff), )) < ){
perror("send");
exit();
}
printf("send msg\n"); /* close */
close(sock_fd);
return ;
}
还是来个图,把套接字API之间的关系与TCP连接过程对应上
具体的API使用查看文档或者参考UNP1.关于TCP整个协议,想彻底理解的话,没有一定时间是做不到的,现在也仅限于握手挥手数据交换,至于流量控制,超时重传,数据包重排等功能暂时还没有更高的理解。
尽管上述迭代型服务器看上去运行成功,实际上这里面存在不少问题。将在下一篇文章记录。
接下来将复习迭代模型中,连接过程中的多种异常情况。并将复习情况记录blog。
最后,上传几个思维导图,关于Linux网络模块的,我一直坚信图片比文字,表格都要直观
作者水平有限,有错误的地方可以给我留言可以修改,以免误人子弟
TCP三次握手原理与SYN攻击的更多相关文章
- TCP三次握手原理详解
TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族. 从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层.网络层.传输层.应用层. TCP协议:即传输控制 ...
- TCP三次握手原理,你真的了解吗?
最近碰到一个问题,Client 端连接服务器总是抛异常.在反复定位分析.并查阅各种资料搞懂后,我发现并没有文章能把这两个队列以及怎么观察他们的指标说清楚. 问题描述 场景:Java 的 Client ...
- TCP 三次握手原理,你真的理解吗?
最近,阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么观察他们的指标说清楚. 因此,蛰剑写下这篇文章 ...
- TCP三次握手原理
本文主要讲述的是 1.TCP协议三次握手原理,以及为什么要三次握手,两次握手带来的不利后果. 2.TCP协议四次挥手原理,为什么要四次挥手. TCP协议三次握手原理: 首先,给张图片,建立TCP三次握 ...
- TCP三次握手(通俗易懂)
一--导读 前不久中国和外国RPEC协议的签订,标志着东亚自贸区的建立成功.现在韩国和日本要做贸易.日本一直监听着韩国总统的一举一动,但他又不会主动.(服务器的监听状态)只是被动的等着韩国总统先开口. ...
- TCP三次握手与DDOS攻击原理
TCP三次握手与DDOS攻击原理 作者:冰盾防火墙 网站:www.bingdun.com 日期:2014-12-09 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. ...
- TCP三次握手--syn攻击
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...
- 转---tcp三次握手四次挥手syn fin......
http://blog.chinaunix.net/uid-22312037-id-3575121.html转自 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协 ...
- TCP三次握手四次挥手原理
转自http://www.cnblogs.com/liuxiaoming/archive/2013/04/27/3047803.html TCP协议三次握手原理: 首先,给张图片,建立TCP三次握手的 ...
随机推荐
- SMI接口,SMI帧结构,MDC/MDIO
转载:http://blog.csdn.net/zyboy2000/article/details/7442464 SMI全称是串行管理接口(Serial Management Interface). ...
- Android(java)学习笔记82:我们到底该如何处理异常?
我们到底该如何处理异常? 原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个调用者解决这 ...
- SVN更改用户名和密码
关于SVN更换用户名和密码的问题,SVN是一个脚本的扩展软件,但是通过客户端更改用户名和密码的时候比较弱智,必须要经过一些操作之后才能出现更改用户名和密码的对话框. 主要的步骤就是“点击鼠标右键选择T ...
- #if...#endif的用法总结
在写到 pwm音阶程序的时候,在代码中有#if...#endif的用法问题,相关音阶的代码如下: /************************************************* ...
- insert 另外一种用法
then into dept01(id) values(deptno) then into dept02(id) values(deptno) else into dept03(id) values( ...
- hdu 2709 Sumsets
Sumsets Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hihocoder 1038 01背包
#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...
- C# 学习笔记01
想写一个app可以访问数据库,实现对数据库的查询,修改等,突然发现知识实在有限,故选择C#来实现此app. 使用简单的三层架构来作为此app的架构.表现层(UI).业务逻辑层(BLL).数据访问层(D ...
- .NE 学习概要
也是个人的学习计划,仅供参考:)
- Quartz Scheduler(2.2.1) - hello world
简单示例 1. maven 依赖 <dependencies> <dependency> <groupId>org.quartz-scheduler</gro ...