目录
[UDP 实现可靠传输](#UDP 实现可靠传输)
[1. 三次握手与四次挥手](#1. 三次握手与四次挥手)
[2. 可靠传输机制](#2. 可靠传输机制)
[3. 面向字节流](#3. 面向字节流)
在了解了网络信息传递的方式以及数据传输的过程之后,
这里将着重讲解 TCP/IP 协议。
网络通信**(见前篇章)中已经知道了代码都在应⽤层** 上实现
传输层 保证了数据能够从发送端传输接收端 在传输中五元组 是必不可少的
端口号(Port)
在 TCP/IP 协议中,端口号是用于标识应用程序或服务的逻辑编号,它位于传输层,与 IP 地址共同构成网络通信中的关键定位信息。
当数据从发送端传输到接收端时,IP 地址 负责 定位 到目标主机,而 端口号 则进一步定位到主机上具体的应用程序或服务。
端⼝号范围划分
• 0-1023: 知名端⼝号 , HTTP,FTP,SSH 等这些⼴为使⽤的应⽤层协议,他们的端⼝号都是固定的.
• 1024-65535:操作系统动态分配的端⼝号.客⼾端程序的端⼝号,就是由操作系统从这个范围分配 的.
有些服务器是⾮常常⽤的,为了使⽤⽅便,⼈们约定⼀些常⽤的服务器,都是⽤以下这些固定的端⼝号:
• ssh服务器, 使⽤22端⼝
• ftp服务器, 使⽤21端⼝
• telnet服务器, 使⽤23端⼝
• http服务器, 使⽤80端⼝
• https服务器, 使⽤443端⼝
UDP协议
UDP协议端格式

• 16位UDP⻓度,表⽰整个数据报(UDP⾸部+UDP数据)的最⼤⻓度;
• 如果校验和出错,就会直接丢弃;

上图展示了 UDP 数据报的完整格式。UDP 首部固定为 8 字节 ,由源端口号(16 位)、目标端口号(16 位)、UDP 长度(16 位 由报头 + 载荷)和 校验和(16 位)四个字段组成。
其中,源端口号标识发送方的应用程序,目标端口号标识接收方的应用程序;UDP 长度表示整个数据报(UDP 首部 + UDP 数据 )的最大长度;校验和用于检测数据在传输过程中是否发生错误,如果校验和出错,数据报会被直接丢弃。
校验和 是 UDP 首部中的 16 位字段,用于检测数据报在传输过程中是否出错。发送方对 UDP 首部和数据部分计算校验和并填入该字段;接收方按相同算法重新计算并比对,若不一致则说明数据可能被篡改或损坏,接收方会直接丢弃该数据报。
特点
UDP的特点不在过多赘述**(见前篇章)**
⽆连接: 知道对端的IP和端⼝号就直接进⾏传输,不需要建⽴连接;
不可靠: 没有确认机制,没有重传机制;如果因为⽹络故障该段⽆法发到对⽅,UDP协议层也不会给应 ⽤层返回任何错误信息;
⾯向数据报: 不能够灵活的控制读写数据的次数和数量;应⽤层交给UDP多⻓的报⽂,UDP原样发送,既不会拆分,也不会合并
UDP协议⾸部中有⼀个16位的最⼤⻓度.也就是说⼀个UDP能传输的数据最⼤⻓度是 64K(包含UDP⾸部).
所以需要传输的数据超过64K,也就需要在应⽤层⼿动的分包,多次发送,并在接收端⼿动拼装
UDP 实现可靠传输
用 UDP 实现可靠传输 :UDP 本身不可靠,但可在应用层模拟 TCP 的可靠机制,常见做法包括:确认应答 ,接收方返回 ACK,发送方未收到则视为丢失;超时重传 ,超时未收到确认就重发;序号 ,接收方按序号排序并去重;滑动窗口,控制发送速率。例如 QUIC 协议就是在 UDP 之上实现了可靠传输。
TCP协议
TCP协议端格式
TCP 报文段由首部 和数据 两部分组成,其中首部固定为 20 字节,是 TCP 实现可靠传输的关键。首部主要字段如下:
- 源端口号 / 目标端口号(各 16 位):标识发送方和接收方的应用程序,与 IP 地址共同完成端到端的定位。
- 序号(32 位):标识本报文段数据部分第一个字节的编号,用于解决乱序和重复问题。
- 确认号(32 位):表示期望收到对方下一个字节的序号,用于确认应答机制。
- 数据偏移(4 位):表示 TCP 首部的长度,单位为 4 字节,用于定位数据部分的起始位置。
- 标志位:包括 SYN(建立连接)、ACK(确认应答)、FIN(释放连接)等,用于控制连接的建立、传输和释放。
- 窗口大小(16 位):用于流量控制,告知对方自己当前能接收的最大字节数。
- 校验和(16 位):用于检测首部和数据在传输过程中是否出错,出错则直接丢弃。
TCP(Transmission Control Protocol,传输控制协议)是 TCP/IP 协议族中位于传输层的核心协议,与 UDP 相比,它提供面向连接、可靠、基于字节流的传输服务。TCP 的核心机制围绕如何保证数据在不可靠的网络环境中可靠、有序地到达接收方展开,主要包括以下几个方面:
1. 三次握手与四次挥手
TCP 是面向连接的协议,通信双方在传输数据前必须先建立连接,通信结束后再释放连接。
- 三次握手(建立连接):客户端发送 SYN 报文请求建立连接;服务器收到后回复 SYN + ACK 报文,表示同意建立连接;客户端再发送 ACK 报文确认。经过这三次交互,双方确认彼此的收发能力正常,连接建立成功。
- 四次挥手(释放连接):主动关闭方发送 FIN 报文;对方回复 ACK 确认;对方再发送 FIN 报文;主动关闭方回复 ACK 确认。经过四次交互,连接被安全释放。
2. 可靠传输机制
滑动窗口 是 TCP 实现流量控制 的核心机制。发送方根据接收方通告的窗口大小 ,决定一次能连续发送多少数据,避免发送过快导致接收方处理不过来。窗口大小随接收方缓冲区剩余空间动态变化,并通过 ACK 反馈给发送方;在窗口范围内可批量发送多个报文段,无需逐个等待确认,从而提升传输效率。
流量控制 的作用在于让发送方的发送速率与接收方的处理能力相匹配,防止因发送过快导致数据丢失或接收方缓冲区溢出,是 TCP 可靠传输的重要保障之一。
拥塞控制 则关注网络整体的承载能力,当网络出现拥塞时主动降低发送速率,避免加剧网络拥堵。二者共同服务于可靠传输:流量控制解决的是接收方处理不过来 的问题,拥塞控制解决的是网络承载不了 的问题,配合确认应答与超时重传,共同保证数据不丢失、不重复、按序到达。
延迟应答是 TCP 提升传输效率的机制之一。接收方收到数据后不立即返回 ACK,而是等待一小段时间,若在此期间收到更多数据,则合并为一个 ACK 统一回复,从而减少网络中 ACK 报文的数量,降低网络开销,同时也能让发送方更快地进入下一个窗口的发送。
捎带应答是 TCP 提升传输效率的另一机制。当接收方需要回复 ACK 时,如果恰好也有数据要发送给对方,就可以把 ACK 附带在这份数据报中一起发送,而不必单独发送一个空的 ACK 报文,从而减少报文数量、节省网络开销。捎带应答与延迟应答常配合使用,共同减少 ACK 报文的传输次数。
TCP 通过多种机制协同工作,保证数据不丢失、不重复、按序到达:
- 确认应答(ACK):接收方收到数据后,会向发送方返回确认报文,告知数据已成功接收。
- 超时重传:发送方发送数据后启动定时器,若在超时时间内未收到确认,则重新发送该数据。
- 序号与确认号:每个字节都有序号,接收方按序号重组数据,从而解决乱序和重复问题。
- 流量控制:通过滑动窗口机制,接收方告知发送方自己的接收能力,避免发送过快导致接收方处理不过来。
- 拥塞控制 :当网络出现拥塞时,TCP 会主动降低发送速率,避免加剧网络拥堵,常用算法包括慢启动(先发少量的数据,摸清⽹络状态,再决定多少的速度传输数据)、拥塞避免、快重传和快恢复。
- 延迟应答 :接收方收到数据后不立即返回 ACK,而是等待一小段时间,若在此期间收到更多数据 ,则合并为一个 ACK 统一回复,从而减少网络中 ACK 报文的数量,降低网络开销,提升传输效率。
- 捎带应答:当接收方需要回复 ACK 时,如果恰好也有数据要发送给对方,就把 ACK 附带在这份数据报中一起发送,而不必单独发送空的 ACK 报文,从而减少报文数量、节省网络开销。
TCP传输机制 最关键的两个机制为 确认应答 与超时重传 ,保证了TCP 可靠传输机制
3. 面向字节流
与 UDP 的面向数据报不同,TCP 是面向字节流 的协议。应用层交给 TCP 的数据会被看作一串连续的字节流,TCP 会根据网络状况和接收方能力,自行决定如何拆分或合并这些字节进行发送,接收方再按序号将字节流还原给应用层。因此,TCP 不保留应用层报文的边界,读写数据的次数和数量由 TCP 灵活控制。
粘包问题 :由于 TCP 是面向字节流的协议,不保留应用层报文的边界,当发送方连续发送多个数据包 时,接收方可能一次性收到多个包的数据,导致无法区分 每个包的边界,这就是粘包问题。
常见的解决思路包括:在数据中约定固定长度、在包尾添加分隔符,或在包头携带长度字段。
例如,发送方约定每个数据包固定为 100 字节**(三种解决方式)**
接收方每收到 100 字节就按一个完整包处理,从而区分出每个包的边界;
或者在每个包的末尾添加特殊分隔符(如 \n),接收方遇到该分隔符即认为一个包结束;
也可以在包头写入本次数据的长度字段,接收方先读取长度,再按该长度截取对应的数据部分。
异常情况
TCP 异常情况:在实际通信中,TCP 还会遇到一些异常场景。例如,
连接异常断开时,一方可能因断电、崩溃等原因未发送 FIN 报文,另一方会通过超时重传和保活机制(Keepalive)检测到连接失效
半关闭则指一方发送 FIN 后不再发送数据,但仍可接收对方数据,常见于一方数据发送完毕、另一方仍需继续传输的场景
端口未监听时,对方会收到 RST 报文,连接被立即重置,从而避免长时间等待。
IP协议
IP 协议 (Internet Protocol,网际协议)是 TCP/IP 协议族中位于网络层 的核心协议,负责将数据包从源主机路由到目标主机。
它主要解决两个问题:一是寻址,通过 IP 地址唯一标识网络中的每一台主机;
二是路由选择,决定数据包在复杂的网络拓扑中应沿哪条路径传输。
IP 协议提供的是无连接、不可靠的传输服务:每个数据报独立发送,不建立连接;若传输过程中发生丢包或出错,IP 层不会自动重传,可靠性由上层协议(如 TCP)来保证。
常见的 IP 协议包括 IPv4 和 IPv6 ,其中 IPv4 使用 32 位地址,IPv6 使用 128 位地址,以解决地址枯竭问题。
协议头格式
NAT 下的网络通信:在 NAT 环境下,内网设备使用私有 IP 地址,对外通信时由 NAT 设备(通常是路由器)将私有 IP 映射为公网 IP。当内网设备向公网发送数据时,NAT 设备会记录该映射关系;当公网返回数据时,NAT 设备根据映射表将数据转发回对应的内网设备,从而实现多台内网设备共享一个公网 IP 与外网通信。
IP 地址不够用的解决方法:IPv4 使用 32 位地址,理论上最多可提供约 43 亿个地址,但实际可用数量远小于此,随着互联网设备激增,地址枯竭问题日益突出。目前主要有以下几种解决思路:
- NAT(网络地址转换) :让一个公网 IP 供局域网内多台设备共享,设备内部使用私有 IP,对外统一映射为公网 IP,是当前最广泛使用的方案。
- CIDR(无类别域间路由):打破传统 A、B、C 类地址的固定分类,按需灵活划分地址块,减少地址浪费,提高利用率。
- DHCP(动态主机配置协议):动态分配 IP 地址,设备接入网络时才临时获取地址,离开后释放复用,避免长期占用。
- IPv6:使用 128 位地址,地址空间极其充足,是解决地址枯竭问题的根本方案。
其中,NAT 通过私有地址与公网地址的映射 ,让大量内网设备共享少量公网 IP,是目前缓解 IPv4 地址紧张最直接、最常用的手段;而 IPv6 则从地址空间上彻底解决了枯竭问题,是未来网络发展的方向。
IP 协议头 (IPv4 首部)固定为 20 字节,是 IP 数据报中用于控制传输的关键部分。首部主要字段如下:
- 版本(4 位):标识 IP 协议版本,IPv4 该字段值为 4。
- 首部长度(4 位):表示 IP 首部的长度,单位为 4 字节,最小为 5(即 20 字节)。
- 服务类型 (8 位):用于区分服务的优先级,实际使用较少。
- 总长度(16 位):表示整个 IP 数据报(首部 + 数据)的总长度,最大为 65535 字节。
- 标识、标志、片偏移:用于数据报的分片与重组,当数据报超过链路 MTU 时会被拆分传输。
- 生存时间(TTL) (8 位):限制数据报在网络中的跳数,防止数据报无限循环转发。
- 协议(8 位):标识上层协议类型,如 TCP(值为 6)、UDP(值为 17)。
- 首部校验和(16 位):用于检测 IP 首部在传输过程中是否出错。
- 源 IP 地址 / 目标 IP 地址(各 32 位):标识数据报的发送方和接收方主机。
其中,TTL 每经过一个路由器就减 1,减到 0 时数据报被丢弃,从而避免数据报在网络中无限循环;协议字段则让接收方知道该把数据交给上层的哪个协议处理。

网段划分
特殊的 IP 地址:在 IP 地址中,有一些地址具有特殊含义,不能作为普通主机地址使用。常见的特殊 IP 地址包括:
- 网络号 :主机号全为 0 的地址,用于标识整个网段,例如 192.168.1.0 表示 192.168.1 这个网段本身,不能分配给主机。
- 广播地址 :主机号全为 1 的地址,用于向同一网段内的所有主机发送数据,例如 192.168.1.255 就是该网段的广播地址。
- 回环地址 :127.0.0.1 用于本机自测,数据不会发送到网络上,常用于验证本机协议栈是否正常。
- 私有地址 :如 10.0.0.0/8 、172.16.0.0/12 、192.168.0.0/16,仅用于内网,不能直接在公网路由。
网段划分 :网段是指 IP 地址中网络号相同的地址集合,用于标识同一局域网内的主机。IPv4 地址由网络号和主机号两部分组成,网络号相同的设备属于同一网段,可直接通信;不同网段之间则需要通过路由器转发。
例如,IP 地址 192.168.1.10 与 192.168.1.20 ,若子网掩码为 255.255.255.0 ,则网络号均为 192.168.1 ,它们属于同一网段,可以直接通信;而 192.168.2.10 的网络号为 192.168.2,与前两者不在同一网段,需要经过路由器才能互通。
路由选择
路由选择 :路由选择是 IP 协议的核心功能之一,指数据包从源主机出发,在复杂的网络拓扑中确定一条到达目标主机的转发路径。路由器根据自身的路由表 逐跳转发数据包,每经过一个路由器就根据目标 IP 地址查找下一跳地址,直到 数据包到达目标主机所在的网段。
路由选择主要分为两类:静态路由由管理员手动配置,路径固定、简单可靠,但无法适应网络拓扑变化;
动态路由由路由协议(如 RIP、OSPF、BGP)自动计算和更新路由表,能根据网络状态动态调整路径,更适合规模较大、拓扑复杂的网络。
以太网
以太网格式

帧协议类型字段有三种值,分别对应 IP、ARP**(用于根据目标 IP 地址查询对应的 MAC 地址,从而在同一网段内完成数据帧的封装与传输)**、RARP
帧末尾是 CRC 校验码
以太网 (Ethernet)是当前最广泛使用的局域网技术,工作在数据链路层 ,负责在同一网段内的设备之间传输数据帧。它通过MAC 地址唯一标识网络中的每一块网卡,当一台设备要发送数据时,会在帧头写入目标设备的 MAC 地址,同一网段内的设备都能收到该帧,但只有 MAC 地址匹配的设备才会接收并处理。
以太网采用CSMA/CD(载波监听多路访问/冲突检测)机制来协调共享介质的访问:发送前先监听信道是否空闲,空闲则发送,发送过程中若检测到冲突则停止并随机等待一段时间后重试。现代以太网大多使用交换机组网,交换机根据 MAC 地址表将数据帧只转发到目标端口,从而避免冲突、提升传输效率。
IP 地址与 MAC 地址的区别:
IP 地址是逻辑地址 ,由网络管理员或 DHCP 分配,用于在网络层标识主机,会随网络环境变化;MAC 地址是物理地址 ,由网卡出厂时固化,用于在数据链路层标识设备,全球唯一且不可更改。
IP 地址负责跨网络寻址 ,MAC 地址负责同一网段内的帧传输,二者配合完成端到端的通信。
DNS
DNS (Domain Name System,域名系统)是负责将域名 解析为IP 地址 的分布式系统,DNS是应⽤层协议 。由于 IP 地址难以记忆,用户通常通过域名(如 www.example.com)访问网站,DNS 的作用就是把域名转换为对应的 IP 地址,从而建立连接。
DNS 采用分层结构组织:根域名服务器、顶级域名服务器和权威域名服务器逐级查询。
当本地 DNS 缓存中没有记录时,会依次向上级服务器发起查询,最终返回目标 IP 地址,并将结果缓存以加快后续访问(避免了每次访问都要经过DNS 触发DNS请求)。
此外 DNS服务器存在很多 除了存入最初的原始数据的 "DNS根服务器 " 还存在着各大运营商的'DNS镜像服务器'所以不必担心海量数据导致DNS '挂掉' 的可能性
(已经燃成灰烬了)
