JavaEE(5)网络原理初识

一、计算机网络是怎么来的?## 目录

最早计算机是独立模式,各个电脑完全独立,数据分散保存在各个终端。想要操作不同业务,人要跑到不同机器前面,效率极低。

随着业务发展,需要多台计算机协同、共享数据,于是出现网络互连:把多台计算机连接在一起,实现数据共享,也就是网络通信。

根据网络覆盖规模,分为两大类:

  1. 局域网LAN :局部私有网络,家庭、公司内网都属于局域网。组建方式可以网线直连、集线器Hub、交换机Switch、交换机+路由器。局域网内部主机可以自由通信,不同局域网不经过路由器是不能互通的。
    • Hub集线器:工作在物理层,简单信号复制转发。
    • Switch交换机:工作在数据链路层,基于MAC地址转发帧。
  2. 广域网WAN:通过路由器,把许许多多的局域网连接在一起,形成大范围网络。我们日常使用的互联网(公网)就是广域网的子集。

小知识点:局域网、广域网是相对概念,没有绝对严格的边界。

二、网络通信基础概念

网络通信本质:不同主机上的进程之间互相传输二进制数据 。

那怎么定位到是哪一台机器上的哪一个程序?这里就引出两个核心标识:IP地址、端口号。

1. IP地址

IP地址用来定位网络中的主机/网络设备 ,类比快递的收货地址。

IPv4是32位二进制,用点分十进制 表示:a.b.c.d,每一段0‑255,例如127.0.0.1本机回环地址。

2. 端口号

IP找到机器,端口号定位机器内部的进程 。

端口号范围:0‑65535

  • 0‑1023:知名端口,系统服务占用(HTTP 80、HTTPS443、SSH22、FTP21)
  • 1024‑65535:动态端口,客户端程序随机分配使用。

3. 五元组 ------ 唯一标识一次通信

一次完整网络通信由5个要素确定,就像完整快递单据:

  1. 源IP:发送方主机地址
  2. 源端口:发送方进程端口
  3. 目的IP:接收方主机地址
  4. 目的端口:接收方进程端口
  5. 协议号:使用什么传输协议(TCP/UDP)

Windows命令行可以用netstat -ano查看本机所有网络连接的五元组信息。

4. 什么是网络协议?

协议就是通信双方提前约定好的一套规则。

不同厂商、不同操作系统、不同硬件设备,想要互相通信,必须遵守统一约定:怎么建立连接、数据包长什么样、数据怎么解析。

协议最终体现为网络上传输的数据包格式。

通俗例子:两个人约好见面胸口插玫瑰花,玫瑰花就是双方的协议约定。

三、TCP/IP五层模型

OSI七层模型只是理论框架,没有大规模落地。现实互联网全部使用TCP/IP五层模型 ,自上而下五层:应用层、传输层、网络层、数据链路层、物理层。

分层 核心职责 典型协议 典型设备
应用层 应用程序之间交互,业务数据处理 HTTP、HTTPS、FTP、DNS、SSH 主机(我们写的网络程序运行在此层)
传输层 端到端进程通信,控制传输可靠性 TCP、UDP 防火墙
网络层 地址管理、路由选择,跨网段转发 IP、ARP、ICMP 路由器Router
数据链路层 相邻设备帧传输,MAC寻址 以太网协议 交换机Switch
物理层 光/电信号比特流传输,硬件介质 网线、光纤、无线电波 集线器Hub

各设备实现哪些层:

  • 完整主机:实现5层
  • 路由器:网络层、链路层、物理层(下3层)
  • 二层交换机:链路层+物理层(下2层)
  • Hub集线器:只实现物理层

封装与分用(打包和解包)

  1. 封装(发送数据):数据从应用层往下走,每一层给自己上层的数据加上本层头部(Header),向下交付给下一层。

    • 应用层数据 → 传输层加上TCP/UDP头部 → 段(segment)
    • 交给网络层加上IP头部 → IP数据报(datagram)
    • 交给链路层加上以太网头部尾部 → 帧(frame)
    • 物理层转为0/1比特流在网线传输。
  2. 分用(接收数据):数据到达目标主机,从物理层向上,每一层剥掉自己的头部,根据头部里的协议字段,把有效载荷交付给上层对应的协议。

类比寄快递:封装=层层打包贴不同面单;分用=一层层拆快递,交给对应负责人。

四、传输层:TCP与UDP核心对比

传输层有两大核心协议TCP、UDP,面试最高频考点。

UDP 用户数据报协议

特点:

无连接 :不需要提前握手,知道IP+端口直接发包。

面向数据报 :应用层给多少数据就发多少,不会拆分合并;发送一次send,接收必须一次receive读完。

不可靠传输 :没有确认应答、丢包不会重传;丢包就丢了,上层感知不到。

单个UDP报文最大64K,超过需要应用层手动分包拼装。

适用场景:直播、视频通话、游戏,允许少量丢包,追求低延迟。

TCP 传输控制协议(可靠传输)

TCP为了做到可靠传输,设计了一整套复杂机制:

  1. 确认应答ACK:每个字节编号(序列号),接收方回复确认号,告诉发送方"我收到哪里了,下一次从哪里发"。
  2. 超时重传:发送出去一段时间没有收到ACK,自动重传报文;利用序列号实现重复报文去重。
  3. 连接管理:三次握手建立连接,四次挥手断开连接
    • TIME_WAIT状态:主动关闭方最后状态,持续2MSL,保证网络残留报文全部消失,保证最后ACK能够送达对方。
    • CLOSE_WAIT大量堆积:服务端代码忘记调用close()关闭socket,程序bug。
    • 三次握手与四次挥手的完整时序如下(含 SYN、ACK、FIN 标志位与双方状态变化):

"服务端" "客户端" "服务端" "客户端" #mermaid-svg-kU5iY2HKiHyNEkUf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kU5iY2HKiHyNEkUf .error-icon{fill:#552222;}#mermaid-svg-kU5iY2HKiHyNEkUf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kU5iY2HKiHyNEkUf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kU5iY2HKiHyNEkUf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kU5iY2HKiHyNEkUf .marker.cross{stroke:#333333;}#mermaid-svg-kU5iY2HKiHyNEkUf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kU5iY2HKiHyNEkUf p{margin:0;}#mermaid-svg-kU5iY2HKiHyNEkUf .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kU5iY2HKiHyNEkUf text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-kU5iY2HKiHyNEkUf .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kU5iY2HKiHyNEkUf .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-kU5iY2HKiHyNEkUf .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-kU5iY2HKiHyNEkUf .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-kU5iY2HKiHyNEkUf #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-kU5iY2HKiHyNEkUf .sequenceNumber{fill:white;}#mermaid-svg-kU5iY2HKiHyNEkUf #sequencenumber{fill:#333;}#mermaid-svg-kU5iY2HKiHyNEkUf #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-kU5iY2HKiHyNEkUf .messageText{fill:#333;stroke:none;}#mermaid-svg-kU5iY2HKiHyNEkUf .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kU5iY2HKiHyNEkUf .labelText,#mermaid-svg-kU5iY2HKiHyNEkUf .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-kU5iY2HKiHyNEkUf .loopText,#mermaid-svg-kU5iY2HKiHyNEkUf .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-kU5iY2HKiHyNEkUf .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kU5iY2HKiHyNEkUf .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-kU5iY2HKiHyNEkUf .noteText,#mermaid-svg-kU5iY2HKiHyNEkUf .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-kU5iY2HKiHyNEkUf .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kU5iY2HKiHyNEkUf .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kU5iY2HKiHyNEkUf .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kU5iY2HKiHyNEkUf .actorPopupMenu{position:absolute;}#mermaid-svg-kU5iY2HKiHyNEkUf .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-kU5iY2HKiHyNEkUf .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kU5iY2HKiHyNEkUf .actor-man circle,#mermaid-svg-kU5iY2HKiHyNEkUf line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-kU5iY2HKiHyNEkUf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 三次握手:建立连接 "状态:CLOSED → SYN_SENT" "状态:LISTEN → SYN_RCVD" "状态:SYN_SENT → ESTABLISHED" "状态:SYN_RCVD → ESTABLISHED" 连接建立完成,双方进入 ESTABLISHED,可双向传输数据 "SYN=1, seq=x(不携带数据)" 1 "SYN=1, ACK=1, seq=y, ack=x+1" 2 "ACK=1, seq=x+1, ack=y+1(可携带数据)" 3
"服务端(被动关闭方)" "客户端(主动关闭方)" "服务端(被动关闭方)" "客户端(主动关闭方)" #mermaid-svg-zZEj0WYqwYblGyRs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zZEj0WYqwYblGyRs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zZEj0WYqwYblGyRs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zZEj0WYqwYblGyRs .error-icon{fill:#552222;}#mermaid-svg-zZEj0WYqwYblGyRs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zZEj0WYqwYblGyRs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zZEj0WYqwYblGyRs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zZEj0WYqwYblGyRs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zZEj0WYqwYblGyRs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zZEj0WYqwYblGyRs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zZEj0WYqwYblGyRs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zZEj0WYqwYblGyRs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zZEj0WYqwYblGyRs .marker.cross{stroke:#333333;}#mermaid-svg-zZEj0WYqwYblGyRs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zZEj0WYqwYblGyRs p{margin:0;}#mermaid-svg-zZEj0WYqwYblGyRs .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-zZEj0WYqwYblGyRs text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-zZEj0WYqwYblGyRs .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-zZEj0WYqwYblGyRs .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-zZEj0WYqwYblGyRs .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-zZEj0WYqwYblGyRs .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-zZEj0WYqwYblGyRs #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-zZEj0WYqwYblGyRs .sequenceNumber{fill:white;}#mermaid-svg-zZEj0WYqwYblGyRs #sequencenumber{fill:#333;}#mermaid-svg-zZEj0WYqwYblGyRs #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-zZEj0WYqwYblGyRs .messageText{fill:#333;stroke:none;}#mermaid-svg-zZEj0WYqwYblGyRs .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-zZEj0WYqwYblGyRs .labelText,#mermaid-svg-zZEj0WYqwYblGyRs .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-zZEj0WYqwYblGyRs .loopText,#mermaid-svg-zZEj0WYqwYblGyRs .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-zZEj0WYqwYblGyRs .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-zZEj0WYqwYblGyRs .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-zZEj0WYqwYblGyRs .noteText,#mermaid-svg-zZEj0WYqwYblGyRs .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-zZEj0WYqwYblGyRs .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-zZEj0WYqwYblGyRs .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-zZEj0WYqwYblGyRs .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-zZEj0WYqwYblGyRs .actorPopupMenu{position:absolute;}#mermaid-svg-zZEj0WYqwYblGyRs .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-zZEj0WYqwYblGyRs .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-zZEj0WYqwYblGyRs .actor-man circle,#mermaid-svg-zZEj0WYqwYblGyRs line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-zZEj0WYqwYblGyRs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 四次挥手:断开连接 "状态:ESTABLISHED → FIN_WAIT_1" "状态:ESTABLISHED → CLOSE_WAIT" "状态:FIN_WAIT_1 → FIN_WAIT_2" "服务端继续把剩余数据发完,之后调用 close()" "状态:CLOSE_WAIT → LAST_ACK" "状态:FIN_WAIT_2 → TIME_WAIT(等待 2MSL)" "状态:LAST_ACK → CLOSED" "2MSL 结束后:TIME_WAIT → CLOSED" "FIN=1, seq=u" 1 "ACK=1, seq=v, ack=u+1" 2 "FIN=1, ACK=1, seq=w, ack=u+1" 3 "ACK=1, seq=u+1, ack=w+1" 4

复制代码
- 握手为什么是三次:两次无法让服务端确认「客户端已收到自己的 SYN+ACK」,也无法防止历史失效连接请求突然到达而建立错误连接。
- 挥手为什么是四次:TCP 是全双工,两个方向要各自关闭;服务端收到 FIN 后可能还有数据要发,所以 ACK 与 FIN 通常分开发送(延迟确认时也可能合并成三次)。
  1. 滑动窗口:不用等一个ACK才发下一段,批量发送,提升吞吐量。
  2. 流量控制:接收端告诉发送方自己缓冲区剩余大小,防止发送太快把接收缓冲区打满。
  3. 拥塞控制:慢启动、拥塞避免,探测网络负载,不要把网络堵死。
  4. 延迟应答、捎带应答:尽可能扩大窗口,提升传输效率。

TCP面向字节流:数据存在内核缓冲区,读写次数没有严格对应关系,由此引出粘包问题 。

粘包解决思路:应用层界定数据包边界:①定长包;②包头携带数据包长度;③特殊分隔符分割报文。

UDP不存在粘包,UDP保留报文边界。

适用场景:网页浏览、文件下载、数据库访问,要求数据100%准确到达。

思考面试题:UDP本身不可靠,能否在UDP之上实现可靠传输?

答:可以,在应用层仿照TCP逻辑,自己实现序列号、ACK确认、超时重传。

五、网络层IP协议

IP地址分为网络号+主机号。

  • 网络号 :区分不同子网;主机号:区分同一子网内部不同主机。
  • CIDR表示法:如192.168.1.10/24,/24代表前24bit是网络号。

特殊IP

  1. 主机位全0:网络号,代表整个网段;
  2. 主机位全1:广播地址,向子网全部主机发消息;
  3. 127.x.x.x:本地回环地址,本机内部通信,不走网卡硬件。

私有IP与NAT技术

  • 私有IP(局域网内部):10.*、172.16‑172.31.*、192.168.*。私有IP只能内网使用,多个局域网可以重复使用同一套私有IP。
  • NAT(网络地址转换):路由器把内网主机私有IP替换成公网IP访问外网,解决IPv4地址不足的问题。NAPT同时转换IP+端口,区分内网不同主机。

NAT缺点:外网无法主动访问内网机器,所以自己写的服务程序如果要公网访问,需要部署在拥有公网IP的服务器上。

ARP协议

ARP介于网络层与链路层之间:通过IP地址查询对应的MAC硬件地址 。

同一局域网广播ARP请求,目标主机单播回复自己MAC;本机保存ARP缓存表,一段时间过期失效。

MAC地址:48位网卡硬件地址,负责"每一跳"相邻设备转发;IP地址负责端到端全程目标地址。

MTU与分片

MTU:链路层帧最大承载数据大小。以太网MTU=1500字节。

IP数据包大于MTU,路由器会进行IP分片;任意分片丢失,整个数据包重组失败全部丢弃。

TCP在握手协商MSS,尽量避免IP分片。

六、Socket套接字:Java网络编程实战

Socket是操作系统给应用层提供的网络编程接口,我们写的Java网络程序就是操作Socket。

Socket分三类:

  1. 流套接字Socket(TCP) :ServerSocket、Socket类
  2. 数据报套接字Socket(UDP) :DatagramSocket、DatagramPacket
  3. 原始套接字:自定义协议,一般业务开发不用。

UDP编程要点

  • DatagramSocket(int port):服务端,绑定指定端口;
  • DatagramSocket():客户端,系统随机分配端口。
  • receive(DatagramPacket)阻塞等待接收数据;send()发送数据报。
  • DatagramPacket封装要发送/接收的字节数组、对方IP端口。

简单回显服务器核心逻辑:

  1. 创建DatagramSocket绑定端口;
  2. while循环:receive拿到请求报文;
  3. 业务处理;
  4. send返回响应报文。

TCP编程要点

  • 服务端:ServerSocket(port)绑定端口;accept()阻塞等待客户端连接,返回和客户端通信的Socket对象。
  • 客户端:Socket(ip,port)直接发起TCP连接。
  • Socket内部提供getInputStream()、getOutputStream()字节流,进行读写。
  • BIO单线程服务器只能处理一个客户端;要支持多客户端,需要引入多线程/线程池。

TCP长短连接

  • 短连接:一次请求响应完成就关闭连接,网页浏览;
  • 长连接:连接不断开,多次收发数据,聊天室、游戏。

常见坑:端口占用异常

报错BindException: Address already in use代表端口已经被别的进程绑定。

排查:netstat -ano | findstr 端口号拿到进程PID,任务管理器根据PID结束进程,或者修改程序绑定其他端口。

七、浏览器输入URL按下回车,发生了什么?

  1. DNS解析:DNS协议(UDP)把域名解析成目标服务器IP;
  2. 客户端TCP三次握手,和服务器80/443端口建立连接;
  3. 构造HTTP请求,通过Socket发送给服务器;
  4. 请求数据层层封装,经过路由器多次路由转发到达服务端;
  5. 服务器从链路层向上分用,到达应用层,处理业务,构造HTTP响应;
  6. 响应数据包原路返回客户端;
  7. 客户端解析HTTP响应,渲染页面;
  8. 完成通信,TCP四次挥手断开连接。

八、知识点总结

  1. 网络的目的是进程间数据传输;IP定位主机,端口定位进程,五元组标识一次通信。
  2. TCP/IP五层模型:应用层、传输层、网络层、链路层、物理层,理解每层职责、设备、协议、封装分用。
  3. UDP无连接不可靠面向数据报;TCP有连接可靠面向字节流,掌握确认应答、超时重传、滑动窗口、流量/拥塞控制,三次握手四次挥手,TIME_WAIT、CLOSE_WAIT。
  4. Socket是操作系统提供的网络API,Java中UDP使用DatagramSocket,TCP使用ServerSocket+Socket;BIO服务器多线程处理多客户端。
  5. IP、网段划分、私有IP、NAT、ARP、MTU分片是网络层核心考点。

学习建议:先吃透理论,再动手跑一遍UDP回显、TCP回显代码,再结合Wireshark抓包,看真实数据包,理论结合实践。


相关推荐
爱吃香菜的初学者2 小时前
十九.Linux——TCP协议(1)
linux·网络·tcp/ip
好啊好啊郝!3 小时前
计算机网络最基础知识点
服务器·网络·计算机网络
辰辰观影3 小时前
外挂字幕怎么导入播放器?2026实用教程
网络
海量计划3 小时前
OSPF路由详细讲解
网络
2401_868534784 小时前
论新技术在网络规划中的应用
网络
QH139292318804 小时前
R&S ZNA43 ZNB3044 10MHz~43.5GHz网络分析仪
网络·5g
Brilliantwxx4 小时前
【STM32】 内部 Flash 的 HAL 库函数详解与自定义封装实战
linux·服务器·网络
西索斯coding5 小时前
qwen3.8-max-0902 和 minimax-m3 改真实仓库差多少?2026 年 50 个缺陷复现实测框架
java·服务器·网络·ai
外收内放5 小时前
ENSP学习记录(2)
网络·智能路由器