计算机网络
TCP
三次握手的过程?
刚开始客户端处于closed状态,服务端处于listen状态。
第一次握手:客户端给服务器发送一个SYN握手信号,并指明客户端的初始化序列号ISN,此时客户端进入SYN-SEND状态。
第二次握手:服务端接收到SYN报文后,会给客户端回发一个SYN握手信号,并且也指定了自己的初始化序列号ISN,同时会把客户端ISN+1作为ACK的值,此时服务器处于SYN-RCVD状态。
第三次握手:客户端收到SYN报文后,回发一个服务端ISN+1作为ACK的值进行确认,此时客户端处于established状态。
服务器接收到ACK报文后,也处于established状态,此时双方就建立了连接。
三次握手的作用?
- 确认双方的接受能力、发送能力是否正常
- 指定自己的初始化序列号,为后面的可靠传输做准备。
ISN是固定的吗?
三次握手都一个重要功能是客户端和服务端交换ISN,以便让对方直到接下来接收数据的时候如何按序列号组装数据。
如果ISN是固定的,攻击者很容易猜出后续的确认号,因此ISN是动态生成的。
什么是半连接队列?
服务器会把未完全建立连接的请求放在一个队列里,未完全建立连接的请求就是还未完成第三次握手的请求,服务器发送完SYN-ACK包后,等待客户的确认包,等待一段时间仍未收到客户确认包则会进行重传,重传次数超过规定次数上限的请求会从半连接队列中移除。
三次握手过程中可以携带数据吗?
第三次握手可以携带数据,而第一次不行。
先说为什么第一次不行:假如第一次握手可以携带数据的话,如果有⼈要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第⼀次握手可以放数据的话,其中⼀个简单的原因就是会让服务器更加容易受到攻击了。
第三次可以的原因:客户端已经直到服务器的接收和发送能力正常了,只是服务器还不知道客户端的接受能力是否正常而已。
四次挥手的过程?
刚开始双方都处于established状态,假如客户端此时发起了关闭请求:
第一次挥手:客户端发送一个FIN报文,指定一个序列号。此时客户端处于FIN_WAIT1状态
第二次挥手:服务端收到FIN之后,会回发ACK报文(ACK的值是客户端序列号+1),表明已经收到客户端报文了,此时服务端处于CLOSE_WAIT状态
第三次挥手:服务端也想断开连接了,给客户端发送一个FIN报文并制定一个序列号,此时服务端处于LAST_ACK状态
第四次挥手:客户端收到FIN之后,一样发送一个ACK报文作为应答,且把ACK回发给服务端,此时客户端处于TIME_WAIT状态,需要过一阵子(2个TTL)确保服务端收到自己的ACK报文之后才会进入CLOSED状态
服务端收到ACK报文后,就进入CLOSED状态了,如果超过一定时间没收到,则会重发FIN报文,这也就是客户端需要等待的原因。
SYN泛洪攻击是什么?如何解决?
SYN Flood顾名思义就是用洪水一样的SYN报文进行攻击。SYN报文指的是TCP协议中的Synchronize报文,是TCP三次握手过程中的首个报文。在连接超时之前,服务器会一直等待ACK报文,此时该连接状态为半开放连接(也被称为半连接)。半连接会占用服务器的连接数,当连接数被占满时,服务器就无法提供正常的服务了。黑客正是通过这个机制来实现SYN Flood。
由于攻击者通常是变源IP,不能通过限制同一IP连接请求数量来解决;提高服务能力也没有从根源上解决问题。
使用Anti-DDos系统,将其部署在网络入口处,在服务器处理SYN报文前识别出虚假源,屏蔽来自这些地址的报文,只将合法的SYN报文传递给服务器。
Anti-DDoS系统处理SYN报文主要有两种手段,源认证和首包丢弃。
源认证: Anti-DDoS系统拦截客户端发送的SYN报文,代替服务器向客户端发送SYN-ACK报文,如果客户端不应答,则认为该客户端为虚假源;如果客户端应答,则Anti-DDoS系统认为该客户端为真实源,并将其IP地址加入白名单,在一段时间允许该源发送的所有SYN报文通过,也不做代答。
首包丢弃: 如果Anti-DDoS系统代替服务器应答了所有的SYN Flood攻击报文,那么性能瓶颈仅仅是从服务器转移到了Anti-DDoS系统而已。一旦Anti-DDoS系统的系统资源耗尽,攻击依旧会透传到服务器,而且大量反弹的SYN-ACK报文也会对网络造成一定的压力。Anti-DDoS系统利用首包丢弃来解决这个问题。
TCP协议的可靠性不仅体现在三次握手,还体现在超时与重传的机制。正常情况下客户端发送SYN报文后如果在一定时间没有收到服务器的SYN-ACK应答,客户端会重新发送SYN报文。Anti-DDoS系统会丢弃掉收到的第一个SYN报文。 SYN Flood攻击时,黑客发送的绝大多数是变源的SYN报文,所有的SYN报文对于Anti-DDoS系统来说都是首包,都将被直接丢弃。如果客户端重传了SYN报文,Anti-DDoS系统再对该报文进行源认证。如此一来,大大减少了Anti-DDoS系统代答的压力。首包丢弃和源认证两种手段结合,对于防御SYN Flood(特别是不断变换源IP和源端口的虚假源攻击)非常有效。
TCP的可靠性原理
-
传输信道无差错,保证传输数据正确
(1) TCP的三次握手建立连接,确保传输信道是可靠的
(2) 校验和,确保传输过程中的数据不改动
(3) 连续ARQ协议来保证数据传输的正确性
-
不管发送方以多快速度发送数据,接收方总是来得及处理收到的数据
(1) 流量控制,维护发送窗口的大小
(2) 拥塞避免,慢开始、拥塞避免、快重传、快恢复
常用的基于TCP和UDP的协议
TCP: HTTP、HTTPS、FTP、TELNET、SMTP
UDP: TFTP、DNS、DHCP、TFTP、SNMP、RIP
要求性能的交互性应用,使用UDP
要求可靠性的信息传输,使用TCP
TCP如何保证可靠传输?
-
有序性: TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层
-
传输正确性: 校验和是一个端到端的校验机制,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。
-
重复性: TCP接收端会丢弃重复的数据
-
避免丢包:
-
流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止丢包。
-
拥塞控制:当网络拥塞时,减少数据的发送。TCP发送方维持一个拥塞窗口的状态变量,大小取决于网络的拥塞程度,并且动态变化。TCP的拥塞控制采用了四种算法,慢开始、拥塞避免、快重传、快恢复。
慢开始: 拥塞窗口由小到大试探,每一个传播轮次拥塞窗口加倍。
拥塞避免: 拥塞窗口缓慢增大,每经过一个往返时间(RTT)就把发送的窗口加一。
快重传与快恢复: 快速恢复丢失的数据包,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段,就不会因为重传时要求的暂停被耽误传输。
-
-
收到后确认机制: ARQ协议,分为停止等待(发完一个分组就停下来等待对方确认,否则重传。效率比较低)、连续ARQ协议(维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认,接受方采用累积确认。信道利用率高)
说一说TCP和UDP的区别?
TCP面向连接,UDP是无传输的
TCP端到端通信,UDP支持一对一、一对多、多对多的通信
TCP提供可靠的传输服务,UDP是尽最大努力交付,不保证可靠性
TCP面向字节流,UDP是面向报文的
HTTP
POST和GET的区别有哪些
GET用于获取资源,POST用于传输实体。
参数:GET的参数出现在URL中(URL只支持ASCII码,因此存在中文时需要先进行编码);POST的参数存储在实体主体中。
安全性:GET方法不会改变服务器状态,是安全的;POST方法可能会改变服务器的状态,因此是不安全的。
幂等性:GET是幂等性的,POST等不安全方法是非幂等性的。
可缓存:GET方法本身是可缓存的,POST方法在多数情况下不可缓存。
(但要实现缓存功能,还需要响应报文的状态码是可缓存的,且响应报文的Cache-Control首部字段没有指定不进行缓存)
HTTP 1.0/1.1/2.0的区别
http 1.0:默认短连接,可以开启长连接
宏观
在浏览器上输入url地址到显示主页的过程都发生了什么?
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析浏览页面
- 连接断开