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三次握手的 ...
随机推荐
- Anaconda packages list
# packages in environment at D:\Applications\Anaconda3:#alabaster 0.7.6 py35_0 anaconda 2.4.0 np110p ...
- PHP.6-PHP环境搭建(Windows环境下)-LAMP
PHP环境搭建(Windows环境下)-LAMP Windows系统上分别独立安装Apache2.PHP5.MySQL5和phpMyAdmin等几个软件.独立安装的好处是可以自由选择这些组件的具体版本 ...
- 二维线段树 HDU 1823最简单的入门题
xiaoz 征婚,首先输入M,表示有M个操作. 借下来M行,对每一行 Ih a l I 表示有一个MM报名,H是高度, a是活泼度,L是缘分. 或 Q h1 h2 a1 a2 求 ...
- some words we should know
2010年,芬兰艺术家Mikko Kuorinki做了一件独特的艺术品. 他在赫尔辛基的奇亚斯玛当代艺术博物馆(Kiasma museum),找了一堵墙,装了一个175 x 320cm的木架子,上面用 ...
- javascript权威指南(中文版)中的一些错误(一)
本人目前正在学习js,使用的是javascript权威指南(中文版),学习的时候发现一些细节上的错误,若是我的错误,欢迎指正 1.P11------多了“我们称为 原文为 return Math.sq ...
- javaweb学习总结一(eclipse常用快捷键、debug调试以及junit测试框架)
一:web的发展趋势1:C/S(客户端/服务器)结构向B/S(浏览器/服务器)结构发展,以后的电脑只需操作系统和浏览器即可.所有的服务都存储在服务器端,只需用户登录后从服务端同步数据,例如:看电影不需 ...
- [改善Java代码]预防线程死锁
线程死锁DeadLock是多线程编码中最头疼的问题,也是最难重现的问题,因为Java是单进程多线程语言.
- Groovy选型
Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似.它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代 ...
- ubuntu不能正常使用make menuconfig的解决方案
so easy sudo apt-get install build-essentialsudo apt-get install libncurses5sudo apt-get install lib ...
- 203. Segment Tree Modify
最后更新 二刷 08-Jan-2017 利用线段树来更改,找到更改的NODE,然后更改那个brach上的所有max值. 首先确定recursion的终止条件 然后通过判断大小来找方向 找到NODE之后 ...