在 TCP 连接的三次握手中,假设一个用户向服务器发送了 SYN 报文后突然 死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的 (第 三次握手无法完成),这种情况下服务器端一般会不停地重试(再次发送 SYN+ACK 给客 户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为 SYNTimeout (大约为 30 秒-2 分钟);一个用户出现异常导致服务器的一个线程等待 1 分钟并不是什 么很大的问题,但如果有一个恶意的攻击者发送大量伪造原 IP 地址的攻击报文,发送到服 务端,服务器端将为了维护一个非常大的半连接队列而消耗非常多的 CPU 时间和内存。此时从正常客户的角度看来,服务器失去响应,这种情况我 们称作:服务器端受到了 SYN Flood 攻击(SYN 洪水攻击)。
第一种是缩短 SYN Timeout 时间;
由于 SYNFlood 攻击的效果取决于服务器上保持的 SYN 半连接数,这个值=SYN 攻击 的频度 xSYNTimeout,所以通过缩短从接收到 SYN 报文到确定这个报文无效并丢弃该连 接的时间,例如设置为 20 秒以下(过低的 SYNTimeout 设置可能会影响客户的正常访问), 可以成倍的降低服务器的负荷。
第二种方法是设置 SYN Cookie;
就是给每一个请求连接的 IP 地址分配一个 Cookie,如果短时间内连续受到某个 IP 的 重复 SYN 报文,就认定是受到了攻击,以后从这个 IP 地址来的包会被丢弃。
可是上述的两种方法只能对付比较原始的 SYNFlood 攻击,缩短 SYNTimeout 时间仅 在对方攻击频度不高的情况下生效,SYN Cookie 更依赖于对方使用真实的 IP 地址,如果 攻击者以数万/秒的速度发送 SYN 报文,同时利用随机改写 IP 报文中的源地址,以上的方 法将毫无用武之地。例如 SOCK_RAW 返回的套接字通过适当的设置可以自己完全控制 IP 头的内容从而实现 IP 欺骗。
第三种方法是 Syn Cache 技术。
这种技术在收到 SYN 时不急着去分配系统资源,而是先回应一个 ACK 报文,并在一 个专用的 HASH 表中(Cache)中保存这种半开连接,直到收到正确的 ACK 报文再去分配 系统。
第四种方法是使用硬件防火墙。
SYN FLOOD 攻击很容易就能被防火墙拦截。
LAND 攻击利用了 TCP 连接建立的三次握手过程,通过向一个目标主机发送一个用于 建立请求连接的 TCPSYN 报文而实现对目标主机的攻击。与正常的 TCPSYN 报文不同的 是:LAND 攻击报文的源 IP 地址和目的 IP 地址是相同的,都是目标主机的 IP 地址。这样 目标主机接在收到这个 SYN 报文后,就会向该报文的源地址发送一个 ACK 报文,并建立 一个 TCP 连接控制结构,而该报文的源地址就是自己。由于目的 IP 地址和源 IP 地址是相 同的,都是目标主机的 IP 地址,因此这个 ACK 报文就发给了目标主机本身。这样如果攻 击者发送了足够多的 SYN 报文,则目标计算机的 TCB 可能会耗尽,最终不能正常服务。
1.基于连接 vs 无连接 TCP 是面向连接的协议,而 UDP 是无连接的协议。这意味着当一个客户端和一个服 务器通过 TCP 发送数据之前,必须先建立连接,建立连接的过程也被称为 TCP 三次握手。
2.可靠性 TCP 提供交付保证,这意味着一个使用 TCP 协议发送的消息是保证交付给客户端的, 如果消息在传输过程中丢失,那么它将重发。UDP 是不可靠的,它不提供任何交付的保证, 一个数据报包在运输途中可能会丢失。
3.有序性 消息到达网络的另一端时可能是无序的,TCP 协议将会为你排好序。UDP 不提供任何 有序性的保证。
4.速度 TCP 速度比较慢,而 UDP 速度比较快,因为 TCP 必须创建连接,以保证消息的可靠 交付和有序性,他需要做比 UDP 多的事。这就是为什么 UDP 更适用于对速度比较敏感的 应用。TCP 适合传输大量数据,UDP 适合传输少量数据。
5.重量级 vs 轻量级 TCP 是重量级的协议,UDP 协议则是轻量级的协议。一个 TCP 数据报的报头大小最 少是 20 字节,UDP 数据报的报头固定是 8 个字节。TCP 报头中包含序列号,ACK 号,数 据偏移量,保留,控制位,窗口,紧急指针,可选项,填充项,校验位,源端口和目的端 口。而 UDP 报头只包含长度,源端口号,目的端口,和校验和。
6.流量控制或拥塞控制 TCP有流量控制和拥塞控制。UDP 没有流量控制和拥塞控制。
7.TCP 面向字节流,UDP 是面向报文的。 TCP 是字节流的协议,无记录边界。 UDP 发送的每个数据报是记录型的数据报,所谓的记录型数据报就是接收进程可以识 别接收到的数据报的记录边界。
8.TCP 只能单播,不能发送广播和组播;UDP 可以广播和组播。
TCP 应用场景:效率要求相对低,但对准确性要求相对高的场景。因为传输中需要 对数据确认、重发、排序等操作,相比之下效率没有 UDP 高。举几个例子:文件传输、邮 件传输、远程登录。
UDP 应用场景:效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ 聊天、QQ 视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问 题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)。
1.无需建立连接(减少延迟)
2.无需维护连接状态
3.头部开销小,一个 TCP 数据报的报头大小最少是 20 字节,UDP 数据报的报头固定 是 8 个字节。
4.应用层能更好地控制要发送的数据和发送时间。UDP 没有拥塞控制,因此网络中的 拥塞不会影响主机的发送频率。某些实时应用要求以稳定的速度发送数据,可以容忍一些 数据的丢失,但不允许有较大的延迟,而 UDP 正好满足这些应用的需求。
域名解析
为了将消息从你的 PC 上传到服务器上, 需要用到 IP 协议、 ARP 协议和 OSPF 协议。
发起 TCP 的 3 次握手
建立 TCP 连接后发起 http 请求
服务器响应 http 请求
浏览器解析 html 代码, 并请求 html 代码中的资源(如 js、 css、 图片等)
断开 TCP 连接
浏览器对页面进行渲染呈现给用户
1、客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3、客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。