目录
[一、简述什么是 MSL,为什么客户端连接要等待2MSL的时间才能完全关闭](#一、简述什么是 MSL,为什么客户端连接要等待2MSL的时间才能完全关闭)
[二、简述 SYN flood,如何防止这类攻击](#二、简述 SYN flood,如何防止这类攻击)
[三、简述TCP 粘包和拆包](#三、简述TCP 粘包和拆包)
[四、简述TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?](#四、简述TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?)
[五、简述从系统层面上,UDP 如何保证尽量可靠](#五、简述从系统层面上,UDP 如何保证尽量可靠)
一、简述什么是 MSL,为什么客户端连接要等待2MSL的时间才能完全关闭
1、MSL是Maximum Segment Lifetime的英文缩写,可译为"最长报文段寿命 ",它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
2、为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在 LAST-ACK 状态的服务器收不到对 FIN-ACK 的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。即:
(1)保证客户端发送的最后一个ACK报文段能够到达服务端。
这个ACK报文段有可能丢失,使得处于 LAST-ACK 状态的B收不到对已发送的 FIN+ACK 报文段的确认,服务端超时重传 FIN+ACK 报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK 报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到 CLOSED 状态,若客户端在 TIME-WAIT 状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的 FIN+ACK 报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到 CLOSED 状态。
(2)防止"已失效的连接请求报文段"出现在本连接中。
客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生 的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
二、简述 SYN flood,如何防止这类攻击
1、SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,使被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。
2、有以下三种方法预防或响应网络上的DDoS攻击:
(1)从互联网服务提供商(ISP)购买服务。
许多互联网服务提供商(ISP)提供DDoS缓解服务,但是当企业网络受到攻击时,企业需要向互联网服务提供商(ISP)报告事件以开始缓解。这种策略称为"清洁管道",在互联网服务提供商(ISP)收取服务费用时很受欢迎,但在缓解措施开始之前,通常会导致30到60分钟的网络延迟。
(2)保留在内部并自己解决。
企业可以使用入侵防御系统/防火墙技术和专用于防御DDoS攻击的专用硬件来实现内部预防和响应 DDoS攻击。不幸的是,受影响的流量已经在网络上消耗了宝贵的带宽。这使得该方法最适合在托管设施中配备设备的企业,在这些企业中,流量是通过交叉连接到达互联网服务提供商(ISP),从而保护流向企业其他部门的下游带宽。
(3)使用内容分发网络(CDN)。
由于IT团队可以将基础设施置于内容分发网络(CDN)后面,因此这种方法可以最大程度地减少对企业网络基础设施的攻击。这些网络庞大而多样,如果组织订阅DNS和DDoS缓解措施,则它们可以保护电子商务站点以及企业本身。
三、简述TCP 粘包和拆包
1、TCP是个"流"协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
2、假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况:
(1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;
(2)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;
(3)服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;
(4)服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。
如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第五种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。
四、简述TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?
TCP和UDP协议都是传输层协议。二者的区别主要有:
1、基于连接 vs 无连接
TCP是面向连接的协议。
UDP是无连接的协议。UDP更加适合消息的多播发布,从单个点向多个点传输消息。
2、可靠性
TCP提供交付保证,传输过程中丢失,将会重发。
UDP是不可靠的,不提供任何交付保证。(网游和视频的丢包情况)
3、有序性
TCP保证了消息的有序性,即使到达客户端顺序不同,TCP也会排序。
UDP不提供有序性保证。
4、数据边界
TCP不保存数据边界。虽然TCP也将在收集所有字节之后生成一个完整的消息,但是这些信息在传给传输给接受端之前将储存在TCP缓冲区,以确保更好的使用网络带宽。
UDP保证。在UDP中,数据包单独发送的,只有当他们到达时,才会再次集成。包有明确的界限来哪些包已经收到,这意味着在消息发送后,在接收器接口将会有一个读操作,来生成一个完整的消息。
5、速度
TCP速度慢。
UDP速度快。应用在在线视频媒体,电视广播和多人在线游戏。
6、发送消耗
TCP是重量级。
UDP是轻量级。因为UDP传输的信息中不承担任何间接创造连接、保证交货或秩序的信息。 这也反映在用于报头大小。
7、报头大小
TCP头大。一个TCP数据包报头的大小是20字节。 TCP报头中包含序列号,ACK号,数据偏移量,保留,控制位,窗口,紧急指针,可选项,填充项,校验位,源端口和目的端口。
UDP头小。UDP数据报报头是8个字节,UDP报头只包含长度、源端口号、目的端口和校验和。
8、拥塞或流控制
TCP有流量控制。在任何用户数据可以被发送之前,TCP需要三数据包来设置一个套接字连接。TCP处理的可靠性和拥塞控制。
UDP不能进行流量控制。
9、应用
由于TCP提供可靠交付和有序性的保证,它是最适合需要高可靠并且对传输时间要求不高的应用。
UDP是更适合的应用程序需要快速,高效的传输的应用,如游戏。UDP是无状态的性质,在服务器端需要对大量客户端产生的少量请求进行应答的应用中是非常有用的。在实践中,TCP被用于金融领域,如FIX协议是一种基于TCP的协议,而UDP是大量使用在游戏和娱乐场所。
10、上层使用的协议
基于TCP协议的:Telnet,FTP以及SMTP协议。
基于UDP协议的:DHCP、DNS、SNMP、TFTP、BOOTP。
五、简述从系统层面上,UDP 如何保证尽量可靠
1、UDP仅提供了最基本的数据传输功能,至于传输时连接的建立和断开、传输可靠性的保证这些UDP统统不关心,而是把这些问题抛给了UDP上层的应用层程序去处理,自己仅提供传输层协议的最基本功能。
2、最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。
(1)添加seq/ack机制,确保数据发送到对端。
(2)添加发送和接收缓冲区,主要是用户超时重传。
(3)添加超时重传机制。