计算机网络常见面试题整理

1. 说说HTTP常用的状态码及其含义?

 

2. HTTP 常用的请求方式,区别和用途?

 

3. 请简单说一下你了解的端口及对应的服务?

 

4. 说下计算机网络体系结构 

 

讲讲osi七层模型每层的含义

 应用层:网络服务与最终用户的一个接口,常见的协议有:HTTP FTP  SMTP SNMP DNS.

表示层:数据的表示、安全、压缩。,确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取

会话层:建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话

传输层:定义传输数据的协议端口号,以及流控和差错校验,协议有TCP UDP.

网络层:进行逻辑地址寻址,实现不同网络之间的路径选择,协议有ICMP IGMP IP等.

数据链路层:在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。

物理层:建立、维护、断开物理连接。

5 如何理解HTTP协议是无状态的

   当浏览器第一次给服务器发送请求时,服务器会回应。但是再次发送请求时,服务器也会回应,但是它并不知道是谁发送过来的。简言之,服务器不会去记住你是谁,所以是无状态协议。

6.从浏览器地址栏输入url到显示主页的过程

  涉及到dns解析,tcp的三次握手,http请求传输,服务器处理请求并返回网页内容,浏览器解析并渲染页面,四次挥手等知识点。

7. 说下HTTP/1.0,1.1,2.0的区别

HTTP/1.0默认是短连接,可以强制开启,HTTP/1.1默认长连接,HTTP/2.0采用多路复用

 短链接:每次请求都需要建立一个TCP连接。 http1.0可以通过设置Connection: keep-alive 这个字段,强制开启长连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才具有真正的长连接和短连接这一说法

多路复用:在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。

8.  POST和GET有哪些区别?

http链接超时机制

HTTP一般会有httpd守护进程,里面可以设置keep-alive timeout,当tcp连接闲置超过这个时间就会关闭,也可以在HTTP的header里面设置超时时间

9.HTTP 与 HTTPS 的区别。

HTTP,即超文本传输协议,是一个基于TCP/IP通信协议来传递明文数据的协议。HTTP会存在这几个问题

  • 请求信息是明文传输,容易被窃听截取。

  • 没有验证对方身份,存在被冒充的风险

  • 数据的完整性未校验,容易被中间人篡改

https,可以理解Https是身披SSL(Secure Socket Layer,安全套接层)的HTTP。

10.https工作流程

 

 11.什么是数字签名?什么是数字证书?

数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。它的出现,是为了避免身份被篡改冒充的。比如Https的数字证书,就是为了避免公钥被中间人冒充篡改:

数字证书构成

  • 公钥和个人等信息,经过Hash摘要算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名

  • 公钥和个人信息、数字签名共同构成数字证书

12.说说DNS的解析过程?

DNS,英文全称是domain name system,域名解析系统,是Internet上作为域名和IP相互映射的一个分布式数据库。它的作用很明确,就是可以根据域名查出对应的IP地址。

假设你要查询www.baidu.com的IP地址:

  • 首先会查找浏览器的缓存,看看是否能找到www.baidu.com对应的IP地址,找到就直接返回;否则进行下一步。

  • 将请求发往给本地DNS服务器,如果查找到也直接返回,否则继续进行下一步;

  • 本地DNS服务器向根域名服务器发送请求,根域名服务器返回负责.com的顶级域名服务器的IP地址的列表。

  • 本地DNS服务器再向其中一个负责.com的顶级域名服务器发送一个请求,返回负责.baidu的权威域名服务器的IP地址列表。

  • 本地DNS服务器再向其中一个权威域名服务器发送一个请求,返回www.baidu.com所对应的IP地址。

13.什么是CSRF攻击,如何避免

CSRF,跨站请求伪造(英文全称是Cross-site request forgery),是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

怎么解决CSRF攻击呢?

  • 检查Referer字段。

  • 添加校验token。

14.什么是DoS、DDoS、DRDoS攻击?

  • DOS: (Denial of Service),翻译过来就是拒绝服务,一切能引起DOS行为的攻击都被称为DOS攻击。最常见的DoS攻击就有计算机网络宽带攻击连通性攻击

  • DDoS: (Distributed Denial of Service),翻译过来是分布式拒绝服务。是指处于不同位置的多个攻击者同时向一个或几个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。常见的DDos有SYN Flood、Ping of Death、ACK Flood、UDP Flood等。

  • DRDoS: (Distributed Reflection Denial of Service),中文是分布式反射拒绝服务,该方式靠的是发送大量带有被害者IP地址的数据包给攻击主机,然后攻击主机对IP地址源做出大量回应,从而形成拒绝服务攻击。

15.什么是XSS攻击,如何避免?

XSS,叫跨站脚本攻击(Cross-Site Scripting)它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS攻击一般分三种类型:存储型 、反射型 、DOM型XSS

如何解决XSS攻击问题?

  • 对输入进行过滤,过滤标签等,只允许合法值。

  • HTML转义

  • 对于链接跳转,如<a href="xxx" 等,要校验内容,禁止以script开头的非法链接。

  • 限制输入长度

 16.聊聊SQL注入?

前端搜索界面,输入一个查询参数,点击查询后,该参数传递到后台,然后后台通过SQL把结果查询出来。

参数: name = 小明

SQL= "select * from staff where name=" + name;

因为SQL是直接拼接的,如果我们完全信任前端传的参数的话。假如前端传这么一个参数时'' or '1'='1'

select * from staff where name='' or '1'='1'; 这样由于1=1恒成立,所以就会返回staff表中所有信息,造成信息泄露

如何预防SQL注入问题

1). 使用#{}而不是 ${}

在MyBatis中,使用#{}而不是${},可以很大程度防止sql注入。

  • 因为#{}是一个参数占位符,对于字符串类型,会自动加上"",其他类型不加。由于Mybatis采用预编译,其后的参数不会再进行SQL编译,所以一定程度上防止SQL注入。

  • ${}是一个简单的字符串替换,字符串是什么,就会解析成什么,存在SQL注入风险

2). 不要暴露一些不必要的日志或者安全信息,比如避免直接响应一些sql异常信息。

如果SQL发生异常了,不要把这些信息暴露响应给用户,可以自定义异常进行响应

3). 不相信任何外部输入参数,过滤参数中含有的一些数据库关键词关键词

可以加个参数校验过滤的方法,过滤union,or等数据库关键词

4). 适当的权限控制

在你查询信息时,先校验下当前用户是否有这个权限。比如说,实现代码的时候,可以让用户多传一个企业Id什么的,或者获取当前用户的session信息等,在查询前,先校验一下当前用户是否是这个企业下的等等,是的话才有这个查询员工的权限。

17. Session和Cookie的区别

 

  • Cookie是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个Cookie,客户端就把Cookie保存起来。在客户端下次向同一服务器再发起请求时,Cookie被携带发送到服务器。服务器就是根据这个Cookie来确认身份的。

  • session指的就是服务器和客户端一次会话的过程。Session利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。Session对象存储着特定用户会话所需的属性及配置信息。

 

  • 用户第一次请求服务器时,服务器根据用户提交的信息,创建对应的Session,请求返回时将此Session的唯一标识信息SessionID返回给浏览器,浏览器接收到服务器返回的SessionID信息后,会将此信息存入Cookie中,同时Cookie记录此SessionID是属于哪个域名。

  • 当用户第二次访问服务器时,请求会自动判断此域名下是否存在Cookie信息,如果存在,则自动将Cookie信息也发送给服务端,服务端会从Cookie中获取SessionID,再根据 SessionID查找对应的 Session信息,如果没有找到,说明用户没有登录或者登录失效,如果找到Session证明用户已经登录可执行后面操作。

18.有了IP地址,为什么还要用MAC地址?

 

  • 简而言之,标识网络中的一台计算机,比较常用的就是IP地址和MAC地址,但计算机的IP地址可由用户自行更改,管理起来就相对困难,而MAC地址不可更改,所以一般会把IP地址和MAC地址组合起来使用。

  • 那只使用MAC地址不用IP地址行不行呢?不行的!因为最早就是MAC地址先出现的,并且当时并不用IP地址,只用MAC地址,后来随着网络中的设备越来越多,整个路由过程越来越复杂,便出现了子网的概念。对于目的地址在其他子网的数据包,路由只需要将数据包送到那个子网即可。

  • 那为什么要用IP地址呢?是因为IP地址是和地域相关的,对于同一个子网上的设备,IP地址的前缀都是一样的,这样路由器通过IP地址的前缀就知道设备在在哪个子网上了,而只用MAC地址的话,路由器则需要记住每个MAC地址在哪个子网,这需要路由器有极大的存储空间,是无法实现的。

  • IP地址可以比作为地址,MAC地址为收件人,在一次通信过程中,两者是缺一不可的。

 19.如果服务器出现了大量CLOSE_WAIT状态原因是什么

tcp四次挥手流程如下

 

  • 服务器端收到客户端发送的FIN后,TCP协议栈就会自动发送ACK,接着进入CLOSE_WAIT状态。

  • 但是如果服务器端不执行socket的close()操作,那么就没法进入LAST_ACK,导致大量连接处于CLOSE_WAIT状态

  • 所以,如果服务器出现了大量CLOSE_WAIT状态,一般是程序Bug,或者关闭socket不及时。

20.介绍一下TCP 的三次握手机制

流程如下:

为什么必须要三次握手?

为了确保双方都知道对方收到了自己的消息。比如说小明对小红说中午一起吃饭,小红回复说好的,小明收到回复后,为了让对方知道消息被接受,回复一句好的。这样饭局就约好了。

如果只建立两次挥手的话,会造成如下场景:

客户端向服务端发起一个syn同步请求,但是由于网络波动,该条请求丢失了,没法送到服务端,由于客户端没收到服务端的回复,就会触发重发机制,再次发送请求,这次服务端收到了并回复ack码,连接建立起来。但是此时第一个syn请求由于网络恢复了,也发送到服务端,服务端收到后,也回复ack建立连接,由于这n个连接并没有实际使用,所以服务端和客户端都处于监听状态,导致无效连接。 使用三次握手就能回避这个问题

21.介绍以下tcp的四次挥手

流程如下:

  1. 第一次挥手(FIN=1,seq=u),发送完毕后,客户端进入FIN_WAIT_1状态。

  2. 第二次挥手(ACK=1,ack=u+1,seq =v),发送完毕后,服务器端进入CLOSE_WAIT状态,客户端接收到这个确认包之后,进入FIN_WAIT_2状态。

  3. 第三次挥手(FIN=1,ACK1,seq=w,ack=u+1),发送完毕后,服务器端进入LAST_ACK状态,等待来自客户端的最后一个ACK。

  4. 第四次挥手(ACK=1,seq=u+1,ack=w+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。

为什么要四次?

举个例子:小明和小红打电话聊天,通话差不多要结束时,小红说,“我没啥要说的了”。小明回答,“我知道了”。但是小明可能还有要说的话,小红不能要求小明跟着她自己的节奏结束通话,于是小明可能又叽叽歪歪说了一通,最后小明说,“我说完了”,小红回答,“我知道了”,这样通话才算结束。

TCP四次挥手过程中,为什么需要等待2MSL,才进入CLOSED关闭状态

假设tcp挥手由客户端发起,为了保证客户端发送的最后一个ACK报文段能够到达服务端。 这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的服务端就收不到对已发送的FIN + ACK报文段的确认。服务端会超时重传这个FIN+ACK 报文段,而客户端就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段。接着客户端重传一次确认,重新启动2MSL计时器。最后,客户端和服务器都正常进入到CLOSED状态。

 22.TCP的粘包和拆包

TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

 

为什么会产生粘包和拆包呢?

  • 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;

  • 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;

  • 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;

  • 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。

解决方案:

  • 发送端将每个数据包封装为固定长度

  • 在数据尾部增加特殊字符进行分割

  • 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值