问题大纲
一、计网基础
1、OSI七层网络模型(*4)
OSI七层 | 作用 | 对应网络协议 | TCP/IP四层 | 对应软硬件 |
---|---|---|---|---|
应用层(Application) | 为应用程序提供网络服务 | HTTP、TFTP、FTP、NFS、WAIS、SMTP | 应用层 | 应用程序 |
表示层(Presentation) | 数据格式化,加密、解密 | Talnet、Rlogin、SNMP、Gopher | ||
会话层(Session) | 建立、维护、管理会话连接 | DNS | ||
传输层(Transport) | 建立、维护、管理端到端连接 | TCP、UDP | 传输层 | 操作系统 |
网络层(Network) | IP寻址和路由选择 | IP、ICMP、ARP、RARP、AKP、UUCP | 网络层 | |
数据链路层(Data Link) | 控制网络层和物理层之间通信 | FDDI、Ethernet、Arpanet、PDN、SLIP、PPP | 数据链路层(可不合并物理层) | 设备驱动程序与网络接口 |
物理层(Physical) | 比特流传输 | IEEE 802.1A、IEEE 802.2到IEEE 802.11 |
追问1:为什么有了七层还有五层的概念?
统一网络需要一个统一标准,ISO开始制定了OSI模型,清晰易懂,大家觉得OSI 会成为统一标准,于是用OSI结构理论作为术语交流。但后来TCP/IP协议诞生发展繁荣,而OSI迟迟没有成熟产品推出,妨碍第三方厂家开发软硬件,从而影响至今。
二、TCP三次握手与四次挥手
1、三次握手(Three-way Handshake)过程
- 注意:下图要达到熟练默写程度。
补充:x = client_isn; y = server_isn; z = client_isn+1
追问1-1:为什么两次握手不行?
三次握手是为了让双方验证各自接收能力和发送能力。
- 1st:A发送SYN给B,B接收到。这里B能确认
A的发送能力和B的接收能力
。 - 2nd:B发送SYNACK给A,A收到。这里A能确认
A的接收能力和B的发送能力
。此外,A收到SYNACK,说明前面A的SYN成功到达B,也能确认A自己的发送能力和B的接收能力。至此,A已经确认双方各自发送能力和接收能力OK,因此转为ESTABLISHED
状态。 - 3rd:A发送ACK到B,B接收。这里B能确认
A的发送能力和B的接收能力
。由于B能收到ACK,说明前面发送的SYNACK
已经被接受了,说明A的接收能力和B的发送能力
正常。
若使用两次握手,就不能确认上述四种能力,可能有问题。
-
假定A发的
SYN报文
没消失,而是在某网络节点长时间滞留了,以至于到连接释放后的某个时间才到达B。 -
本来这是一个早已失效的报文段,但B收到此失效连接请求报文段后,却误以为是A又发出一次新的连接请求,于是A就发出确认报文段,同时建立连接。
-
由于现在A并没有发出建立连接请求,因此不理睬B的
SYNACK报文
,也不会向B发送数据,但B却以为新连接已经建立,并一直等待A发来的数据,B的许多资源被白白浪费。
追问1-2:三次握手过程中可以携带数据吗?为什么?
前两次不行,第三次可以携带。
假如第一次可以,如果有人恶意攻击服务器,那他在第一次SYN 报文
中放入大量数据。因为攻击者根本不理会服务器的接收、发送能力是否正常,只是疯狂重复发 SYN 报文,这会让服务器花费很多内存与时间来接收这些报文。
也就是说,第一次握手不能放数据,1个简单原因服务器会更容易受到攻击。而对于第三次,此时客户端处于 ESTABLISHED
状态,已经建立起连接,知道服务器接收与发送能力正常,所以携带数据也没毛病。
追问1-3:第三次握手失败了怎么办?
- 在第2次握手中,
server
向client
发送SYN+ACK报文
后,就会启动一个定时器,等待client
返回的ACK报文。 - 如果第三次失败,
client
给server
返回了ACK报文
,server
并不能收到这个ACK报文
。那server
就会启动超时重传机制,超过规定时间会重新发起第2次握手,向client
发送SYNACK
。重传次数默认5次。 - 如果到重传指定次数,仍未收到ACK应答,那一段时间后
server
会关闭这个连接。但client
认为这个连接已建立,如果它向server
写数据,server
将回应RST包、强制关闭TCP连接,以防止SYN攻击。
追问2-1:握手过程中除了序号的同步,还会同步什么信息?
补充:发数据时应注意TCP连接哪些信息,如客户端怎么知道该给服务端发送1个还是10个报文?
- 1)序号;
- 2)标志位:SYN(发起一个连接)、ACK(确认序号有效);
- 3)窗口(流量控制中的接收?)。
追问2-2:ISN(Initial Sequence Number)是固定的吗?
不固定,client_isn
是随机生成的,而server_isn
则需要根据SYN报文中的源、IP和端口,加上服务器本身密码数进行相同散列得到,显然也不固定。
追问2-3:服务器为什么使用特殊的初始序号server_isn?
服务器使用特定初始序列号server_isn(从源和目的地IP和端口的散列中获取) 可以用来抵御SYN洪水攻击
。
追问3-1:什么是SYN攻击?如何防范?
在三次握手过程中,服务器发送SYN-ACK
之后,收到客户端ACK
之前的TCP连接
称为半连接(half-open connect
)。此时服务器处于SYN-RECV
。当收到ACK后,服务器转入ESTABLISHED
状态。
SYN攻击就是攻击客户端,在短时间内伪造大量不存在的IP地址,向服务器不断发送SYN包,服务器回复确认包,并等待客户确认。 由于源地址不存在,服务器需要不断重发直至超时,这些伪造SYN包将长时间占用未连接队列,正常SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪
。
SYN攻击是一种典型的DoSe/DDoS攻击。
追问3-2:如何检测SYN攻击?
检测SYN攻击非常方便,当你在服务器上看到大量半连接状态时,特别是IP地址是随机的,基本可以断定这是一次SYN攻击,在Linux/Unix可用netstat命令检测。
追问3-3:如何防御SYN攻击?
SYN攻击不能完全被阻止,除非重新设计TCP协议。能做的就是就是尽可能减轻SYN攻击危害,常见防御方法有:缩短超时(SYN Timeout)时间、增大最大半连接数、过滤网关防护、SYN cookies技术。