int initsockid,newsockid;
if ((initsockid=socket(...)) <0
{
error("can't creat socket");
}
if (bind(initsockid,...)<0)
{
error("bind error");
}
if (listen(initscokid,5)<0) /*listen函数中允许initsockid连接的最大请求数目为5个请求*/
{
error("listen error");
}
for (;
{
newsockid=accept(initsockid,...); /*堵塞*/
if (newsockid<0)
{
error ("accept error");
}
if (fork()==0) /*子进程*/
{
close(initsocketid); /*处理客户的请求*/
exit(0);
}
close(newsockid);
}
listen在处理多于5个initsockid连接请求时会被丢弃.但注意一旦连接通过三次握手建立成功后,accept调用就已经处理了
这个连接,此时TCP连接请求队列空出一个位置.所以5不是initsockid上只能接受5个连接请求,而是在请求队列中等待连接的
请求数目.X向B发送多个带有SYN标志的数据包以请求连接,但在IP包中将IP地址换成不存在的主机Z,当B收到来自Z的连接请求后,
B将向Z发送SYN+ACK数据包,但此时不会有任何来自Z的ACK数据存在.B的IP层报告TCP层Z是不可到达的,但B的TCP层会认为是暂时
通讯中断,将不予处理.于是B在这个initsockid上就不能再接收任何正常的连接请求.
Z(X) -----SYN-----> B
Z(X) -----SYN-----> B
.
.
.
Z(X) -----SYN-----> B
X <----SYN+ACK----- B
X <----SYN+ACK----- B
.
.
.
X <----SYN+ACK----- B
SYN flood 正是这种DoS (Denial of Service),将导致目标主机特定端口瘫痪.这时Z必须确定A当前的ISN,连接没有安全校验机制的SMTP(25)端口,这与我们第一节课讲得一样, 只是这里记录的是A的ISN,以及Z到A的大致RTT(Round trip time),这个步凑要重复多次以求出RTT的平均值.现在Z知道A的ISN基值和增加规律,也知道了从Z到A需要RTT/2的时间,现在需要马上攻击,否则在此期间有别的主机与A 连接,ISN将比预料的增加一个基本单位.
######
今天就将到这里,希望对大家有所帮助!