HTTP、TCP常见问题概述
1、说说一个请求从输入URL到展示页面的全部过程?
- 根据
域名
解析IP,检查本地是否有缓存,在DNS服务器上,一直往上查找对应IP为止。 - 开始
TCP连接
,确认可以进行通讯。 - 发起了
HTTP请求
,携带请求头、请求体等消息。 - 服务器进行处理并且返回了
HTTP报文
。 - 浏览器根据返回的
HTML、CSS
等进行解析渲染页面。 - 结束连接,四次挥手。
2、谈谈TCP和UDP差异?
主要的差异如下:
- TCP定位是承担一个可靠的传输,只能点对点传输并且速度较慢,传输相同数据消耗资源更多;
- UDP则定位是一个更加快速的传输数据但是相对不可靠,可能出现丢包异常,但是可以做到一对多传输并且速度较快,资源消耗较小。
- TCP面向连接,每次通讯都需要握手,结束通讯也需要挥手告别,传输需要应答机制,还有重传机制等保证TCP的可靠性,而且TCP面向流的,可能会出现粘包、拆包现象。
- UDP没有上述这么多机制,直接指向了目的地址之后发送数据就不管,不连接也不确认也不用重传,数据报文相比于TCP更加简单,没有那么多麻烦的机制。
3、谈谈三次握手、四次挥手?
- 主动连接方是
客户端
,第一次握手由客户端发起连接请求SYN
,试探服务器是否正常应答;第二次握手则是由服务端
发起了SYN + ACK
,应答客户端请求同时发起SYN
来试探客户端是否正常应答,第三次握手由客户端发起了ACK
应答服务器的试探。 - 主动关闭方是
客户端
,客户端close
进入第一次挥手由客户端发起释放请求FIN
,标识客户端不能够发送数据了; - 第二次挥手由
服务端
应答客户端的FIN
,此时服务器进入close wait
状态,可能之前客户端发送的数据还没有完全到达或者服务端还存在数据未发送,这些都是应用层
说了算,之后由应用层来决定是否调用close方法
来关闭连接,socket没有close连接就会一直处于这个状态,也不会释放资源。 - 调用
close
之后,第三次挥手就是由服务器
发起释放连接请求FIN
,表示服务端不再发送数据了。 - 第四次挥手由
客户端
发起了应答,因为应答的状态不确定服务端是否能收到,若服务端没有收到则持续重发FIN
,所以客户端需要进入time wait
状态等待2MSL,也就是客户端数据传输到服务端的时间
,看看服务器是否重传了FIN
,若重传了则需要重新应答,加强TCP连接的可靠性,也可以防止FIN未得到处理影响后续的连接。 HTTP
则是服务端主动关闭,也就是若有少量的客户端进行大量的短连接并且不断连接释放资源,就会出现很多的time wait状态
,从而影响服务器的性能,类似网关。网关基本描述。
4、谈谈HTTPS的原理
- HTTPS是一个加密传输协议,利用加密算法,对报文进行了加密传输,HTTPS是通过非对称加密算法来确认传输的秘钥后,再次使用堆成加密算法进行信息的加密传输。对称加密和非对称加密。
- HTTPS协议通信涉及第三方服务器做证书的验证,首先
客户端
向服务端
发送请求,服务器返回证书和公钥给客户端
,之后客户端向权威机构去验证服务端发送的公钥和证书是否正确。 - 若上述步骤正确无误,则客户端生成一个随机数后用公钥进行加密发送,因为公钥加密只有私钥能解密,私钥只有服务器拥有,所以只有服务器额能解密得到客户端的随机数。
- 现在客户端和服务端都拥有了一个相同的随机数作为加密钥匙,所以接下来的数据传输都是基于这个钥匙进行对称加密,一方加密一方解密即可,因为钥匙只有双方拥有所以其他人无法解密的。
5、http长连接和短连接差异?
长链接:
- 传输数据之后连接保持不释放,下次数据传输可以不用再次进行TCP连接即可直接传输数据,长链接有一个
探活
机制,服务器会在一段时间内不传输数据之后进行发送一个探活报文到客户端验证,若客户端不能正常返回则说明客户端挂掉了,则进行关闭连接。 - 当然客户端也可以手动关闭连接,若一些客户端数量固定并且频繁传输数据,类似网关下游或者反向代理,服务器可以设置长连接的方式,由于短连接不断地连接释放造成资源的浪费,并且频繁开断也会导致大量连接处于
time wait
状态影响并发性能。
6、谈谈为什么要禁止跨域请求?
跨域请求会带来安全问题,用户A在某站利用Ajax请求b,但是b站用户之前登录了有cookie所以就不用登录,这样A站可以静默获取当前用户在b站的信息,也就是CSRF攻击。
跨域可以通过服务端进行解除限制,但是服务端需要自己承受被攻击的风险。