网络通信面试题精选

网络通信是Java后端面试的核心领域,涵盖TCP/IP、HTTP、网络编程等知识点。

1. TCP三次握手过程及原因?

  • 第一次:客户端发送SYN=1, seq=x 给服务端,进入SYN_SENT状态。
  • 第二次:服务端回复SYN=1, ACK=1, seq=y, ack=x+1,进入SYN_RCVD状态。
  • 第三次:客户端发送ACK=1, seq=x+1, ack=y+1,双方进入ESTABLISHED状态。

为什么三次?:确认双方都有发送和接收能力。防止历史连接请求导致服务端资源浪费(两次握手会导致旧的SYN到达服务端时误建连接)。

2. TCP四次挥手过程?

  • 第一次:主动方发送FIN=1, seq=u,进入FIN_WAIT_1。
  • 第二次:被动方回复ACK=1, ack=u+1,进入CLOSE_WAIT。主动方进入FIN_WAIT_2。
  • 第三次:被动方发送FIN=1, seq=w,进入LAST_ACK。
  • 第四次:主动方回复ACK=1, ack=w+1,进入TIME_WAIT,等待2MSL后关闭。被动方关闭。

TIME_WAIT存在原因:确保最后一个ACK到达被动方;让旧连接的报文在网络中消亡。

3. TCP和UDP的区别?

  • 连接:TCP面向连接(三次握手),UDP无连接。
  • 可靠性:TCP可靠传输(确认、重传、序号、流量控制、拥塞控制),UDP不可靠。
  • 有序性:TCP保证有序,UDP不保证。
  • 速度:TCP较慢(头部20字节),UDP快(头部8字节)。
  • 场景:TCP用于文件传输、HTTP;UDP用于视频直播、DNS、游戏。

4. HTTP和HTTPS的区别?

  • 端口:HTTP默认80,HTTPS默认443。
  • 安全性:HTTP明文传输,HTTPS使用TLS/SSL加密。
  • 证书:HTTPS需要CA证书,HTTP不需要。
  • 性能:HTTPS多了TLS握手开销,但HTTP/2和会话复用已大幅优化。
  • HTTPS握手:TCP三次握手后还需TLS握手,协商加密算法、交换密钥、验证证书。

5. HTTP状态码及含义?

  • 1xx信息:100 Continue。
  • 2xx成功:200 OK,201 Created,204 No Content。
  • 3xx重定向:301永久重定向,302临时重定向,304 Not Modified。
  • 4xx客户端错误:400 Bad Request,401 Unauthorized,403 Forbidden,404 Not Found,429 Too Many Requests。
  • 5xx服务端错误:500 Internal Server Error,502 Bad Gateway,503 Service Unavailable,504 Gateway Timeout。

6. TCP流量控制和拥塞控制的区别?

  • 流量控制:端到端,通过滑动窗口控制发送速度,防止接收方处理不过来。利用ACK报文中的窗口大小字段。
  • 拥塞控制:全局性,防止网络过载。算法包括:慢启动(指数增长)、拥塞避免(线性增长)、快重传(3个重复ACK)、快恢复。

7. 从浏览器输入URL到页面展示的全过程?

  • DNS解析:浏览器缓存→系统缓存→路由器缓存→ISP DNS→递归查询,获取IP。
  • TCP连接:三次握手建立连接。
  • TLS握手(HTTPS):协商加密算法、验证证书、交换密钥。
  • 发送HTTP请求:构造请求报文(方法、URL、头部、body)。
  • 服务器处理:接收请求→路由分发→业务处理→查询数据库→生成响应。
  • 接收响应:浏览器解析HTML→构建DOM树→解析CSS→构建渲染树→布局→绘制。
  • 连接关闭:根据Connection头部决定保持或关闭。

8. TCP粘包/拆包问题及解决方案?

TCP是流式协议,没有消息边界,导致粘包(多个消息合并)和拆包(一个消息被拆分)。

  • 固定长度:每条消息固定长度。
  • 分隔符:用特殊字符作为消息边界,如换行符。
  • 长度字段:消息头中包含长度字段(最常用),如Netty的LengthFieldBasedFrameDecoder。

9. select、poll、epoll的区别?

  • select:使用fd_set(1024限制),每次遍历所有fd,O(n),内核到用户空间拷贝fd_set。
  • poll:用链表代替数组,无数量限制,但仍O(n)遍历。
  • epoll:基于事件驱动,红黑树管理fd,就绪链表返回活跃fd,O(1)。支持水平触发(LT)和边缘触发(ET)。

Java NIO的Selector在Linux底层就是epoll实现。Netty也基于epoll实现高性能网络通信。

10. 长连接和短连接的区别?

  • 短连接:每次请求都建立TCP连接,完成后断开。早期HTTP/1.0默认方式。
  • 长连接:Connection: keep-alive,一个TCP连接可发多个请求。HTTP/1.1默认开启。
  • 对比:长连接减少握手开销,但服务端需保持连接,占用资源。可通过心跳包保活。
  • WebSocket:全双工长连接,服务端可主动推送,适合实时通信。

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注