一、计算机网络是怎么来的?## 目录
- 一、计算机网络是怎么来的?
- 二、网络通信基础概念
- [1. IP地址](#1. IP地址)
- [2. 端口号](#2. 端口号)
- [3. 五元组 ------ 唯一标识一次通信](#3. 五元组 —— 唯一标识一次通信)
- [4. 什么是网络协议?](#4. 什么是网络协议?)
- 三、TCP/IP五层模型
- 四、传输层:TCP与UDP核心对比
- [UDP 用户数据报协议](#UDP 用户数据报协议)
- [TCP 传输控制协议(可靠传输)](#TCP 传输控制协议(可靠传输))
- 五、网络层IP协议
- 六、Socket套接字:Java网络编程实战
- 七、浏览器输入URL按下回车,发生了什么?
- 八、知识点总结
最早计算机是独立模式,各个电脑完全独立,数据分散保存在各个终端。想要操作不同业务,人要跑到不同机器前面,效率极低。
随着业务发展,需要多台计算机协同、共享数据,于是出现网络互连:把多台计算机连接在一起,实现数据共享,也就是网络通信。
根据网络覆盖规模,分为两大类:
- 局域网LAN :局部私有网络,家庭、公司内网都属于局域网。组建方式可以网线直连、集线器Hub、交换机Switch、交换机+路由器。局域网内部主机可以自由通信,不同局域网不经过路由器是不能互通的。
- Hub集线器:工作在物理层,简单信号复制转发。
- Switch交换机:工作在数据链路层,基于MAC地址转发帧。
- 广域网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个要素确定,就像完整快递单据:
- 源IP:发送方主机地址
- 源端口:发送方进程端口
- 目的IP:接收方主机地址
- 目的端口:接收方进程端口
- 协议号:使用什么传输协议(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集线器:只实现物理层
封装与分用(打包和解包)
-
封装(发送数据):数据从应用层往下走,每一层给自己上层的数据加上本层头部(Header),向下交付给下一层。
- 应用层数据 → 传输层加上TCP/UDP头部 → 段(segment)
- 交给网络层加上IP头部 → IP数据报(datagram)
- 交给链路层加上以太网头部尾部 → 帧(frame)
- 物理层转为0/1比特流在网线传输。
-
分用(接收数据):数据到达目标主机,从物理层向上,每一层剥掉自己的头部,根据头部里的协议字段,把有效载荷交付给上层对应的协议。
类比寄快递:封装=层层打包贴不同面单;分用=一层层拆快递,交给对应负责人。
四、传输层:TCP与UDP核心对比
传输层有两大核心协议TCP、UDP,面试最高频考点。
UDP 用户数据报协议
特点:
无连接 :不需要提前握手,知道IP+端口直接发包。
面向数据报 :应用层给多少数据就发多少,不会拆分合并;发送一次send,接收必须一次receive读完。
不可靠传输 :没有确认应答、丢包不会重传;丢包就丢了,上层感知不到。
单个UDP报文最大64K,超过需要应用层手动分包拼装。
适用场景:直播、视频通话、游戏,允许少量丢包,追求低延迟。
TCP 传输控制协议(可靠传输)
TCP为了做到可靠传输,设计了一整套复杂机制:
- 确认应答ACK:每个字节编号(序列号),接收方回复确认号,告诉发送方"我收到哪里了,下一次从哪里发"。
- 超时重传:发送出去一段时间没有收到ACK,自动重传报文;利用序列号实现重复报文去重。
- 连接管理:三次握手建立连接,四次挥手断开连接
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 通常分开发送(延迟确认时也可能合并成三次)。
- 滑动窗口:不用等一个ACK才发下一段,批量发送,提升吞吐量。
- 流量控制:接收端告诉发送方自己缓冲区剩余大小,防止发送太快把接收缓冲区打满。
- 拥塞控制:慢启动、拥塞避免,探测网络负载,不要把网络堵死。
- 延迟应答、捎带应答:尽可能扩大窗口,提升传输效率。
TCP面向字节流:数据存在内核缓冲区,读写次数没有严格对应关系,由此引出粘包问题 。
粘包解决思路:应用层界定数据包边界:①定长包;②包头携带数据包长度;③特殊分隔符分割报文。
UDP不存在粘包,UDP保留报文边界。
适用场景:网页浏览、文件下载、数据库访问,要求数据100%准确到达。
思考面试题:UDP本身不可靠,能否在UDP之上实现可靠传输?
答:可以,在应用层仿照TCP逻辑,自己实现序列号、ACK确认、超时重传。
五、网络层IP协议
IP地址分为网络号+主机号。
- 网络号 :区分不同子网;主机号:区分同一子网内部不同主机。
- CIDR表示法:如
192.168.1.10/24,/24代表前24bit是网络号。
特殊IP
- 主机位全0:网络号,代表整个网段;
- 主机位全1:广播地址,向子网全部主机发消息;
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分三类:
- 流套接字Socket(TCP) :
ServerSocket、Socket类 - 数据报套接字Socket(UDP) :
DatagramSocket、DatagramPacket - 原始套接字:自定义协议,一般业务开发不用。
UDP编程要点
DatagramSocket(int port):服务端,绑定指定端口;DatagramSocket():客户端,系统随机分配端口。receive(DatagramPacket)阻塞等待接收数据;send()发送数据报。DatagramPacket封装要发送/接收的字节数组、对方IP端口。
简单回显服务器核心逻辑:
- 创建DatagramSocket绑定端口;
- while循环:receive拿到请求报文;
- 业务处理;
- 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按下回车,发生了什么?
- DNS解析:DNS协议(UDP)把域名解析成目标服务器IP;
- 客户端TCP三次握手,和服务器80/443端口建立连接;
- 构造HTTP请求,通过Socket发送给服务器;
- 请求数据层层封装,经过路由器多次路由转发到达服务端;
- 服务器从链路层向上分用,到达应用层,处理业务,构造HTTP响应;
- 响应数据包原路返回客户端;
- 客户端解析HTTP响应,渲染页面;
- 完成通信,TCP四次挥手断开连接。
八、知识点总结
- 网络的目的是进程间数据传输;IP定位主机,端口定位进程,五元组标识一次通信。
- TCP/IP五层模型:应用层、传输层、网络层、链路层、物理层,理解每层职责、设备、协议、封装分用。
- UDP无连接不可靠面向数据报;TCP有连接可靠面向字节流,掌握确认应答、超时重传、滑动窗口、流量/拥塞控制,三次握手四次挥手,TIME_WAIT、CLOSE_WAIT。
- Socket是操作系统提供的网络API,Java中UDP使用DatagramSocket,TCP使用ServerSocket+Socket;BIO服务器多线程处理多客户端。
- IP、网段划分、私有IP、NAT、ARP、MTU分片是网络层核心考点。
学习建议:先吃透理论,再动手跑一遍UDP回显、TCP回显代码,再结合Wireshark抓包,看真实数据包,理论结合实践。