- 博客(447)
- 收藏
- 关注
原创 为什么 TCP 挥手需要有 TIME_WAIT 状态?
在四次挥手的第四次交互中,主动关闭方(如客户端)会向被动关闭方(如服务器)发送最后一个 ACK 报文(确认服务器的 FIN 报文)。这个 ACK 报文可能因网络延迟或丢失,导致服务器收不到确认。若没有TIME_WAIT状态:客户端发送 ACK 后立即关闭连接,若 ACK 丢失,服务器会因未收到确认而持续重传 FIN 报文,并一直处于LAST_ACK状态,导致服务器资源(端口、内存)被长期占用,最终可能耗尽资源。有TIME_WAIT状态时:客户端在发送 ACK 后进入TIME_WAIT,等待 2MSL。
2025-08-01 10:46:40
412
原创 说说 TCP 的四次挥手?
TCP 四次挥手是关闭全双工连接的必要过程,通过四次交互分别关闭两个方向的数据流,确保双方数据完整传输。Java 中通过触发挥手过程,底层由操作系统管理状态转换(尤其是TIME_WAIT状态)。理解四次挥手有助于排查连接关闭相关问题(如端口占用、数据残留),是构建可靠网络应用的基础。
2025-08-01 10:45:13
861
原创 TCP 协议是如何保证可靠传输的?
TCP 协议通过确认与重传解决丢包问题,序列号与确认号解决乱序和重复问题,滑动窗口实现流量控制和高效传输,拥塞控制避免网络拥堵,校验和检测数据损坏,再配合三次握手/四次挥手管理连接,共同实现了可靠传输。在 Java 开发中,这些机制由底层 TCP 协议栈自动实现,开发者通过Socket等 API 即可直接利用其可靠性,无需关心细节。理解这些机制有助于排查网络问题(如延迟可能与拥塞控制有关,数据不完整可能是重传机制失效)。
2025-08-01 10:43:20
603
原创 什么是 SYN Flood 攻击?
SYN Flood 攻击利用 TCP 三次握手的漏洞,通过大量无效 SYN 报文耗尽服务器半连接队列资源,导致服务不可用。防御的核心是通过SYN Cookie 机制摆脱对队列的依赖,辅以队列扩容、重传优化和流量过滤。Java 开发者需合理配置backlog参数,使用高效网络框架,并依赖系统层防御措施,才能有效抵御此类攻击。
2025-08-01 10:28:10
543
原创 TCP 三次握手时,发送 SYN 之后就宕机了会怎么样?
发送 SYN+ACK 并进入SYN_RCVD状态;启动超时定时器,按指数退避策略重传 SYN+ACK(默认 5 次);重传失败后,从半连接队列移除该连接,释放资源。此过程可能短期占用服务器资源,但通过操作系统的队列限制、SYN Cookie 等机制,可有效避免大规模影响。Java 开发者虽无法直接控制底层逻辑,但可通过backlog参数和系统配置优化服务器的连接处理能力。
2025-08-01 10:26:49
624
原创 TCP 初始序列号 ISN 怎么取值的?
TCP 的初始序列号(ISN)取值遵循“时间线性递增 + 随机偏移时间递增确保序列号空间不重叠,避免旧数据干扰;随机偏移增强安全性,抵御序列号猜测攻击;具体实现由操作系统内核完成,Java 等应用层语言无法直接控制或获取 ISN。这一设计平衡了 TCP 的可靠性和安全性,是 TCP 协议能在复杂网络环境中稳定运行的重要基础。
2025-08-01 10:25:30
475
原创 说说 TCP 的三次握手?
确认了客户端和服务器的发送/接收能力均正常。协商了初始序列号,为后续数据的有序传输、确认和重传奠定基础。避免了无效连接请求导致的服务器资源浪费。在 Java 开发中,三次握手由Socket和底层自动实现,开发者只需关注连接建立后的业务逻辑,但理解其原理有助于排查连接超时、连接失败等网络问题(如半连接队列满、SYN 报文被防火墙拦截等)。
2025-08-01 10:24:16
337
原创 TCP 的粘包和拆包能说说吗?
TCP 是“面向字节流”的协议,它将应用程序发送的数据视为连续的字节序列,不维护“消息”或“数据包”的边界。粘包:多个独立的数据包被合并成一个字节流发送,接收方一次读取到多个数据包的内容。例:发送方分两次发送A和B,接收方可能一次收到AB。拆包:一个大的数据包被拆分成多个小的字节流发送,接收方需要多次读取才能获得完整的数据包。例:发送方发送ABCDE,接收方可能先收到ABC,再收到DE。TCP 的粘包和拆包是字节流特性的必然结果,核心解决思路是在应用层添加消息边界。
2025-08-01 10:22:58
604
原创 为什么要 TCP,IP 层实现控制不行么?
IP层保持简单、无状态,专注于高效的跨网络包传递,确保网络核心(路由器)能快速处理海量数据。TCP层在端系统(主机)上实现复杂的端到端控制,满足应用对可靠性、流量控制的需求,同时保留灵活性(允许UDP等其他传输层协议)。这种设计让互联网既能高效运转,又能适配多样化的应用需求——这正是TCP/IP协议栈能成为互联网基石的核心原因。
2025-08-01 10:21:20
668
原创 TCP 和 UDP 有什么区别?
TCP和UDP的核心差异源于“可靠性”与“效率”的权衡:TCP通过连接、确认、重传等机制牺牲效率换取可靠性,适合对数据完整性要求高的场景;UDP则以牺牲可靠性为代价追求高效,适合对实时性要求高的场景。在Java开发中,需根据业务需求选择对应协议——用Socket实现TCP通信,用实现UDP通信,才能最大化发挥协议优势。
2025-08-01 10:19:51
516
原创 TCP 是用来解决什么问题?
TCP 的核心价值是在不可靠的网络中提供可靠的字节流传输服务,通过确认重传、序列号、滑动窗口、拥塞控制等机制,解决了数据丢失、损坏、乱序、重复、流量不匹配、网络拥堵等关键问题。Java 中的Socket编程简化了 TCP 的使用,让开发者能直接利用这些机制构建可靠的网络应用(如 HTTP 服务器、文件传输工具、即时通讯软件等)。理解 TCP 解决的问题,有助于在开发中合理选择协议(如需要可靠性用 TCP,需要实时性用 UDP),并更好地排查网络通信问题(如延迟可能与 TCP 拥塞控制有关)。
2025-08-01 10:17:35
448
原创 到底什么是 TCP 连接?
TCP 连接是基于 TCP 协议的逻辑通信通道,通过三次握手建立、四次挥手关闭,依靠序列号、确认机制、滑动窗口等保证可靠传输。它是互联网中“可靠通信”的基石,Java 通过Socket和简化了 TCP 连接的使用,让开发者无需关注底层协议细节即可实现可靠通信。理解 TCP 连接的核心是:它不仅是“连接”本身,更是一套保证数据有序、完整、高效传输的规则集合。
2025-08-01 10:16:18
857
原创 服务端是如何解析 HTTP 请求的数据?(考察 HTTP 请求格式的了解程度)
服务端解析HTTP请求的本质是按协议格式拆分字节流:先解析请求行获取核心元数据,再解析头部得到请求上下文,最后根据头部信息解析请求体。Java中,Web容器(如Tomcat)已封装底层解析逻辑,开发者通过即可便捷获取数据;若需深入理解,可通过手动处理字节流模拟解析过程,核心是严格遵循HTTP请求的格式规范。
2025-08-01 10:13:06
884
原创 WebSocket 与 HTTP 有什么区别?
特性HTTPWebSocket通信模式单向(请求-响应)双向(全双工)连接类型短连接(或长连接但仍需请求)持久连接服务器推送不支持(需客户端轮询)原生支持头部开销每次请求携带完整头部仅握手阶段有头部,之后开销极小适用场景非实时请求(网页、API)实时通信(聊天、实时数据)协议标识建立方式直接请求HTTP 握手升级协议实际开发中,需根据业务场景选择:简单的请求-响应选 HTTP,实时双向通信选 WebSocket。
2025-08-01 10:10:51
845
原创 HTTP 中 GET 和 POST 的区别是什么?
特性GETPOST用途获取资源提交数据数据位置URL query 参数请求体(Request Body)可见性可见(URL 中)不可见(请求体中)长度限制有(URL 长度限制)无(由服务器配置决定)安全性较低(不适合敏感数据)较高(需配合 HTTPS)缓存可缓存默认不缓存幂等性幂等非幂等实际开发中,应根据业务场景选择合适的请求方法:查询数据用 GET,提交/修改数据用 POST。
2025-08-01 10:05:33
303
原创 HTTP和HTTPS有什么区别?
HTTPS是HTTP的安全增强版,通过SSL/TLS加密解决了HTTP的明文传输风险,但带来了性能开销和配置复杂度。在Java开发中,处理HTTPS需注意证书验证(尤其是自签名证书的特殊处理),而生产环境应始终优先使用HTTPS保护数据安全。
2025-07-31 10:21:29
792
原创 HTTP请求包含哪些内容,请求头和请求体有哪些类型?
HTTP请求由请求行、请求头、空行、请求体请求行定义“操作目标”(方法、URL、协议);请求头通过等字段定义“数据规则”;请求体根据携带“实际数据”(JSON、表单、文件等)。在Java开发中,需根据业务场景选择合适的请求体类型(如REST接口用JSON,文件上传用),并通过HttpClient或Spring注解()正确处理,确保请求符合HTTP规范,避免解析错误。
2025-07-31 10:19:16
570
原创 常见的HTTP状态码有哪些?
2xx:业务正常,可直接处理返回数据。3xx:需根据Location头进行重定向(客户端自动处理或手动跳转)。4xx:重点检查客户端请求(参数、权限、URL等),是接口调试的常见错误。5xx:需排查服务器端问题(日志、代码异常、资源占用等)。在Java开发中,合理使用状态码能让接口语义更清晰(如用201表示创建成功),同时便于前后端协作和问题定位。例如,Spring Boot中可通过注解自定义状态码,使响应更符合HTTP规范。
2025-07-31 10:05:41
878
原创 HTTP 2.0和3.0有什么区别?
HTTP 2.0解决了HTTP/1.1的"连接复用"和"并行请求"问题,但受限于TCP协议的固有缺陷(队头阻塞、连接建立慢),在高延迟、高丢包网络中表现不佳。HTTP 3.0通过QUIC协议彻底重构了传输层,解决了TCP的队头阻塞,优化了连接建立和迁移,特别适合移动互联网和高并发场景。目前,HTTP 3.0已成为主流趋势(如Google、Facebook、Cloudflare等大厂广泛部署),但HTTP 2.0仍会在兼容性要求高的场景中长期存在。
2025-07-31 10:01:50
507
原创 负数的二进制如何表示?
在计算机中,负数的二进制表示采用形式,这是为了简化加减法运算(统一用加法实现)并避免歧义。Java作为强类型语言,严格遵循补码规则处理整数类型(如byteshortintlong)的负数表示。
2025-07-31 10:00:04
328
原创 听说过CFS吗? (Linux )
CFS通过“虚拟运行时间”和“红黑树”实现了进程间的公平调度,是Linux系统处理多任务并发的核心机制。合理设计线程池大小,避免调度开销过大。正确设置线程优先级,优化关键任务性能。排查多线程程序中的性能瓶颈(如调度延迟导致的响应变慢)。简单来说,CFS让Linux系统在多任务场景下更“公平”,而这种公平性是Java多线程程序稳定运行的重要保障。
2025-07-31 09:58:00
659
原创 什么是物理地址,什么是逻辑地址?
物理地址是内存硬件的真实标识,是CPU访问内存的最终地址,对应用程序不可见。逻辑地址是程序使用的虚拟地址,通过操作系统的地址映射机制转换为物理地址,是现代内存管理(隔离、安全、虚拟内存)的基础。对于Java开发者而言,日常开发中接触的都是逻辑地址(如对象引用、内存区域划分),物理地址由操作系统和JVM底层自动处理,无需手动干预。理解这两者的区别,有助于深入理解程序的内存布局和JVM的运行机制。
2025-07-31 09:56:55
882
原创 Select、Poll、Epoll之间有什么区别?
Select:最古老,兼容性好但性能差,适合简单场景。Poll:解决了Select的FD数量限制,但仍有轮询和复制开销。Epoll:Linux特有,事件驱动模型,高并发下性能最优,是生产环境(尤其是Linux服务器)的首选。理解这三者的区别,能帮助你更好地优化Java NIO程序的性能,尤其是在高并发场景下选择合适的运行环境(如优先部署在Linux系统以利用Epoll)。
2025-07-31 09:55:50
438
原创 到底什么是Reactor?
Reactor模式是Java NIO的灵魂,其核心是通过“事件循环+多路复用”实现高效的I/O处理。它将传统BIO中“一个连接一个线程”的模型优化为“一个线程处理多个连接”,极大降低了资源消耗,是高性能网络编程的基石。理解Reactor模式,不仅能掌握Netty等框架的工作原理,更能在设计高并发系统时合理运用事件驱动思想提升性能。
2025-07-31 09:54:36
677
原创 同步、异步、阻塞、非阻塞的I/O的区别?
在Java中,同步/异步与阻塞/非阻塞是描述I/O操作特性的两组核心概念,它们从不同维度定义了I/O的行为模式。理解这四者的区别,是设计高性能网络程序的基础。
2025-07-31 09:52:48
563
原创 阻塞和非阻塞的区别?
特性阻塞(Blocking)非阻塞(Non-blocking)等待状态线程会被挂起(进入阻塞状态),暂停执行线程不会被挂起,始终保持运行状态资源占用阻塞时不消耗CPU资源(线程休眠)可能消耗CPU资源(需轮询检查状态)操作结果操作完成后线程被唤醒,直接获取结果无论操作是否完成,立即返回状态(成功/未就绪)典型场景BIO(阻塞I/O)、NIO(非阻塞I/O)、的非阻塞操作线程状态阻塞:线程会进入BLOCKED或WAITING状态,暂停执行,不占用CPU。非阻塞:线程始终处于。
2025-07-31 09:51:36
860
原创 同步和异步的区别?
特性同步(Synchronous)异步(Asynchronous)执行方式调用方发起任务后,必须等待任务完成才能继续执行后续操作调用方发起任务后,无需等待任务完成,直接继续执行后续操作控制权任务执行期间,控制权由任务本身持有(调用方被"挂起")任务执行期间,控制权始终在调用方手中结果获取任务完成后直接返回结果任务完成后通过回调、Future等方式通知调用方典型场景方法调用、阻塞I/O(BIO)异步I/O(AIO)、事件驱动编程、消息队列处理执行流程。
2025-07-31 09:49:45
417
原创 I/O模型有哪些?
Java的I/O模型从BIO到AIO,本质是不断优化线程的等待效率:BIO通过线程阻塞应对等待,NIO通过轮询避免阻塞,多路复用通过选择器集中管理等待,AIO则将等待完全交给操作系统。实际开发中,I/O多路复用(NIO)是平衡性能和复杂度的首选(如Netty框架),而BIO适合简单场景,AIO在特定高并发场景下更具优势。选择时需结合业务的并发量、延迟要求和开发成本综合判断。
2025-07-31 09:48:40
518
原创 为什么网络I/O会被阻塞?
网络I/O的阻塞本质是数据传输的不确定性导致的等待,Java默认的BIO模型通过线程阻塞的方式应对这种等待。虽然阻塞会降低并发能力,但实现简单;而NIO/NIO.2通过非阻塞、异步的设计,解决了高并发场景下的性能问题。在实际开发中,需根据业务场景选择合适的I/O模型:简单场景用BIO,高并发场景用NIO(如Netty框架)或AIO。
2025-07-31 09:47:29
876
原创 I/O是什么?
基于缓冲区(Buffer)操作,而不是直接操作流采用通道(Channel)进行数据传输支持非阻塞I/O操作提供了选择器(Selector)机制,可实现单线程管理多个通道NIO在处理大量并发连接时性能更优,特别适合网络编程。
2025-07-31 09:46:17
269
原创 说下你常用的 Linux 命令?
场景核心命令示例进程管理`ps -ef日志分析配置文件操作cp *.bak性能排查top系统资源监控free -hdf -h这些命令是Java开发的“基本功”,熟练掌握能大幅提升问题排查效率(如通过jstack5分钟定位死锁,比盲目调试快10倍)。日常开发中,建议结合实际场景多练习(如部署时用ps确认进程启动,报错时用grep检索异常日志)。
2025-07-30 16:58:38
413
原创 CPU 使用率和 CPU 负载指的是什么?它们之间有什么关系?
CPU 使用率:反映 CPU 被“实际占用”的时间比例,直接关联 Java 线程的执行强度(用户态)和内核交互频率(内核态)。CPU 负载:反映 CPU 需处理的“任务总数”,直接关联 Java 线程的数量和阻塞状态。关联逻辑:任务执行会同时推高使用率和负载,但阻塞任务只影响负载。对 Java 程序员而言,优化的目标不是“降低某个指标”,而是让两者“匹配 CPU 核心能力”——例如,8 核 CPU 上,使用率维持在 70%-80%、负载稳定在 6-8 左右,通常是 Java 程序高效运行的标志。
2025-07-30 16:57:14
646
原创 什么是分段、什么是分页?
分页是操作系统将虚拟内存和物理内存按固定大小分割的内存管理方式,目的是解决内存碎片问题,提高物理内存利用率。核心原理操作系统将虚拟地址空间划分为大小固定的块,称为页(Page)(通常为4KB、8KB等,由硬件或操作系统决定);同时将物理内存划分为与页大小相同的块,称为页框(Page Frame)。程序运行时,CPU生成的虚拟地址会被拆分为“页号+页内偏移量”,通过页表(记录页与页框的映射关系)找到对应的物理页框,完成地址转换。关键特点页的大小固定(由系统决定,如x86架构默认4KB);
2025-07-30 16:55:55
463
原创 为什么要有虚拟内存?
保障多Java应用共存时的内存安全(隔离性);简化JVM的内存管理(无需关心物理内存碎片、连续性);支撑高效IO操作(如)和动态内存调整(堆扩容)。理解虚拟内存,能帮助Java开发者更科学地配置JVM参数(如-Xmx设置需考虑虚拟地址空间大小)、排查性能问题(如卡顿可能源于swap频繁),让Java程序在复杂的生产环境中更稳定、高效地运行。
2025-07-30 16:54:34
685
原创 什么是软中断、什么是硬中断?
硬中断是“硬件到内核”的紧急通知,决定了Java程序能否及时感知外部事件(如网络数据);软中断是“内核到应用”的延迟通知,决定了Java线程能否高效处理这些事件(如NIO的就绪事件)。对Java程序员而言,了解两者的差异,能更深入理解IO模型(BIO/NIO/AIO)的底层原理,在优化高并发程序(如减少系统调用次数、合理设置线程池参数)时,避开因中断处理效率低导致的性能瓶颈。
2025-07-30 16:50:45
660
原创 线程和进程有什么区别?
进程是“独立的资源容器”,适合需要隔离性的场景(如分布式服务),但开销大、通信难。线程是“轻量的执行单元”,适合高频并发场景(如Web、大数据处理),但需处理共享资源的线程安全问题。理清这两者的区别,才能在设计并发程序时做出正确选择——比如何时用线程池优化性能,何时用多进程实现隔离,这也是从“会用Thread”到“精通并发编程”的关键一步。
2025-07-30 16:48:30
881
原创 进程的调度算法你知道吗?
进程调度算法决定了CPU资源的分配规则,而Java线程的运行效率完全依赖于这些底层规则。合理配置线程池参数(如核心线程数、队列类型)。避免因调度问题导致的性能瓶颈(如长任务阻塞线程池)。针对性优化实时性要求高的场景(如高频交易系统)。记住:好的Java程序,不仅要写对逻辑,更要顺应底层调度的“脾气”。
2025-07-30 16:43:43
462
原创 操作系统中的进程有哪几种状态?
若top命令显示Java进程长期处于D状态,可能是磁盘I/O卡壳(如NFS挂载失败);大量Z状态的子进程,可能是创建的进程未被正确回收;线程池线程频繁在“就绪”与“阻塞”间切换,可能是锁竞争过于激烈(需优化或使用记住:进程状态的本质是“资源等待”的反映,而Java程序的性能问题,往往就是进程在不恰当的状态停留过久的结果。
2025-07-30 16:41:47
679
原创 进程之间的通信方式有哪些?
进程间通信的本质是打破内存隔离,通过操作系统提供的“共享资源”(管道、内存、网络)或“信号机制”实现数据交换。对Java程序员而言,日常开发中最常用的是Socket(网络通信)和消息队列(异步解耦),而共享内存、信号量等底层方式多用于性能敏感场景(如高频数据交互)。理解不同IPC的适用场景,能帮助我们设计更高效、可靠的多进程协作系统。
2025-07-30 16:40:05
630
原创 什么是用户态和内核态?
用户态是应用程序的“安全区”,内核态是操作系统的“控制中心”。两者的切换是程序与系统交互的必经之路,但频繁切换会消耗性能。对Java程序员而言,优化的核心是减少不必要的系统调用(如用缓冲流、合理设计线程池),同时理解“Java代码的执行效率”不仅取决于算法,还与底层的状态切换密切相关。
2025-07-30 16:37:16
669
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人