网络通信是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:全双工长连接,服务端可主动推送,适合实时通信。
