【Java面试题】2、网络编程与网络协议

85 阅读20分钟

1、Get 和 Post 的区别?

相同点:底层都是基于 TCP/IP 实现的。

不同点:

  • 本质上

    • 定义 GET 请求是用来获取资源的,也就是进行查询操作的,而 POST 请求是用来传输实体对象的,因此会使用 POST 来进行添加、修改和删除等操作。
    • GET 和 POST 的参数传递也是不同的,GET 请求是将参数拼接到 URL 上进行参数传递的,而 POST 是将参数写入到请求正文中传递的。
  • 安全性

    POST 比 GET 更安全,因为参数不会被缓存(被收藏为标签)、不会作为 URL 的一部分、不会被保存在浏览器历史记录或 web 服务器日志中。

  • 参数的长度限制

    • get 请求传输的数据受到 URL 长度的限制,而 URL 长度是由浏览器决定的;
    • post 请求参数是存放在请求正文(request body)中的,理论上来说是没有限制的。
  • 参数编码限制

    • GET只接受ASCII字符,而POST没有限制。

      一般来说:无论是URL还是请求参数中的非ASCII码都会字符被URL编码成ASCII码字符吗?

      如果你的 Get 请求中有非 ASCII 字符,会在请求之前进行转码,得到没有非 ASCII 字符的 URL,然后去发起 Get 请求,这样请求的路径里不是没有非 ASCII 字符么?

  • 传输速度

    • post比get慢。post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据,而get会把请求头和数据一起发送。即 GET 产生一个 TCP 数据包,而 POST 产生两个 TCP 数据包
  • 幂等性

    • get是具有幂等性的(多次请求会产生相同的响应),而post为非幂等性请求

    • GET 请求可以直接进行回退和刷新,不会对用户和程序产生任何影响;GET 请求的地址可被收藏为书签

    • POST 请求如果直接回滚和刷新将会把数据再次提交;POST 请求的地址不能被收藏为书签,尝试为POST添加书签只会导致对URL进行GET操作

    幂等性:HTTP/1.1 中的定义是指一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。

2、cookie 和 session 的区别?

  1. 存储位置不同。cookie 的数据信息存放在客户端浏览器上。 session 的数据信息存放在服务器上。
  2. 存储容量不同。单个 cookie 保存的数据<=4KB,一个站点最多保存 20 个 Cookie对于 session 来说并没有上限,但出于对服务器端的性能考虑,session 内不要存放过多的东西,并且设置 session 删除机制。
  3. 存储方式不同。cookie 中只能保管 ASCII 字符串,并需要通过编码方式存储为 Unicode 字符或者二进制数 据session 中能够存储任何类型的数据,包括且不限于 string,integer,list,map 等。
  4. 隐私策略不同。cookie 对客户端是可见的,别有用心的人可以分析存放在本地的 cookie 并进行 cookie 欺 骗,所以它是不安全的。 session 存储在服务器上,不存在敏感信息泄漏的风险。
  5. 有效期不同。开发可以通过设置 cookie 的属性,达到使 cookie 长期有效的效果。session 依赖于名为 JSESSIONID 的 cookie,而 cookie JSESSIONID 的过期时间默认为-1, 只需关闭窗口该 session 就会失效,因而 session 不能达到长期有效的效果。
  6. 服务器压力不同。cookie 保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie 是很好的 选择。 session 是保管在服务器端的,每个用户都会产生一个 session。假如并发访问的用户十分多,会产生十分多的 session,耗费大量的内存

3、Forward 和 Redirect 的区别?

实现:

  • 转发:request.getRequestDispatcher("other.jsp").forward(request, response);
  • 重定向: response.sendRedirect("other.jsp");

区别:

  • 浏览器 URL 地址:Forward 是服务器内部的重定向,服务器内部请求某个 servlet,然后获取响应的内容,浏览器的 URL 地址是不会变化的;Redirect 是客户端请求服务器,然后服务器给客户端返回了一个 302 状态码和新的 location,客户端重新发起 HTTP 请求,服务器给客户端响应 location 对应的 URL 地址,浏览器的 URL 地址发生了变化
  • 数据的共享:Forward 是服务器内部的重定向,request 在整个过程中是不变的, request 中的信息在 servlet 间是共享的。Redirect 发起了两次 HTTP 请求分别使用不同的 request
  • 请求的次数Forward 只有一次请求;Redirect 有两次请求
  • 跳转的对象:Forward 是服务器跳转,只能跳转当前项目;Redirect 是浏览器跳转,可以跳转到任意网址。

4、Ajax

Ajax 即"Asynchronous JavaScript And XML"(异步 JavaScript 和 XML),是指一种 创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。

 $.ajax({ 
     选项 
 }) 
 常见的选项有: 
 type:请求方式,常见的值有"get","post"等,默认值:get 
 url:请求的路径,"/ajax/hello" data:请求的参数,参数的常见写法有 键值对或者 json 
 方式 1: name=tom&pwd=123 
 方式 2: {"name":"tom","pwd":"123"} 
 success:请求成功后的回调函数 function(返回值的参数名){} 
 contentType: 用来设置请求参数的 mime 类型,默认值:表单的 enctype 默认值 name=tom&pwd=123 
 error:ajax 请求时内部发生错误时执行的回调函数 function(){} 
 dataType:指定返回值的类型 常见值:text json 
 async:是否异步 默认值 true 

Ajax 应用程序的优势在于:

  1. 通过异步模式,提升了用户体验
  2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
  3. Ajax 引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

5、OSI 的七层模型

OSI七层模型一般指开放系统互连参考模型。

  • 应用层:各种应用程序协议,比如 HTTP、HTTPS、FTP、SOCKS 安全套接字协议、DNS 域名系统、GDP 网关发现协议等等。
  • 表示层:加密解密、转换翻译、压缩解压缩,比如 LPP 轻量级表示协议。
  • 会话层:不同机器上的用户建立和管理会话,比如 SSL 安全套接字层协议、TLS 传输层安全协议、RPC 远程过程调用协议等等。
  • 传输层:接受上一层的数据,在必要的时候对数据进行分割,并将这些数据交给网络层,保证这些数据段有效到达对端,比如 TCP 传输控制协议、UDP 数据报协议。
  • 网络层:控制子网的运行:逻辑编址、分组传输、路由选择,比如 IP、IPV6、SLIP 等等。
  • 数据链路层:物理寻址,同时将原始比特流转变为逻辑传输路线,比如 XTP 压缩传输协议、 PPTP 点对点隧道协议等等。
  • 物理层:机械、电子、定时接口通信信道上的原始比特流传输,比如 IEEE802.2 等等

6、TCP/IP四层网络模型

TCP/IP分层模型被称作因特网分层模型、因特网参考模型。

TCP/IP协议被组织成四个概念层,其中有三层对应于ISO参考模型中的相应层。ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。

  1. 网络接口层。网络接口层包括用于协作IP数据在已有网络介质上传输的协议。 协议:ARP,RARP
  2. 网间层。网间层对应于OSI七层参考模型的网络层。负责数据的包装、寻址和路由。同时还包含网间控制报 文协议(ICMP)用来提供网络诊断信息。 协议:本层包含IP协议、RIP协议(路由信息协议),ICMP协议。
  3. 传输层。传输层对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。 TCP协议提供可靠的数据流运输服务,UDP协议提供不可靠的用户数据报服务。
  4. 应用层。应用层对应于OSI七层参考模型的应用层和表达层。 协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻传输协议)等。

6、浏览器中输入:“www.woaijava.com”之后都发生了什么?

  1. 域名→IP地址。寻找IP地址的过程依次经过了浏览器缓存、系统缓存、hosts文件、路由器缓存、 递归搜索根域名服务器
  2. 建立TCP/IP连接(三次握手具体过程)
  3. 浏览器发送一个HTTP请求
  4. 经过路由器的转发,通过服务器的防火墙,该HTTP请求到达了服务器
  5. 服务器处理该HTTP请求,返回一个HTML文件
  6. 浏览器解析该HTML文件,并且显示在浏览器端

这里需要注意:

  • HTTP协议是一种基于TCP/IP的应用层协议,进行HTTP数据请求必须先建立TCP/IP连接。可以这样理解:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
  • 两个计算机之间的交流无非是两个端口之间的数据通信,具体的数据会以什么样的形式展现是以不同的应用层协议来定义的。

7、域名解析详细过程

  1. 浏览器访问 www.baidu.com询问本地 DNS 服务器是否缓存了该网址解析后的 IP 地址。
  2. 如果本地 DNS 服务器没有缓存的话,就去 root-servers.net 根服务器查询该网址对应的 IP 地址
  3. 根服务器返回顶级域名服务器的网址 gtld-servers.net,然后本地 DNS 服务器去顶级域名服务器查询该网址对应的 IP 地址
  4. 顶级域名服务器返回 www.baidu.com 主区域服务器的地址,然后本地 DNS 服务器去 www.baidu.com 主区域服务器查询此域名对应的 IP 地址
  5. 本地 DNS 服务器拿到 www.baidu.com 解析后的 IP 地址后,缓存起来以便备查,然后把解析后的 IP 地址返回给浏览器

8、如何实现跨域?

当浏览器执行 JS 脚本的时候,会检测脚本要访问的协议、域名、端口号是不是和当前网址一致,如果不一致就是跨域。跨域是不允许的,这种限制叫做浏览器的同源策略

那么如何实现跨域呢?——JSONP、CORS方式、代理方式

  • JSONP 方式

    • script、img、iframe、link、video、audio 等带有 src 属性的标签可以跨域请求和执行资源, JSONP 利用这一点“漏洞”实现跨域。
    • 但是只支持 GET 请求方式。而且在服务器端接受到 JSONP 请求后需要设置请求头,添加 Access-Control-Allow-Origin 属性,属性值为 * ,表示允许所有域名访问,这样浏览器才会正常解析,否则会报 406 错误。
  • CORS 方式

    • CORS(Cross-Origin Resource Sharing)即跨域资源共享,需要浏览器和服务器同时支持,这种请求方式分为简单请求和非简单请求。

    • 简单请求:浏览器发出的 XMLHttpRequest 请求的请求方式是 POST 或者 GET,请求头中只包含 Accept、 Accept-Language、Content-Language、Last-Event-ID、Content-Type(application/x-www-form-urlencoded、multipart/form-data、text/plain)。

      • 对于简单的请求,浏览器会在请求头中添加 Origin 属性,标明本次请求来自哪个源(协议 + 域名 + 端口) 。如果 Origin 标明的域名在服务器许可范围内,那么服务器就会给出响应。
    • 非简单请求,请求方式是 PUT 或 DELETE,或者请求头中添加了 Content-Type:application/json 属性和属性值的请求。

      • 这种请求在浏览器正式发出 XMLHttpRequest 请求前会先发送一个预检 HTTP 请求,询问服务器当前网页的域名是否在服务器的许可名单之中,只有得到服务器的肯定后才会正式发出通信请求。
      • 如果服务器回应预检请求的响应头中没有任何 CORS 相关的头信息的话表示不支持跨域,如果允许跨域就会做出响应。
      • 接着浏览器会像简单请求一样,发送一个 CORS 请求,请求头中一定包含 Origin 属性,服务器的响应头中也一定得包含 Access-Control-Allow-Origin 属性
  • 代理方式

    • 跨域限制是浏览器的同源策略导致的,使用 nginx 当做服务器访问别的服务的 HTTP 接口是不需要执行 JS 脚步不存在同源策略限制的,所以可以利用 Nginx 创建一个代理服务器,这个代理服务器的域名跟浏览器要访问的域名一致,然后通过这个代理服务器修改 cookie 中的域名为要访问的 HTTP 接口的域名,通过反向代理实现跨域。

9、什么是 HTTP 协议?

客户端和服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。

是一个基于请求与响应模式的、无状态的、应用层的协议,基于 TCP 的连接方式。

10、TCP 的三次握手和四次挥手

目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收, 而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。断开一个TCP连接则需要“四次握手”。

SYN:同步序列编号。是 TCP/IP 建立连接时使用的握手信号。

ACK:确认字符。在数据通信中,接收站发给发送站,表示发来的数据已确认接收无误。

FIN(ISH):为TCP报头的码位字段,该位置为1的含义为发送方字节流结束。

三次握手

  • 第一次握手:客户端给服务器发送一个 SYN。客户端发送网络包,服务端收到了。服务器得出结论:客户端的发送能力,服务端的接收能力正常。
  • 第二次握手:服务端收到 SYN 报文之后,会应答一个 SYN+ACK 报文。服务端发包,客户端收到了。客户端得出结论:服务端的接收和发送能力,客户端的接收和发送能力正常。但是此时服务端不能确认客户端的接收能力是否正常。
  • 第三次握手:客户端收到 SYN+ACK 报文之后,回应一个 ACK 报文。客户端发包,服务端收到了。服务器得出结论:客户端的接收和发送能力,自己的接收发送能力都正常。 通过三次握手,双方都确认对方的接收以及发送能力正常。

四次挥手

  • 第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
  • 第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
  • 第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
  • 第四次挥手:主动关闭方收到 FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

11、TCP 与 UDP 的区别,以及各自的优缺点

  1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
  4. 每一条TCP连接只能是点到点的UDP支持一对一,一对多,多对一和多对多的交互通信。
  5. TCP对系统资源要求较多,UDP对系统资源要求较少

12、HTTP 响应码有哪些?

  • 200:成功,Web 服务器成功处理了客户端的请求。
  • 301:永久重定向,当客户端请求一个网址的时候,Web 服务器会将当前请求重定向到另一个网址,搜索引擎会抓取重定向后网页的内容并且将旧的网址替换为重定向后的网址。
  • 302:临时重定向,搜索引擎会抓取重定向后网页的内容而保留旧的网址,因为搜索引擎认为重定向后的网址是暂时的。
  • 400:客户端请求错误,多为参数不合法导致 Web 服务器验参失败。
  • 404:未找到,Web 服务器找不到资源。
  • 500:Web 服务器错误,服务器处理客户端请求的时候发生错误。
  • 503:服务不可用,服务器停机。
  • 504:网关超时。

13、HTTP 和 HTTPS 的区别?

  • http是超文本传输协议,信息是明文传输;https 则是具有安全性的ssl加密传输协议。
  • 加密: HTTPS 是 HTTP 协议的更加安全的版本,通过使用SSL/TLS进行加密传输的数据;
  • 连接方式: HTTP(三次握手)和 HTTPS (三次握手+数字证书) 连接方式不一样;
  • 端口:HTTP是80,HTTPS是443
  • https协议需要到CA机构申请证书(SSL),一般免费证书很少,需要交费。

服务端向客户端发送数字证书,其中包含公钥、证书颁发者、到期日期。

公钥用于加密,私钥用于解密。

14、HTTP、TCP、Socket 的关系?

  • HTTP:应用层协议——超文本传输协议
  • TCP/IP 代表传输控制协议/网络协议,指的是一系列协议族。
  • TCP:传输层协议——传输控制协议
  • IP:网络层协议——网际互连协议
  • socket是对TCP/IP协议的封装,是一个调用接口(API)。

综上所述:

  • WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后通过Socket,使用TCP/IP做传输层协议,将它发到网络上
  • Socket就是TCP/IP提供给程序员做网络开发所用的编程接口。
  • HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

15、HTTP的长连接与短连接

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

  • 短连接

    • 在HTTP/1.0中默认使用短链接,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端访问的某个HTML或其他类型的Web资源,如 JavaScript 文件、图像文件、 CSS 文件等。当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

    • 操作步骤:建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

    • 优缺点

      • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽
  • 长连接

    • 从HTTP/1.1起,默认使用长连接,用以保持连接特性。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭。如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

    • 操作步骤:建立连接——数据传输...(保持连接)...数据传输——关闭连接

    • 优缺点

      • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间 。对于频繁请求资源的客户来说,较适用长连接。
      • 不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP 连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了
      • client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致 server端服务受损。
      • 如果条件允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

16、HTTP协议与TCP/IP协议的关系

  • HTTP的长连接和短连接本质上是TCP长连接和短连接
  • HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议
  • IP协议主要解决网络路由和寻址问题
  • TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。

17、如何理解HTTP协议是无状态的?

HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。 也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是 UDP协议(无连接)。

18、TCP 如何保证可靠性的?

  • 序列号和确认号机制: TCP 发送端发送数据包的时候会选择一个 seq 序列号,接收端收到数据包后会检测数据包的完整性,如果检测通过会响应一个 ack 确认号表示收到了数据包。
  • 超时重发机制: TCP 发送端发送了数据包后会启动一个定时器,如果一定时间没有收到接受端的确认后,将会重新发送该数据包。
  • 对乱序数据包重新排序: 从 IP 网络层传输到 TCP 层的数据包可能会乱序,TCP 层会对数据包重新排序再发给应用层。
  • 丢弃重复数据: 从 IP 网络层传输到 TCP 层的数据包可能会重复,TCP 层会丢弃重复的数据包。
  • 流量控制: TCP 发送端和接收端都有一个固定大小的缓冲空间,为了防止发送端发送数据的速度太快导致接收端缓冲区溢出,发送端只能发送接收端可以接纳的数据,为了达到这种控制效果,TCP 用了流量控制协议(可变大小的滑动窗口协议)来实现。

19、HTTP1.0、HTTP1.1、HTTP2.0的关系和区别

  • HTTP1.0:

    • 无状态(服务器处理完成后立即断开TCP连接)
    • 无连接(服务器不跟踪每个客户端也不记录过去的请求)
  • HTTP1.1:HTTP/1.0中默认使用Connection: close。在HTTP/1.1中已经默认使用Connection: keep-alive

    • 持久连接
    • 请求管道化
    • 增加缓存管理(新的字段如cache-control)
    • 增加Host字段、支持断点传输等。(把文件分成几部分)
  • HTTP2.0:

    • 二进制分帧:HTTP/2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识。这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。

    • 多路复用(或连接共享):

      • 所有的HTTP2.0通信都在一个TCP连接上完成,这个连接可以承载任意数量的双向数据流。
      • 每个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧头部的流标识符(stream id)重新组装。
      • 可见HTTP2.0实现了真正的并行传输,它能够在一个TCP上进行任意数量HTTP请求。
    • 头部压缩:HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表, 既避免了重复header的传输,又减小了需要传输的大小。

    • 服务器推送:服务器除了对最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求。

20、TCP 粘包和拆包是怎么产生的?怎么解决粘包和拆包?

造成粘包和拆包现象的原因:

  • TCP 发送缓冲区剩余空间不足以发送一个完整的数据包,将发生拆包
  • 要发送的数据超过了最大报文长度的限制,TCP 传输数据时进行拆包
  • 要发送的数据包小于 TCP 发送缓冲区剩余空间,TCP 将多个数据包写满发送缓冲区一次发送出去,将发生粘包
  • 接收端没有及时读取 TCP 发送缓冲区中的数据包,将会发生粘包

粘包拆包的解决方法:

  • 发送端给数据包添加首部,首部中添加数据包的长度属性,这样接收端通过首部中的长度字段就可以知道数据包的实际长度啦;
  • 针对发送的数据包小于缓冲区大小的情况,发送端可以将不同的数据包规定成同样的长度,不足这个长度的补充 0,接收端从缓冲区读取固定的长度数据这样就可以区分不同的数据包;
  • 发送端通过给不同的数据包添加间隔符合确定边界,接收端通过这个间隔符合就可以区分不同的数据包。