首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

应对网络面试常见问题:洞察与扩展

  • 25-04-19 14:21
  • 3892
  • 13258
juejin.cn

应对网络面试常见问题:洞察与扩展

技术面试,尤其是网络相关的面试,常常令人望而生畏。问题往往深入到协议、端口和系统命令的细节,考验你的基础知识和临场反应能力。在这篇博客中,我将回顾最近一次面试中遇到的几个具有挑战性的网络问题,详细解答,并扩展讨论以提供更深入的见解,为未来的准备打下基础。让我们逐一分析我遇到的四个问题,探讨正确答案,并深入相关概念以加深理解。


1. HTTP 的默认端口号?

面试回答:80
正确性:正确
详细解析:
HTTP(超文本传输协议)是用于传输网页数据的应用层协议,其默认端口号为 80。这是互联网标准的一部分,由 IANA(互联网编号分配机构)定义。例如,当你在浏览器中输入 http://example.com 时,浏览器会自动使用 80 端口与服务器通信。如果是 HTTPS(安全的 HTTP),默认端口号则是 443。

扩展知识:

  • 端口号的作用:端口号是传输层(TCP/UDP)用于区分同一主机上不同应用或服务的标识。0-1023 是“知名端口”,分配给标准协议(如 HTTP 的 80、SSH 的 22)。1024-49151 是注册端口,49152-65535 是动态/私有端口。
  • 非默认端口:在实际应用中,HTTP 服务可能运行在非标准端口(如 8080),通常用于开发或测试环境。访问时需显式指定端口,例如 http://example.com:8080。
  • 面试加分点:提到 HTTPS 的 443 端口,或者讨论端口冲突问题(同一端口不能被多个进程同时监听,除非涉及 UDP/TCP 复用,详见问题 4)。

实践建议:
熟悉常见协议的默认端口号(如 FTP:21、SSH:22、DNS:53)是网络面试的基础。可以通过查看 /etc/services 文件(Linux/Unix 系统)或 IANA 官方端口列表来强化记忆。


2. Linux 中查看进程监听端口号的命令?

面试回答:netstat -ntlp
正确性:基本正确,但不够全面,且 netstat 在现代 Linux 系统中已逐渐被更高效的工具替代。
正确答案:
以下是几种常用的 Linux 命令,用于查看进程监听的端口号:

  1. ss -tuln:
    • 这是现代 Linux 系统中推荐的工具,替代 netstat。
    • -t:显示 TCP 端口;-u:显示 UDP 端口;-l:显示监听状态;-n:以数字形式显示端口号(不解析为服务名)。
    • 示例输出:
      ruby
      代码解读
      复制代码
      Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 127.0.0.1:22 0.0.0.0:* udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
  2. netstat -ntlp:
    • -n:显示数字形式的地址和端口;-t:显示 TCP 连接;-l:显示监听状态;-p:显示关联的进程 ID 和程序名。
    • 注意:netstat 可能需要安装 net-tools 包,且性能不如 ss。
  3. lsof -i -P -n:
    • lsof(列出打开的文件)可用于查看端口占用情况。
    • -i:显示网络文件;-P:显示端口号而非服务名;-n:避免 DNS 解析以提高速度。
    • 示例:lsof -i :80 查看占用 80 端口的进程。

扩展知识:

  • 为什么 ss 优于 netstat?
    ss 直接访问内核网络堆栈,速度更快,输出更简洁。netstat 需要遍历 /proc 文件系统,效率较低,尤其在高负载系统上。
  • 权限问题:查看所有进程的端口(如 netstat -ntlp 或 ss -tuln)通常需要 root 权限,否则只能看到当前用户的进程。可以用 sudo 提升权限。
  • 实际场景:在调试网络服务时,常用这些命令排查端口冲突。例如,启动 Nginx 时提示“80 端口已被占用”,可以用 ss -tuln | grep 80 找到占用端口的进程。

实践建议:

  • 熟悉 ss 和 netstat 的常用选项,尤其是 ss -tuln,因为它是现代 Linux 系统的标配。
  • 练习在虚拟机或云服务器上运行这些命令,结合 ps 或 top 查看进程详细信息。
  • 了解 /proc/net/tcp 和 /proc/net/udp 文件,这些是 ss 和 netstat 读取的底层数据源。

3. UDP 传输如何解决乱序问题?

面试回答:提到在包中添加序列号,但未完整答出。
正确答案:
UDP(用户数据报协议)是无连接的传输层协议,不保证数据包的顺序、可靠性或完整性。因此,解决乱序问题需要在 应用层 实现。常见方法包括:

  1. 序列号:
    • 应用层在每个 UDP 数据包中添加一个序列号字段。接收端根据序列号对收到的数据包进行重新排序。
    • 示例:RTP(实时传输协议)使用序列号来处理音视频流中的乱序问题。
  2. 缓冲区:
    • 接收端维护一个缓冲区,存储收到的数据包,直到按序列号排序完成后再交给上层应用处理。
    • 这种方式适用于对实时性要求不高的场景(如文件传输)。
  3. 时间戳:
    • 在数据包中添加时间戳,接收端根据时间戳推断数据包的顺序。
    • 常用于实时应用(如 VoIP),但需要同步时钟。
  4. 应用层协议:
    • 某些协议(如 QUIC,基于 UDP)在 UDP 之上实现了自己的重传、排序和拥塞控制机制,弥补了 UDP 的不足。

扩展知识:

  • UDP vs. TCP:
    TCP 内置了序列号、确认机制和重传机制,天然解决乱序和丢包问题。但 UDP 更轻量,适合实时性要求高的场景(如视频流、DNS 查询),因此需要在应用层补齐可靠性机制。
  • 乱序原因:
    数据包乱序通常由网络路径不同、路由器排队延迟或多路径传输引起。
  • 实际案例:
    • 在游戏开发中,UDP 常用于传输玩家位置数据,客户端通过序列号检测和重排数据包,确保同步。
    • 在 DNS 查询中,UDP 不太关心乱序,因为查询通常是单包请求-响应模型。

实践建议:

  • 学习常见基于 UDP 的协议(如 RTP、DNS、QUIC),了解它们如何处理乱序或可靠性问题。
  • 尝试用 Python 编写一个简单的 UDP 客户端-服务器程序,在数据包中添加序列号并实现重排序逻辑。
  • 面试时可以提到:“UDP 本身不处理乱序,但应用层可以通过序列号和缓冲区解决,类似 TCP 的机制。”

4. 某个端口已经监听了 UDP,是否能再监听 TCP?

面试回答:未答出。
正确答案:可以。
同一个端口可以同时被 UDP 和 TCP 监听,因为 TCP 和 UDP 是两种不同的传输层协议,操作系统在处理端口绑定时会分别维护它们的监听状态。

详细解析:

  • 端口绑定的原理:
    在 Linux/Unix 系统中,端口绑定由内核的网络堆栈管理。TCP 和 UDP 的监听端口存储在不同的命名空间中,因此互不干扰。例如,一个进程可以用 UDP 监听 12345 端口,另一个进程可以用 TCP 监听同一个 12345 端口。
  • 代码示例(Python):
    python
    代码解读
    复制代码
    import socket # UDP 监听 12345 端口 udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_sock.bind(('0.0.0.0', 12345)) # TCP 监听同一 12345 端口 tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_sock.bind(('0.0.0.0', 12345)) tcp_sock.listen(5)
    上述代码可以正常运行,证明 UDP 和 TCP 可以共存于同一端口。

注意事项:

  • 同一协议的限制:同一个协议(TCP 或 UDP)不能有多个进程监听同一端口,除非使用 SO_REUSEADDR 或 SO_REUSEPORT 套接字选项(常用于负载均衡场景)。
  • 实际应用:这种场景较为少见,但在某些服务中可能出现。例如,DNS 服务默认在 53 端口同时支持 TCP 和 UDP 查询(UDP 用于快速查询,TCP 用于大数据量传输,如区域传输)。

扩展知识:

  • SO_REUSEADDR 和 SO_REUSEPORT:
    • SO_REUSEADDR 允许在端口释放后立即重用,避免“Address already in use”错误。
    • SO_REUSEPORT(Linux 3.9+)允许多个进程绑定同一协议的同一端口,用于高并发场景(如 Nginx 集群)。
  • 端口冲突的排查:
    如果遇到端口冲突问题,可以用 ss -tuln 或 netstat -ntlp 检查占用情况,然后用 kill 终止相关进程。
  • 面试加分点:
    提到 DNS 的 TCP/UDP 共用 53 端口,或者讨论 SO_REUSEPORT 在现代服务器中的应用。

实践建议:

  • 在本地用 Python 或 C 编写程序,尝试让 UDP 和 TCP 同时监听同一端口,验证可行性。
  • 了解 Linux 套接字选项(如 setsockopt),尤其是 SO_REUSEADDR 和 SO_REUSEPORT 的用法。
  • 面试时可以回答:“TCP 和 UDP 是独立的协议,操作系统允许它们同时监听同一端口,DNS 就是一个典型例子。”

总结与面试准备建议

这次面试暴露了我对 Linux 命令和 UDP 协议细节的不足,但也让我意识到网络知识的深度和广度。以下是一些准备网络面试的建议:

  1. 打牢基础:熟悉 HTTP、TCP、UDP 等协议的工作原理,牢记常见端口号。
  2. 多实践 Linux 命令:在虚拟机或云服务器上练习 ss、netstat、lsof,并结合 tcpdump 或 Wireshark 分析网络流量。
  3. 深入协议细节:学习 UDP 如何在应用层实现可靠性(如序列号、QUIC),以及 TCP 的三次握手、四次挥手等机制。
  4. 模拟面试场景:找朋友或用 LeetCode/HackerRank 的系统设计题目模拟面试,练习清晰表达技术细节。
  5. 查漏补缺:对偏门问题(如 TCP/UDP 同端口监听)保持开放心态,面试后查阅资料加深理解。

网络面试不仅是知识的较量,也是对学习能力和沟通能力的考验。希望这篇博客能帮助你更好地准备网络相关面试,少走弯路,顺利拿下 offer!

注:本文转载自juejin.cn的Asthenian的文章"https://juejin.cn/post/7494502691361357858"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

103
后端
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top