计算机网络常见面试题

HTTP协议

  1. HTTP 1.0和HTTP 1.1的主要区别是什么

    • 长连接 : 在HTTP/1.0中,默认使用的是短连接 ,每次请求都要重新建立一次连接 HTTP 1.1起,默认使用长连接 ,默认开启**Connection: keep-alive **,这样就可以复用TCP连接。
    • 错误状态响应码 :在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
    • 缓存处理 :在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
    • 带宽优化及网络连接的使用 :HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  2. HTTP 和 HTTPS 的区别。参考链接

    • https协议需要到ca申请证书
    • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
    • 端口也不一样,前者是80,后者是443
    • http1.0是无状态协议;http1.1在应用层是无状态协议,但是ssl/tls是有状态协议,缓存session
  3. 为什么说http是无状态的?Cookie的作用是什么?和Session有什么区别?

    Http 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况 .

    虽然Http是无状态的,但是Web应用是需要有状态的,所以发展出来了Cookie和Session

    Cookie:一段key-value的数据,服务器产生,发送给客户端,可以设置有效时间,保存在浏览器本地。用来浏览器下一次访问服务器时带上,用来标识客户端。Cookie不能跨域,跟设置的path绑定

    Tomcat就使用了Cookie,查看请求报文会发现Cookie中的JSESSIONID字段

    Session:也是一段key-value数据,服务器产生,保存在服务端,可以设置有效时间,**如果session一直活动,session就总不会过期 **。客户端保存了SessionID,服务端根据客户端传过来的sessionId获取保存在服务端的session数据。 保存这个sessionid的方式可以采用 cookie机制 ,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器;若浏览器禁用Cookie的话,可以通过 URL重写机制 将sessionid传回服务器。

    不同点:

    • cookie存于客户端,session存于服务器端
    • cookie:设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭 ;sessionStorage:数据在当前浏览器窗口关闭后自动删除
    • cookie:同源页面共享 ;sessionStorage:在打开的不同浏览器窗口不共享,既使是同一页面
    • cookie数据大小不能超过4k sessionStorage 比cookie大得多,可以达到5M或更大
  4. http状态码的含义

    类别 原因短语
    1xx Informational(信息性状态码) 接收的请求正在处理
    2xx Success(成功状态码) 请求正常处理完毕
    3xx Redirection(重定向) 需要进行附加操作才能完成请求
    4xx Client Error(客户端错误) 客户端操作或请求错误,服务器无法处理
    5xx Server Error(服务端错误) 服务器在处理请求的过程中有错误或者异常状态发生
  5. http请求头

    http请求头,HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。
    - Accept:浏览器可接受的MIME类型。
    - Accept-Charset:浏览器可接受的字符集。
    - Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
    - Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
    - Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
    - Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
    - Content-Length:表示请求消息正文的长度。
    - Cookie:这是最重要的请求头信息之一
    - From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
    - Host:初始URL中的主机和端口。
    - If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
    - Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
    - Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
    - User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
    
  6. get和post区别,还使用过其他的哪些请求方式,区别

    最主要的区别就是语义区别:get请求服务器资源,同一个地址多次请求结果应该相同。post对服务器端资源进行修改操作。实际现实区别:

    1. GET后退按钮/刷新无害,POST数据会被重新提交
    2. GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制 。其实这是浏览器的限制
    3. 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分 。其实不是,http的所有数据通过抓包动能获取,正确的办法应该是Https.
    4. GET的数据在 URL 中,请求数据放在url的querystring中,对所有人都是可见的。 POST请求的数据在body中 。这只是在浏览器中是如此,GET也可以有请求体,如ElasticSearch的搜索就是带有请求体的GET方式。
  7. SQL 注入

    SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

    // 如果表单中用户名是 ‘or 1 = 1 --
    String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+"'"
    // 生产的sql SELECT * FROM user_table WHERE username=''or 1 = 1 -- and password=’’
    // 那么就可以轻松骗过系统,获取登录认证身份
    

    解决办法:

    1. mybatis的mapper文件 ,当使用#时,变量是占位符,就是一般我们使用javajdbc的PrepareStatement时的占位符,所有可以防止sql注入;当使用$时,变量就是直接追加在sql中,一般会有sql注入问题
    2. 使用正则过滤危险字符,注册时限制格式
  8. XSS( Cross Site Scripting )攻击

    攻击原理:

    1. 反射型:反射型XSS,也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行
    2. 存储型: 也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等)。然后在下次请求页面的时候就不用带上XSS代码了 典型的就是留言板XSS。用户提交了一条包含XSS代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有XSS代码,就当做正常的HTML和JS解析执行。XSS攻击就发生了

    防范:

    1. 入参字符过滤: 输入的一些不合法的东西都过滤掉
    2. 入参长度限制:xss代码较长
    3. Cookie由服务端来写并将httpOnly设置成为“true”,Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击
  9. 在浏览器地址中输入地址并按下回车键发生了什么?

    1. DNS解析
    2. TCP连接
    3. 发送HTTP请求
    4. 服务器处理请求并返回HTTP报文
    5. 浏览器解析渲染页面
    6. 连接结束

    图解HTTP

TCP/IP

TCP

  1. TCP建立连接过程,为什么需要三次握手

    TCP建立连接

    • 客户端–发送带有 SYN 标志的数据包–一次握手–服务端
    • 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
    • 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端

    经过两次握手,发送方到接收方的数据发收正常;只有经过第三次握手,接收方才能确定自己的确定信息到达了发送方,接收方到发送方的数据收发正常。这样双方才能保证收发正常。

  2. 建立连接需要三次握手,为什么断开连接却需要四次挥手

    tcp断开连接

    • 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送
    • 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号。客户端到服务器的数据传输结束,但是服务器到客户端的数据仍在传输。
    • 服务器到客户端的数据传输完毕后,服务器-关闭与客户端的连接,发送一个FIN给客户端
    • 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1

    同样的道理,需要反馈给被动关闭方其数据停止传输信息已经被主动关闭方知晓。这样双方都正确收到数据传输结束的确认信息。

  3. TCP 协议如何保证可靠传输

    • 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;

    • 对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;

    • 丢弃重复数据:对于重复数据,能够丢弃重复数据;

    • 应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;

    • 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

    • 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议

  4. TCP与UDP的区别

    • TCP是面向连接的,UDP是无连接的
    • TCP是可靠的服务,UDP尽最大努力的数据传输服务
    • TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式
    • TCP是面向字节流的,UDP是面向报文(对上层传入的数据,直接添加Head信息后转发)
    • TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信
    • TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大
  5. 如何用UDP实现TCP

    在应用层实现TCP实现可靠传输的那些东西

  6. TCP的拥塞处理

  7. 慢启动:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小

  8. 拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长

  9. 快重传:快重传要求接收方在收到一个 失序的报文段 后就立即发出 重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认,快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期

  10. 快恢复:快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半,但是接下去并不执行慢开始算法:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

  11. DDOS(Distributed denial of service attack )攻击

    大量的分布式请求发送给服务器,导致服务器忙于处理无用的攻击请求而无法响应正常的客户请求,服务器处于拒绝响应状态。发送请求有 TCP SYN攻击、畸形数据包、UDP洪泛攻击和ICMP洪水攻击。

    防范:针对不同的攻击方式,需要使用不同的策略。如SYN攻击,服务器接收到同步请求时,不分配资源,放入缓存然后响应,客服端如果进行下次握手通讯时再分配资源。

IP

1. IPv4与IPv6的区别

扩充 IP 寻址功能:尤其是 IPv4 地址短缺日益严重,而这些地址对于添加到因特网的所有新设备都是必需的。IPv6 增强的关键是将 IP 地址空间从 32 位扩展到 128 位,从根本上实现不受限制的唯一 IP 地址. 新的 IPv6 地址文本格式为如下, 其中每个 x 代表一个 4 位的十六进制数字

xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

较简单的 IP 配置: IPv6 通过使部分任务自动化而减少了网络管理员的工作量。例如,IPv6 自动配置功能自动配置接口地址和缺省路由器。在无状态自动配置中,IPv6 使用机器的介质访问控制(MAC)地址和本地路由器提供的网络前缀并将这两个地址组合来创建新的唯一 IPv6 地址。有了此功能就不再需要动态主机配置协议(DHCP)服务器

站点重新编号: 如果使用 IPv6,在转向另一因特网服务提供商(ISP)时就不必对设备地址重新编号。站点重新编号是 IPv6 的重要结构元素,已在很大程度上实现自动化。IPv6 地址的低位部分保持不变,因为传统上这是以太网适配器的 MAC 地址。ISP 会为您分配新的 IPv6 前缀,可通过更新网络中的 IPv6 路由器并允许 IPv6 无状态自动配置识别新前缀以将此前缀分发给所有终端主机。

2. IP地址的分类

IP地址编址方案将IP地址空间划分为A、B、C、D、E五类,其中A、B、C是基本类,D、E类作为多播和保留使用,为特殊地址 .注意各类地址中,如果剩余比特位全为0,则表示是广播地址。

  • A类地址:以0开头,第一个字节范围:0~127;
  • B类地址:以10开头,第一个字节范围:128~191;
  • C类地址:以110开头,第一个字节范围:192~223;
  • D类地址:以1110开头,第一个字节范围为224~239;
  • E类地址:以1111开头,保留地址

3. 网络层的ARP协议工作原理

网络层的ARP协议完成了IP地址与物理地址的映射。首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址:如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

原文地址:https://www.cnblogs.com/hitomeng/p/12302262.html