Java 面试题 09 – 计算机网络()

TCP & UDP

TCP 和 UDP 的区别有什么?

  • TCP 面向连接,UDP 无连接。
  • TCP 提供可靠的传输,在传递数据之前,需要通过三次握手建立连接,在传递数据时,有 确认、窗口、重传、拥塞 机制控制,TCP 保证了 无差错、不重复、不丢失、按序到达。UDP 收到报文后,不需要给出确认,并且不保证数据不丢失和按序到达。
  • TCP 面向字节流,UDP 面向报文。
  • TCP 首部开销(20~60 B)比 UDP 首部开销(8B)大。
  • UDP 支持一对一、一对多、多对多,TCP 只支持一对一。

使用 TCP 的协议有哪些?

HTTP、FTP、SMTP、POP3、IMAP、Telnet、SSH。

使用 UDP 协议有哪些?

DHCP、DNS。

TCP 三次握手

三次握手的主要目的是 双方都能确认自己与对方的发送、接收都正常。

  • 客户端发送 SYN 数据包,然后进入 SYN_SEND 状态。
  • 服务端发送 SYN + ACK 数据包,然后进入 SYN_RECV 状态。
  • 客户端发送 ACK 数据包,然后客户端、服务端都进入 ESTABLISHED 状态。

TCP 四次挥手

TCP 是全双工通信,任何一方都可以在传输结束后发出「释放连接」的通知,待对方确认后进入瓣关闭状态;另一方也没有数据要发送的时候,也会发出「释放连接」的通知,对方确认后才完全关闭连接。

  • 客户端发送 FIN 数据包,用来关闭客户端到服务端的连接,然后进入 FIN-WAIT-1 状态。
  • 服务端收到后发送 ACK 数据包,然后进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  • 服务端发送 FIN 数据包,关闭与客户端的连接,然后进入 LAST-ACK 状态。
  • 客户端发送 ACK 数据包,进入 TIME-WAIT 状态;服务端收到后进入 CLOSE 状态。客户端等待 2MSL 后依然没收到回复,说明服务端已关闭,客户端也随即关闭。

第 2、3 步的解释:服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
第 4 步等待 2MSL 的解释:客户端发送的 ACK 可能丢失,服务端收不到 ACK 就会重发 FIN,此时客户端在 2MSL 的时间内就会收到重发的 FIN,然后重新发送 ACK 并再次等待 2MSL。即等待 2MSL 的目的是防止服务端因没有收到 ACK 而不断重发 FIN。

第 2、3 步的解释:服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。

第 4 步等待 2MSL 的解释:客户端发送的 ACK 可能丢失,服务端收不到 ACK 就会重发 FIN,此时客户端在 2MSL 的时间内就会收到重发的 FIN,然后重新发送 ACK 并再次等待 2MSL。即等待 2MSL 的目的是防止服务端因没有收到 ACK 而不断重发 FIN。

HTTP

Cookie 和 Session 的区别是什么?

  • Session 是一个保存在服务端的一个数据结构,用来跟踪用户的状态。具体数据结构类似于 Map,键为用户的 session ID,用户发送请求时会用 Cookie 带上这个 session ID,就能取出对应的值了。
  • Cookie 是一种 在客户端保存用户信息 的机制,第一次创建 Session 时,服务端会在 HTTP 协议中告诉客户端:需要在 Cookie 里记录一个 session ID,把这个 Cookie 发送给服务器就能告诉服务器自己的身份。
    Cookie 的缺点:

    容量:只能存储少量信息
    性能:不管请求的地址需不需要 Cookie,请求都会携带上完整的 Cookie,随着请求数增多,会造成性能浪费。可以通过设置 Domain 和 Path 属性来指定 Cookie 的作用域。
    安全:Cookie 以纯文本形式传递,容易被截获,然后被篡改后重新发送给服务器。

  • 容量:只能存储少量信息
  • 性能:不管请求的地址需不需要 Cookie,请求都会携带上完整的 Cookie,随着请求数增多,会造成性能浪费。可以通过设置 Domain 和 Path 属性来指定 Cookie 的作用域。
  • 安全:Cookie 以纯文本形式传递,容易被截获,然后被篡改后重新发送给服务器。

forward 和 redirect 的区别是什么?

  • forward:转发,浏览器请求某个地址,服务器在内部访问跳转后的地址,将其返回的内容发送给浏览器。跳转过程是在服务器上实现的,地址栏还是原来的地址。
  • redirect:重定向,服务器发送给浏览器一个状态码,让 浏览器自己去请求跳转的地址。
  • 在 forward 中,当前页面和转发到的页面可以共享 request 里面的数据,而 redirect 不能共享数据。
  • forward 一般用于用户登录时,根据角色转发到相应的模块;redirect 一般用于 用户注销时返回主页。

HTTP 请求的过程:

  • 浏览器根据 url 向 DNS 服务器请求解析 IP 地址
  • 浏览器与服务器建立 TCP 连接
  • 浏览器发送 HTTP 请求报文
  • 服务器响应
  • 释放 TCP 连接
  • 浏览器渲染

常用方法

  • GET:请求服务器发送某些资源。
  • HEAD:请求资源的头部信息,这些信息与 GET 方法返回的头部信息一致。
  • PUT、POST、DELETE
  • TRACE:回显服务器收到的请求,用于测试或诊断。
  • PATCH:对资源进行部分修改。

get 和 post 的区别:

  • 缓存:get 请求会被浏览器缓存下来。
  • 编码:get 只能进行 url 编码,只能接收 ASCII 字符,而 post 没有限制。
  • 幂等:get 是幂等的。(发送 M 次和 N 次请求,服务器上的资源状态一致。)
  • TCP 传输:get 会把请求报文一次性发出去,而 post 会分为两个 TCP 数据包,首先发送 header 部分,如果服务器响应 100(continue),则再发送 body 部分。

请求报文格式

  • 起始行:方法 + 请求路径 + HTTP版本 GET /home HTTP/1.1
  • 头部:若干个键值对表示请求信息。
  • 空行L:用来区分头部和实体(body)。
  • 实体:请求体/响应体中具体的数据。

常见的状态码

  • 200 OK,表示客户端的请求在服务器端被正确处理。
  • 204 No content:表示请求成功,但响应报文不含 body 部分。
  • 206 Partial Content:表示返回部分内容,使用场景为 HTTP 分块下载和断点续传,响应头中会指定 Content-Range 字段。
  • 301 Moved Permanently:永久重定向,浏览器会做缓存优化,在第二次访问的时候自动访问重定向到的那个地址。
  • 302 Found:临时重定向,当前访问地址暂时不可用,浏览器不会做缓存优化。
  • 400 Bad Request
  • 403 Forbidden:服务器禁止访问。
  • 404 Not Found:资源未找到。
  • 405 Method Not Allowed:请求方法不被服务器端允许。
  • 500 Internal Server Error
  • 503 Service Unavailable:服务器忙,暂无法响应。

HTTP 的缺点

  • 无状态:无状态这个特点有利有弊 —— 在只需要获取少量数据,不需要保存连接上下文信息时,无状态可以减少网络开销;而 在需要长连接的场景中,需要保存大量上下文信息,以免传输大量重复的信息,此时无状态就是缺点了。
  • 明文传输:协议里的报文使用文本形式传输。
  • 队头阻塞问题:当开启长连接时,共用一个 TCP 连接,同一时刻只能处理一个请求,如果某个请求耗时过长,下一个请求只能处于阻塞状态。
    HTTP 1.1 解决队头阻塞问题的方案:1 并发连接:对于一个域名允许分配多个长连接(Chrome 中是 6 个)。2 域名分片:在一个域名下分出多个二级域名,它们都指向同一台服务器,每个域名都支持 6 个长连接。

HTTP 的安全问题有哪些?

  • 窃听:使用明文通信,内容可能被窃听;
  • 伪装:不验证通信方的身份,对方身份可能被伪装;
  • 篡改:无法验证报文的完整性,报文可能被篡改。

HTTPS 通过混合加密来防窃听,通过数字签名防篡改,通过 CA 证书来验证发送方身份。

HTTPS 通过混合加密来防窃听,通过数字签名防篡改,通过 CA 证书来验证发送方身份。

HTTPS 是如何保证安全的?

1 混合加密

对称加密:通信双方都使用同一个秘钥进行加密和解密。无法解决首次把秘钥发送给对方时,很容易被截获的问题。

非对称加密:公钥和私钥组成一个密钥对,用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。通信双方的手里都有一套自己的密钥对,通信之前双方会先把自己的公钥都发送给对方,然后 对方拿这个公钥来加密要发送的数据,接收方用自己的私钥对其解密。问题是速度慢。

  • 公钥加密,私钥解密,是为了保证内容传输的安全,因为被公钥加密的内容只有持有私钥的人才能解密;
  • 私钥加密,公钥解密,是为了保证消息不会被冒充,因为私钥不可泄露,所以如果公钥能够解密出私钥加密的内容,就能证明这个消息来源于私钥持有人。

非对称加密的主要用途是 通过私钥加密、公钥解密的方式,来确认消息的身份

可以结合两种加密方式,使用非对称加密解决对称加密发送秘钥不安全的问题 —— 将对称加密的秘钥使用非对称加密的公钥进行加密(双方仍然需要首先互发自己的公钥),然后发送出去,接收方使用私钥进行解密得到对称加密的秘钥,然后双方可以 使用对称加密进行沟通。但这样又带来一个 中间人问题:在最开始通信双方互发公钥时,中间人将这两个公钥截获,换成自己的公钥,这样就能解密双方通信的内容了。

使用混合加密,保证传输信息的机密性,解决了窃听风险。

使用混合加密,保证传输信息的机密性,解决了窃听风险。

2 摘要算法 + 数字签名 + CA

这时候需要一个 证书颁发机构(CA),证书中包括签发者、证书用途、使用者的公钥私钥和 Hash 算法、证书到期时间等。另外使用 数字签名 这一技术:使用 CA 自带的 Hash 算法对证书内容进行 Hash 得到一个摘要(指纹),再用 CA 的私钥加密,生成数字签名。接收者收到证书时,使用同样的 Hash 算法再次生成消息摘要,然后用 CA 的公钥对数字签名解密,将它和消息摘要对比,就知道有没有被篡改。

HTTP2 有什么优势?

  • 二进制分帧: 采用二进制格式传输数据,而不再是文本格式,且数据由一个或者多个帧组成,二进制协议解析起来更快。
  • 服务器推送:服务端可以在发送页面 HTML 时主动推送其他资源(JS、CSS等),而不用等到浏览器解析到相应位置时再次发起请求。
  • 头部压缩:HTTP1.x 会在请求和响应中重复携带不常改变的、冗长的头部数据,给网络带来额外的负担。HTTP2 在客户端和服务器使用 首部表 来跟踪和存储之前发送的键值对,对于相同的数据,不再通过每次请求和响应发送。客户端和服务器共同渐进地更新首部表。即,只发送差异数据。
  • 多路复用:HTTP1.x 中,如果想并发发送多个请求,必须使用多个 TCP 连接,且浏览器会对单个域名有连接限制。HTTP2 同域名下的所有通信都在单个连接上完成,单个连接可以承载任意数量的双向数据流,数据流以消息形式发送,消息由若干个帧组成,多个帧之间可以乱序发送,可以根据首部的标识字段重新组装。
————————

TCP & UDP

TCP 和 UDP 的区别有什么?

  • TCP 面向连接,UDP 无连接。
  • TCP 提供可靠的传输,在传递数据之前,需要通过三次握手建立连接,在传递数据时,有 确认、窗口、重传、拥塞 机制控制,TCP 保证了 无差错、不重复、不丢失、按序到达。UDP 收到报文后,不需要给出确认,并且不保证数据不丢失和按序到达。
  • TCP 面向字节流,UDP 面向报文。
  • TCP 首部开销(20~60 B)比 UDP 首部开销(8B)大。
  • UDP 支持一对一、一对多、多对多,TCP 只支持一对一。

使用 TCP 的协议有哪些?

HTTP、FTP、SMTP、POP3、IMAP、Telnet、SSH。

使用 UDP 协议有哪些?

DHCP、DNS。

TCP 三次握手

三次握手的主要目的是 双方都能确认自己与对方的发送、接收都正常。

  • 客户端发送 SYN 数据包,然后进入 SYN_SEND 状态。
  • 服务端发送 SYN + ACK 数据包,然后进入 SYN_RECV 状态。
  • 客户端发送 ACK 数据包,然后客户端、服务端都进入 ESTABLISHED 状态。

TCP 四次挥手

TCP 是全双工通信,任何一方都可以在传输结束后发出「释放连接」的通知,待对方确认后进入瓣关闭状态;另一方也没有数据要发送的时候,也会发出「释放连接」的通知,对方确认后才完全关闭连接。

  • 客户端发送 FIN 数据包,用来关闭客户端到服务端的连接,然后进入 FIN-WAIT-1 状态。
  • 服务端收到后发送 ACK 数据包,然后进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  • 服务端发送 FIN 数据包,关闭与客户端的连接,然后进入 LAST-ACK 状态。
  • 客户端发送 ACK 数据包,进入 TIME-WAIT 状态;服务端收到后进入 CLOSE 状态。客户端等待 2MSL 后依然没收到回复,说明服务端已关闭,客户端也随即关闭。

第 2、3 步的解释:服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
第 4 步等待 2MSL 的解释:客户端发送的 ACK 可能丢失,服务端收不到 ACK 就会重发 FIN,此时客户端在 2MSL 的时间内就会收到重发的 FIN,然后重新发送 ACK 并再次等待 2MSL。即等待 2MSL 的目的是防止服务端因没有收到 ACK 而不断重发 FIN。

第 2、3 步的解释:服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。

第 4 步等待 2MSL 的解释:客户端发送的 ACK 可能丢失,服务端收不到 ACK 就会重发 FIN,此时客户端在 2MSL 的时间内就会收到重发的 FIN,然后重新发送 ACK 并再次等待 2MSL。即等待 2MSL 的目的是防止服务端因没有收到 ACK 而不断重发 FIN。

HTTP

Cookie 和 Session 的区别是什么?

  • Session 是一个保存在服务端的一个数据结构,用来跟踪用户的状态。具体数据结构类似于 Map,键为用户的 session ID,用户发送请求时会用 Cookie 带上这个 session ID,就能取出对应的值了。
  • Cookie 是一种 在客户端保存用户信息 的机制,第一次创建 Session 时,服务端会在 HTTP 协议中告诉客户端:需要在 Cookie 里记录一个 session ID,把这个 Cookie 发送给服务器就能告诉服务器自己的身份。
    Cookie 的缺点:

    容量:只能存储少量信息
    性能:不管请求的地址需不需要 Cookie,请求都会携带上完整的 Cookie,随着请求数增多,会造成性能浪费。可以通过设置 Domain 和 Path 属性来指定 Cookie 的作用域。
    安全:Cookie 以纯文本形式传递,容易被截获,然后被篡改后重新发送给服务器。

  • 容量:只能存储少量信息
  • 性能:不管请求的地址需不需要 Cookie,请求都会携带上完整的 Cookie,随着请求数增多,会造成性能浪费。可以通过设置 Domain 和 Path 属性来指定 Cookie 的作用域。
  • 安全:Cookie 以纯文本形式传递,容易被截获,然后被篡改后重新发送给服务器。

forward 和 redirect 的区别是什么?

  • forward:转发,浏览器请求某个地址,服务器在内部访问跳转后的地址,将其返回的内容发送给浏览器。跳转过程是在服务器上实现的,地址栏还是原来的地址。
  • redirect:重定向,服务器发送给浏览器一个状态码,让 浏览器自己去请求跳转的地址。
  • 在 forward 中,当前页面和转发到的页面可以共享 request 里面的数据,而 redirect 不能共享数据。
  • forward 一般用于用户登录时,根据角色转发到相应的模块;redirect 一般用于 用户注销时返回主页。

HTTP 请求的过程:

  • 浏览器根据 url 向 DNS 服务器请求解析 IP 地址
  • 浏览器与服务器建立 TCP 连接
  • 浏览器发送 HTTP 请求报文
  • 服务器响应
  • 释放 TCP 连接
  • 浏览器渲染

常用方法

  • GET:请求服务器发送某些资源。
  • HEAD:请求资源的头部信息,这些信息与 GET 方法返回的头部信息一致。
  • PUT、POST、DELETE
  • TRACE:回显服务器收到的请求,用于测试或诊断。
  • PATCH:对资源进行部分修改。

get 和 post 的区别:

  • 缓存:get 请求会被浏览器缓存下来。
  • 编码:get 只能进行 url 编码,只能接收 ASCII 字符,而 post 没有限制。
  • 幂等:get 是幂等的。(发送 M 次和 N 次请求,服务器上的资源状态一致。)
  • TCP 传输:get 会把请求报文一次性发出去,而 post 会分为两个 TCP 数据包,首先发送 header 部分,如果服务器响应 100(continue),则再发送 body 部分。

请求报文格式

  • 起始行:方法 + 请求路径 + HTTP版本 GET /home HTTP/1.1
  • 头部:若干个键值对表示请求信息。
  • 空行L:用来区分头部和实体(body)。
  • 实体:请求体/响应体中具体的数据。

常见的状态码

  • 200 OK,表示客户端的请求在服务器端被正确处理。
  • 204 No content:表示请求成功,但响应报文不含 body 部分。
  • 206 Partial Content:表示返回部分内容,使用场景为 HTTP 分块下载和断点续传,响应头中会指定 Content-Range 字段。
  • 301 Moved Permanently:永久重定向,浏览器会做缓存优化,在第二次访问的时候自动访问重定向到的那个地址。
  • 302 Found:临时重定向,当前访问地址暂时不可用,浏览器不会做缓存优化。
  • 400 Bad Request
  • 403 Forbidden:服务器禁止访问。
  • 404 Not Found:资源未找到。
  • 405 Method Not Allowed:请求方法不被服务器端允许。
  • 500 Internal Server Error
  • 503 Service Unavailable:服务器忙,暂无法响应。

HTTP 的缺点

  • 无状态:无状态这个特点有利有弊 —— 在只需要获取少量数据,不需要保存连接上下文信息时,无状态可以减少网络开销;而 在需要长连接的场景中,需要保存大量上下文信息,以免传输大量重复的信息,此时无状态就是缺点了。
  • 明文传输:协议里的报文使用文本形式传输。
  • 队头阻塞问题:当开启长连接时,共用一个 TCP 连接,同一时刻只能处理一个请求,如果某个请求耗时过长,下一个请求只能处于阻塞状态。
    HTTP 1.1 解决队头阻塞问题的方案:1 并发连接:对于一个域名允许分配多个长连接(Chrome 中是 6 个)。2 域名分片:在一个域名下分出多个二级域名,它们都指向同一台服务器,每个域名都支持 6 个长连接。

HTTP 的安全问题有哪些?

  • 窃听:使用明文通信,内容可能被窃听;
  • 伪装:不验证通信方的身份,对方身份可能被伪装;
  • 篡改:无法验证报文的完整性,报文可能被篡改。

HTTPS 通过混合加密来防窃听,通过数字签名防篡改,通过 CA 证书来验证发送方身份。

HTTPS 通过混合加密来防窃听,通过数字签名防篡改,通过 CA 证书来验证发送方身份。

HTTPS 是如何保证安全的?

1 混合加密

对称加密:通信双方都使用同一个秘钥进行加密和解密。无法解决首次把秘钥发送给对方时,很容易被截获的问题。

非对称加密:公钥和私钥组成一个密钥对,用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。通信双方的手里都有一套自己的密钥对,通信之前双方会先把自己的公钥都发送给对方,然后 对方拿这个公钥来加密要发送的数据,接收方用自己的私钥对其解密。问题是速度慢。

  • 公钥加密,私钥解密,是为了保证内容传输的安全,因为被公钥加密的内容只有持有私钥的人才能解密;
  • 私钥加密,公钥解密,是为了保证消息不会被冒充,因为私钥不可泄露,所以如果公钥能够解密出私钥加密的内容,就能证明这个消息来源于私钥持有人。

非对称加密的主要用途是 通过私钥加密、公钥解密的方式,来确认消息的身份

可以结合两种加密方式,使用非对称加密解决对称加密发送秘钥不安全的问题 —— 将对称加密的秘钥使用非对称加密的公钥进行加密(双方仍然需要首先互发自己的公钥),然后发送出去,接收方使用私钥进行解密得到对称加密的秘钥,然后双方可以 使用对称加密进行沟通。但这样又带来一个 中间人问题:在最开始通信双方互发公钥时,中间人将这两个公钥截获,换成自己的公钥,这样就能解密双方通信的内容了。

使用混合加密,保证传输信息的机密性,解决了窃听风险。

使用混合加密,保证传输信息的机密性,解决了窃听风险。

2 摘要算法 + 数字签名 + CA

这时候需要一个 证书颁发机构(CA),证书中包括签发者、证书用途、使用者的公钥私钥和 Hash 算法、证书到期时间等。另外使用 数字签名 这一技术:使用 CA 自带的 Hash 算法对证书内容进行 Hash 得到一个摘要(指纹),再用 CA 的私钥加密,生成数字签名。接收者收到证书时,使用同样的 Hash 算法再次生成消息摘要,然后用 CA 的公钥对数字签名解密,将它和消息摘要对比,就知道有没有被篡改。

HTTP2 有什么优势?

  • 二进制分帧: 采用二进制格式传输数据,而不再是文本格式,且数据由一个或者多个帧组成,二进制协议解析起来更快。
  • 服务器推送:服务端可以在发送页面 HTML 时主动推送其他资源(JS、CSS等),而不用等到浏览器解析到相应位置时再次发起请求。
  • 头部压缩:HTTP1.x 会在请求和响应中重复携带不常改变的、冗长的头部数据,给网络带来额外的负担。HTTP2 在客户端和服务器使用 首部表 来跟踪和存储之前发送的键值对,对于相同的数据,不再通过每次请求和响应发送。客户端和服务器共同渐进地更新首部表。即,只发送差异数据。
  • 多路复用:HTTP1.x 中,如果想并发发送多个请求,必须使用多个 TCP 连接,且浏览器会对单个域名有连接限制。HTTP2 同域名下的所有通信都在单个连接上完成,单个连接可以承载任意数量的双向数据流,数据流以消息形式发送,消息由若干个帧组成,多个帧之间可以乱序发送,可以根据首部的标识字段重新组装。