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三次握手的 ...
随机推荐
- day01 Java基础
1.Win7中,在某目录下:shift+右键->在当前目录打开命令行窗口. Windows中打开画图工具的命令是:mspaint. 2.Windows DOS下“rd *”是删除目录的命令:“r ...
- Spark之路 --- Scala用JFreeChart画图表实例
JFreeChart介绍 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用 ...
- Qt设置horizontal line 和vertical line 的颜色
Qt的horizontal line 和vertical line 是由QFame实现的 QFrame *line = new QFrame(this); line->setGeometry(Q ...
- 自问自答-hadoop自带哪些案例(0.20.2)
1)aggregatewordcount 计算输入文件中文字个数的基于聚合的MapReduce程序 2)aggregatewordhist 生成输入文件中文字个数的统计图的基于聚合的MapReduce ...
- Kruskal算法 Swordfish
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=203 Swordfish Time Limit: 2 Seconds ...
- css笔记03:伪类first-child
1. 匹配第一个 <p> 元素 在下面的例子中,选择器匹配作为任何元素的第一个子元素的 p 元素: <html> <head> <style type=&qu ...
- learning nodejs 2 - connect middleware
学习了connect module nodejs 的中间件方式 var connect = require('connect'); var server = connect.createServer( ...
- 用终端直接在桌面生成text文件
简单的两行命令: cd Desktop/ 按回车 touch 888.text 按回车就会在桌面生成名称为888的text文件 用途:做demo的时候可以加一个说明文档进去,这样下次可以很方便的查看
- python(6)-类
面向对象编程是一种编程方式,此编程方式的落地需要使用 "类" 和 "对象" 来实现,所以,面向对象编程其实就是对 "类" 和 "对 ...
- python(5) - 冒泡排序
data = [10, 4, 33, 21, 54, 3, 8, 11, 5, 22, 2, 1, 17, 13] ''' 思路:有多少个元素就循环多少次,每次循环从第一个元素开始与它后面的元素比较, ...