目录
- 八股整理(四)
- 应用层
- 1:怎么解决tcp粘包?
- 2:tcp的拥塞控制介绍一下?
- 网络场景
- 1:描述一下打开百度首页后发生的网络过程?
- 2:网页非常慢转圈圈的时候需要从哪些方面考虑问题?
- 3:server a和server b如何判断两个服务器是否正常连接?
- 4:服务器ping不通但是http请求能请求成功,会出现这种情况吗?为社么?
- 网络攻击
- 1:什么是dns劫持?
- 2:sql注入的问题是什么?
八股整理(四)
应用层
1:怎么解决tcp粘包?
因为tcp的传输方式,导致在传输过程中,多个小的数据包会合并成一个数据包,且包的边界不明确,造成粘包;
粘包的原因:
1:nagle算法:
在网络拥堵时,nagle算法会将多个小的数据包合并成一个数据包,从而减少网络中数据包的数量;
2:tcp流量控制,和拥塞控制:
如果网络或者接收端处理速度较慢,就会将多个数据包合并成一个;
如何解决:
1:固定长度:所有的数据包都是固定的长度,接收端根据固定长度来读取每个数据包,但是这种无法适用于动态长度的情况;
2:分隔符:每个包都使用特殊的分隔符来区分包的边界,接收端通过识别分隔符来区分每个数据包;这种的话要注意对消息中的特殊分隔符进行转义,防止错误解析;
3:头部长度字段:每个数据包的头部都添加数据包长度的字段,接受端根据头部指定的长度来区分每个数据包;
2:tcp的拥塞控制介绍一下?
在网络拥塞的时候,发送的数据包往往会丢失,而tcp协议中包丢失后会进行重传,这样就导致网络更加拥塞。
于是tcp就使用拥塞控制机制避免,拥塞控制,是在网络拥塞的时候控制包发送的频率;
控制发送要使用拥塞窗口,拥塞窗口指定了发送端发送数据的量。当网络良好时,拥塞窗口会变大,当网络拥塞时,拥塞窗口会变小;
拥塞控制的算法有四种:分别是慢开始,拥塞避免,拥塞发生,快速恢复:
1:慢开始:
从发送的初始量开始,每接收到一个ack,拥塞窗口就会加一。
也就是会呈指数增长;
2:拥塞避免:
当拥塞窗口的大小到达了设定的满开始门阀后会进入拥塞避免算法;
拥塞避免算法是每接收一个ack,窗口的大小就会加窗口大小分之一,所以是呈线性增长的;
3:拥塞发生:
当发生拥塞时,也就是数据包重传时会使用拥塞发生算法:
重传的方式有两种:
1:超时重传:
发生超时重传后会使用拥塞发生算法:
首先:满开始门限变为此时的拥塞窗口的二分之一;
然后拥塞窗口变为初始值;
2:快速重传:
拥塞窗口变为原来的二分只一;
满开始门限变为此时的拥塞窗口然后进入快恢复算法;
3:快恢复:
快恢复算法往往结合着快重传算法一起;
首先拥塞窗口变为满开始门限加三:
然后重传数据,收到一个ack拥塞窗口加一;
接收到新数据的ack后,拥塞窗口变为满开始门限的大小,然后开始拥塞避免算法;
网络场景
1:描述一下打开百度首页后发生的网络过程?
1:解析url:首先分析url的协议和请求的资源路径。如果请求的协议或者是资源路径是不合法的,那么就会将输入栏中的内容交给搜索引擎。如果是合法的,会先将url中的非法字符转义,然后进入下一过程
2:缓存判断:解析完url后,判断请求的资源缓存中释放存在,如果存在直接返回,如果不存在就发生请求获取资源;
3:dns解析:如果缓存不在本地,就要进行dns解析。首先会发给本地dns服务器进行域名解析,然后逐级解析获取到目标ip地址;
4:获取mac地址:在传输层会获取本地ip地址,还有目标ip地址,然后传递给网络层,然后会发送给数据链路层,数据链路层通信需要加入双方的mac地址,以本机的mac地址作为源mac地址,然后去获取目标mac地址,目标mac地址的获取有两种情况:
1:通过目标IP地址与本机的子网掩码做与运算判断目标服务器和本机是否在同一子网下,如果是那么就通过arp协议获取到目标的mac地址;
2:如果不在同一子网下,就应该把请求发送给网关由网关转发,同样也需要使用arp协议获取网关的mac地址,此时的目标mac地址就是网关的mac地址;
5:建立tcp连接:通过tcp三次握手建立连接;
6:如果是https请求还需要ttl四次握手;
7:发送http请求;
8:获得响应,解析数据;
2:网页非常慢转圈圈的时候需要从哪些方面考虑问题?
主要检查网络是否正常,网络设置是否正确,dns是否正确解析ip地址,tcp三次握手有没有三次握手,http的响应码是什么?
3:server a和server b如何判断两个服务器是否正常连接?
tcp有保活机制,如果两个连接之间长时间没有活动那么就会触发保活机制,每隔一段时间就会发送一个探测报文,如果多个探测报文都没有回应,那么就说明当前的tcp连接已经死亡,就会断开连接;
一般linux内核中有触发保活机制的时间:2小时,探测报文发送的间隔时间:75秒,探测次数:9词;
而tcp保活机制需要的时间太长,我们可以在应用层实现类似的心跳机制:
web服务软件一般都会提供keepalive-timeout,即http长连接的超时时间,如果在超时时间内没有任何活动就会断开连接;
4:服务器ping不通但是http请求能请求成功,会出现这种情况吗?为社么?
会出现这种情况:ping是基于icmp协议,而http请求是基于tcp协议;
有的服务器的防火墙可能会禁止icmp协议,但是tcp协议是正常的,所以就会出现,服务器ping不通但是http请求能成功;
网络攻击
1:什么是dns劫持?
用户查询dns服务器时,劫持响应数据篡改结果,导致发送错误的映射,使用户错误的认为访问的是正确的网址;
2:sql注入的问题是什么?
sql注入是当用户的输入被应用程序当成sql语句的一部分是会发生;
如何解决:
1:进行验证和转义:在将用户输入当做sql语句之前,先进行sql的验证和转义。确保符合预定的格式。防止输入可能作为sql注入的特殊字符;
2:使用参数化查询:用预先设定好的参数来接收用户的输入,然后将用户的输入发送给数据库引擎执行;
3:设置权限,设置用户的数据库权限;
4:使用输入过滤;