1 浏览器发出一个请求到收到响应经历了什么?
- 解析用户输入的url,生成一个HTTP格式的请求
- 若是输入域名,从hosts文件找对应的ip,如果hosts文件找不到,在电脑配置的DNs进行域名解析,得到IP地址。
- 浏览器通过操作系统将请求通过四层网络协议发送出去。
- 途中可能经过路由器,交换机,最终到达服务器。
- 服务器收到请求后,根据请求找到指定的端口,将请求传递给绑定端口的应用,比如8080被tomcat占用了。
- tomcat接受到请求数据后,按照http协议解析得到所要访问的servlet。
- servlet处理这个请求,如果是springmvc中的dispatcherServlet,则会找到对应的controller中的方法,并执行该方法得到结果。
- tomcat得到响应结果后封装成http响应的格式,并再次通过网络发送到浏览器所在的服务器器。
- 浏览器所在的服务器拿到结果,再传递给浏览器,浏览器解析并渲染。
2 跨域请求是什么?有什么问题?怎么解决?
概念:跨域在浏览器中发起网络请求,会检查协议,域名,端口和当前windows对象所对应的地址是否一致,如果不一致,则会收到限制。如果是img,iframe,script标签src属性去访问是可以的。
解决:
- response添加header,resp.setHeader("Access-Control-Allow-Origin","*")
- jsonp,底层原理基于script标签实现
- nginx代理转发
- 应用程序转发。
3 TCP的三次握手和四次分手?
TCP协议是7层网络协议种的传输层协议,负责数据的可靠传输。
建立TCP连接时,需要通过3次握手来建立:
- 客户端向服务端发出SYN
- 服务端收到SYN后,给客户端发送一个SYN_ACK
- 客户端收到SYN_ACK后,向服务端发送ACK。
断开TCP连接,需要通过四次挥手断开:
- 客户端向服务端发送FIN
- 服务端收到FIN后,向客户端发送ACK,表示我收到端口连接的请求,客户端不需要再发送数据了,不过服务端可能还有数据正在处理。缓存
- 服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接了。
- 客户端收到服务端的FIN,向服务端发送ACK,表示客户端也断开连接。
4 为什么链接的时候是三次握手?
第一次握手,是建立客户端到服务端的连接,
第二次握手,服务端确定收到第一次握手,以及建立服务端到客户端的连接。
第三次握手,是客户端确定收到第二次握手。
总的来说:三次握手是为了确定双方的接受能力和发送能力是否正常。
5 什么是半连接队列?
存没有建立完全连接的请求连接。
比如SYN_SEND,SYN_RVCD
6 ISN(initial sequence number)是固定的吗?
动态生成的。随着时间动态变化,每一个连接都会有不同的isn。
三次握手过程总,客户端和服务端交换ISN,以便对方知道接下来接受数据如何排序组装数据。
如果ISN固定,有坑你被攻击者猜出后续的确认号,进行恶意攻击。
7 三次握手过程中,可以携带数据吗?
前2次不能,最后一次可以。
如果还没建立完全连接,就会恶意请求发送大量携带数据的SYN请求攻击服务器,而服务器需要花费大量时间,内存空间
接受这些恶意请求,容易造成系统宕机。这种模式也是SYN攻击,是DoS/DDos攻击的一种。
8 如果第三次握手丢失了,客户端服务端会如何处理?
服务端:会有超时重传机制,但是每次重传的时间差各不一样。如果重传次数到了,就会把请求信息从半请求队列中移除。
客户端:收到服务器的重传,会重新发出第三次握手。
9 SYN攻击是什么?
服务器资源是第二次握手分配的。
客户端资源是第三次握手分配的。
所以服务端容易收到SYN洪泛攻击。
客户端短时间内伪造大量不存在的ip地址,并向服务端发送SYN包,服务端不断回复确认包,并等待客户端确定包。
由于ip地址不存在,导致服务端需要不断发确认包,直至超时。导致伪造的SYN包长时间占用半连接队列。
导致正常连接的SYN包因为队列满了,被丢弃。从而引起网络拥挤,甚至系统宕机。
10 挥手为什么是四次?
其实本质上,就是问为什么不把第二次挥手ACK和第三次挥手SYN何在一次挥手。
第二次挥手ACK是应答的,第三次挥手SYN是用来同步的。
当服务端收到FIN报文时,可能不会立即关闭socket,因为还有之前的报文在处理中,所以会先发一个ACK应答报文,告诉客户端,我收到你的FIN报文。
只有等到服务端把所有相关的连接处理完了,才会发FIN报文。因此不能整成一个挥手完成ACK和SYN。
11 四次挥手释放连接时,等待2MSL的意义?
- 保证客户端发送的最后一个ACK包能到达服务端。
- 防止“已失效的连接请求报文段”出现在本连接中。
预防服务端没有收到客户端的ACK,服务端会超时重传FIN-ACK包,等待2MSL,可以让客户端在这个时间内重新一次ACK包,重新开启时间等待器,
确保客户端和服务端都能正常关闭连接。假设没有等待2MSL,客户端的ACK包丢了,服务端就无法进入关闭连接的状态。
12 http的长连接和短连接(TCP连接)
http协议-应用层
tcp协议-传输层
http是请求/相应模式。只要服务把响应结果返回,那么连接就结束了。这里的长连接是指tcp连接可以复用。而不是http连接一直不关闭。