1、SYN泛洪攻击是什么?如何预防?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是客户端在短时间内伪造大量不存在的IP地址,并向服务器不断地发送SYN报文段,服务器则回复确认报文段,并等待客户端确认,由于源地址不存在,因此服务器需要不断重发直至超时,这些伪造的SYN报文段将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的
DoS/DDoS
攻击。预防方法:
- 首先SYN攻击没有根除的方法,除非不使用TCP;
- 增加最大半连接的数目;
- 缩短半连接的超时(Time out)时间;
SYN Cookie
技术。
2、什么是SYN Cookie技术?
SYN Cookie的作用就是在完成三次握手前不为任何一个连接分配任何资源,其原理是将一些本该在服务器上保存的连接信息编码成到返回给客户端的ACK报文段中的ISN。服务器在接收到客户端的SYN报文段后,不把它加入到半连接队列中,而是根据这个SYN报文段的内容(四元组)计算出一个cookie值,计算过程就是通过hash等单向散列函数计算,将这个cookie作为返回的ACK报文段的初始序列号(ISN),当客户端返回一个ACK报文段时(第三次握手),把该ACK报文段的四元组同样进行hash计算,再跟其中的确认号减1对比,若一致,则建立连接。
3、什么是TCP粘包?如何解决?
TCP粘包是指发送方发送的若干数据段到达接收方是粘成一包,从接收缓冲区来看,后一包数据的头部紧贴着前一包数据的尾部。解决方案:
- 关闭Nagle算法;
- 通过特殊标识符表示数据包边界,如:\r\n,\t等;
- 在TCP报文段头部加上表示数据段长度的信息;
- 在应用层发送数据时定长发送。
4、什么是TCP拥塞控制?
TCP只能看到对端的接受空间大小,看不到网络状况,所以只能通过试探性的方式来控制拥塞,拥塞控制主要完成两个任务:公平性和拥塞过后的恢复。在拥塞控制算法中,Reno是目前应用最广泛且较为成熟的算法,Reno算法包含四个部分:慢启动、拥塞避免、快速重传、快速恢复:
- 慢启动:所谓慢启动,也就是TCP连接刚建立,一点一点地提速,试探网络的承受能力,以免直接扰乱了网络通道的秩序。初始化拥塞窗口(
cwnd
)的大小为1,每过一个RTT时间,拥塞窗口值翻倍(即每收到一个ACK,窗口大小增加1);- 拥塞避免:当拥塞窗口大小达到慢启动门限值(
ssthresh
)时,进入拥塞避免阶段,每经过一个RTT时间,拥塞窗口大小增加1(即每收到一个ACK,窗口大小增加1/cwnd
)。拥塞避免算法可以避免窗口增长过快导致网络拥塞,缓慢地增加调整到网络的最佳值;- 快速重传:如果在RTO之前收到了三个重复的ACK,说明中间有分段丢失需要重传,这个机制不需要等到重传计时器超时,所以叫快速重传。由于发生丢包,将拥塞窗口大小设置为当前的一半,再将慢启动门限值设置为当前拥塞窗口大小,并进入快速恢复阶段;
- 快速恢复:将拥塞窗口大小增加3,因为收到了三个重复的ACK,每接收一个重复ACK,拥塞窗口的值暂时增加1,当接收到一个好的ACK,表明报文段重传成功,退出快速恢复阶段,将拥塞窗口大小设置为慢启动门限值。
5、为什么快速重传是选择收到三次重复ACK触发?
因为收到两次重复ACK很有可能是乱序造成的,三次就很可能是丢包造成的,四次更有可能是丢包,但四次响应策略太慢了,经过实践验证,收到三次重复ACK触发快速重传是效果最好的。
6、什么是TCP流量控制?
流量控制的目的是防止发送方发送太快,耗尽接收方资源,使接收方来不及处理导致丢包,TCP的流量控制通过滑动窗口来实现:
- 使用滑动窗口一次可以发送多条数据,窗口大小是指无需等待确认应答而可以继续发送数据的最大值;
- 发送窗口左侧只有当接收到接收端某段发送数据的ACK响应时才会向右侧移动,左边缘紧贴刚被确认的数据段,接收窗口也只有接收到数据且最左侧连续时才移动接收窗口;
- 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端,发送端会减慢自己的发送速度;
- 接收端缓冲区已满,则将窗口大小设为0,发送端不再发送数据,但需要定期发送一个一字节的窗口探测数据段,使接收端把窗口大小告诉发送端。
7、TCP滑动窗口?
TCP使用滑动窗口来实现流量控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据,同时发送方也可以通过窗口大小来确定应该发送多少数据。当滑动窗口为0时,发送方不能再发送数据,但有两种情况例外:
- 发送紧急数据;
- 发送1字节的数据包来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
8、流量控制与拥塞控制区别?
流量控制发生在发送端和接收端之间,需要通信双方各维护一个发送窗口和一个接收窗口,接收窗口大小由自身决定,发送窗口大小由接收方相应的TCP报文段中窗口大小确定,只是点到点的控制;
拥塞控制通常表示一个全局的过程,拥塞窗口大小变化由试探性发送一定数量数据探查网络状况后而自适应调整,它涉及到网络中所有的主机和路由器。
9、常见的HTTP状态码?
200:请求已成功处理;
301、302:永久重定向、临时重定向;
400:请求报文中存在语法错误;
403:请求被拒绝,404:找不到页面;
500:服务器在执行请求时发生错误;
502:Bad Gateway,已经与后端建立了连接,但超时;
503:服务器暂时处于超负载状态或进行停机维护。
10、RTO和RTT分别是什么?
- RTO(Retransmission Time Out):从上一次发送数据,因为长时间没有收到ACK相应,到下一次重发之间的时间,就是重传间隔,重传次数到达上限后停止重传;
- RTT(Round Trip Time):数据从发送开始,到接收响应的时间间隔,即数据包在网络中一个往返的用时,大小不稳定。
11、TCP和UDP的区别?
- UDP是无连接面向报文的,尽最大努力交付,不保证可靠交付,支持一对一、一对多和多对多的交互通信,首部开销小只有8字节。
- TCP是面向连接的,面向字节流的,提供可靠交付,全双工通信,仅支持一对一的交互通信,首部开销较大有20字节。
12、HTTP与HTTPS区别?
- HTTP协议是明文传输,HTTPS协议是由HTTP+SSL构建的加密网络协议,要比HTTP协议安全;
- HTTP与HTTPS使用完全不同的连接方式,端口也不同,一个用80端口,一个用443端口。
13、HTTPS如何保证数据传输安全?流程是什么?
- 客户端向服务器发起SSL连接请求;
- 服务器把数字证书发送给客户端,客户端取得其中的公钥后,先用数字签名进行验证,如果验证通过就可以开始通信了;
- 客户端生成一个用于对称加密的公钥并用数字证书中的公钥对其进行加密,加密后再发送给服务器;
- 服务器用唯一的私钥解密,得到对称加密所需的公钥;
- 因为非对称加密效率较低,所以在传输数据时用的是对称加密,非对称加密仅仅用来传递对称加密所需的公钥。
非对称加密是通过RSA算法实现的。
14、HTTP的长连接与短连接有何区别?
- 在HTTP/1.0中默认使用短连接,即服务器在发送完一个HTTP响应后会断开TCP连接。这样每次请求都会重新建立和断开TCP连接,代价太大。
- 在HTTP/1.1之后默认使用长连接,即持久连接,除非请求中写明要断开连接,否则该连接就会维持一段时间,减少了开销。
15、Cookie是什么?
HTTP是无状态协议,引入Cookie来保存状态信息(用户登录状态、账号密码、购物车等),Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带上,用于告知服务器2个请求是来自同一浏览器,因为每次请求都要携带Cookie,会增加额外的性能开销。Cookie只能存储ASCII字符。
Cookie的有效期可以通过
maxAge
来设置,单位为秒,默认的maxAge
值是-1,表示临时性Cookie,不会被持久化写到Cookie文件中,而是存在于浏览器内存中,关闭浏览器后Cookie就消失了。
16、Session是什么?
Session的作用与Cookie类似,都是为了保存客户端与服务器连接的状态信息,Session在用户第一次访问服务器的时候自动创建,并且服务器会返回一个Cookie(其中包含了Session ID),客户端收到后将该Cookie值存入浏览器中,客户单之后对同一个服务器进行请求时会携带该Cookie,服务器收到之后取出Session ID,再从Redis中取出用户信息。只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。为了获取更高的存取速度,Session一般存储在服务器的内存中(Redis中),又为了防止内存溢出,服务器会把长时间没有被访问的Session从内存中删。Session可以存储任何类型的数据。
17、GET与POST的区别?
get是获取数据,post是修改数据;
get提交数据有限制(最大2k),post理论上没有限制;
get请求会被浏览器主动缓存,post不会;
get是幂等的,post不是。
幂等性:对于同一操作发起的一次或多次请求的结果是一致的,不会因为多次点击而产生副作用。
18、TCP的延迟确认机制是什么?
TCP的确认机制是累积的,即确认号n表示n之前但不包括n的数据段已经收到了。为了提高网络利用率,在收到数据段后并不会立即回复,而是延迟一段时间,等等看能不能跟接收方要发给发送方的数据一起捎带回去,或者等收到了按序到达的两个包,只对第二个包确认,省去一个ACK报文段的消耗;
除了延迟ACK,还有一个快速ACK。在Linux实现中会根据当前包的收发情况在这两种ACK之间进行切换,延迟ACK能减少发送的分段从而节省了带宽,提高了网络利用率,而快速ACK能及时通知发送方丢包,避免滑动窗口停等,提升吞吐率。
19、什么是糊涂窗口综合征?
每个报文段中有用数据相对于头部信息的比例较小,因此耗费的资源也更多,相应的传输效率也更低,比如传输的头部开销有40字节(IP头10字节+TCP头10字节),而有效载荷只有1字节。
可以采用Nagle算法处理该现象,Nagle算法要求一个tcp连接上最多只有一个已经发送但是未被确认的小分组,且在这个分组被确认之前不能发送其他的小分组。这样tcp就会在发送缓存中积累这些数据比较小的分组,再组装成一个较大的分组,直到收到接收方发来的确认,然后把这个较大的分组发送出去。
20、滑动窗口是越大越好吗?
不是,如果滑动窗口过大,也就是在两次ACK之间一次性发送的字段太多,造成接收端缓存不够而溢出,导致丢包,需要多次发送重复的数据,也同样耗费了网络带宽;如果滑动窗口过小,则需要在网络上频繁的传输确认信息,占用了大量的网络带宽,极端的情况就是停止等待协议,发一个字段等一个ACK,也会造成通信效率下降。
21、UDP没有拥塞控制?为什么?
UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP正好适合这种要求。
22、ping命令使用的协议是什么?
使用的是ICMP(Internet Control Message Protocol)协议,是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。该协议利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。
23、从输入URL到显式页面到底发生了什么?☆☆☆☆☆
- 浏览器首先要做的事情就是解析这个域名,浏览器会先查看本地缓存(hosts文件),查找其中有没有和这个域名对应的规则,有的话就直接使用hosts文件里面的
ip
地址;- 如果本地没有找到对应的
ip
地址,浏览器会发送请求到本地DNS服务器,如果本地DNS服务器有此条记录就可以直接返回,若没有,就继续向上查找顶级域名服务器、根域名服务器等,找到后,本地DNS服务器会把域名和ip
地址的对应关系返回给浏览器,并保存在缓存中;- 得到
ip
地址后,浏览器向服务器发起tcp连接
,触发三次握手过程;- 连接成功后,浏览器向服务器发送http请求报文(请求行、请求头部、空行、请求数据);
- 服务器处理收到的请求,将http相应报文(状态行、响应头部、空行、响应数据)返回给浏览器;
- 浏览器收到http响应,解析html源码,对页面进行渲染后呈现给用户。
24、端口有效范围是多少?由什么决定的?
有效范围为:0~65535,TCP/UDP报头使用2字节来存放端口号,16位二进制数能表示的范围就是0到65535,其中1~1023为指明端口号(HTTP:80、HTTPS:443、FTP:20等),1024~65535为动态窗口范围。
20、为什么DNS使用UDP?
UDP适用于小包,无上下文的情况,开销小,因为DNS是为了返回几个字节的数据,就算失败,重传的开销也不大。因为DNS有时候会需要迭代查询,这种情况下用TCP建立连接的开销太大了。但DNS服务器之间同步DNS信息的时候用的是TCP,因为要保证数据传输的正确性。
帅哥,每收到一个ACK,窗口大小增加1倍。
是这样的,比如现在发送窗口大小为2,发出了两个包,收到第一个包的ACK后窗口大小加1,收到第二个ACK后窗口大小再加1,所以一个RTT时间,窗口大小翻了倍,但是每收到一个ACK只会增加1。而在拥塞避免阶段,每个RTT只会增加1的窗口大小,即每收到一个ACK窗口大小会增加当前窗口大小分之一。
感谢,学到了。看的好细呀。
赞 老哥最近一直在面试吗
已经在投了,目前还没面呢,不过马上要开始疯狂面试了,白天实习上班,晚上回去面试