一:accept函数 accept函数用于从已完成连接队列中的队首(队头)位置取出-项’返回给进程(服务器程序),如果已完成连接队列是空的,accept函数调用就会卡在这里等待(休眠)直到已完成连接队列中有一项内容时才会被唤醒。 所以正常编写程序时,需要尽快调用accept把已完成连接队列中的项取走。另外,也应该很清楚的是,accept返回的是-个套接字(socket)’该套接字代表已经用 三次握手建立起来的TCP连接(因为accept是从巳完成连接队列中取到的连接项)
换句话说’服务器程序必须严格区分2个套接字 (1)监听9000端口的套接字叫监听套接字,只要服务器程序在’该套接字就应该一直存在,目的是随时准备接受(监听到)客户端的连接. (2)当有客户端连接’操作系统会为每个成功完成三次握手的客户再创建一个套接字(当然是—个已连接套接字)’这个套接字其实就是accept返回的套接字也 就是从已完成连接队列中取得的一项。随后服务器用accept返回的套接字和客户端进行通信。
思考如下说法: 1)如果已完成连接队列和未完成连接队列之和达到了listen所指定的第2参数,即队列满了,此时客户端再发送来-个SYN连接请求’服务器端会怎样反应呢? 服务器端会忽略该SYN不给回应,客户端发现SYN没有回应’过一会就会重发这个SYN包重发几次如果都没回应’就认为连接失败(connect失败) (2)三次握手完成,连接放到了已完成连接队列中等着accept函数从已完成连接队列中把连接取走.试想当accept还没来得及取走这个连接的时候’因为三次握手已经建立了,客户端如果此时发送数据过来’该数据就会被保存在已经连接的套接字的接收缓冲区里,该接收缓冲区的大小就是能接受的最大数据量。
二:syn攻击 SYN攻击英文叫作synflood,这是一个很恶心的攻击,也是一些黑客常用的手段之一,是一种典型的利用TCP/IP设计的一些弱点进行攻击的手段。
如果某个恶意的黑客通过一些特殊手段,伪造自己的IP地址和端口(源端口源IP地址全部是伪造的),不停地给服务器发送SYN包(注意,该黑客只给服务器发送SYN包,也就是三次握手中的第1次握手包,不发送的第3个包’即ACK包),就会导致服务器端未完成连接队列中的条目越来越多,当未完成连接队列和已完成连接队列满了’服务器就会忽略后续再发来的SYN包,无法建立正常的TCP连接了,因为正常TCP连接的三次握手的第1次握手包(SYN包)被忽略了,换句话说,合法的用户无法得到服务了,这就是拒绝服务 攻击的一种手段。
|