传输层协议TCP/UDP
TCP和UDP对比
TCP(Transmission Control Protocol,传输控制协议)
UDP(User Datagram Protocol,用户数据报协议)
| 特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
|---|---|---|
| 可靠性 | 高,提供数据确认、重传机制,确保数据完整且无错序到达 | 低,不保证数据的到达、顺序或重复,应用程序需自行处理 |
| 连接性 | 面向连接,通信前需通过三次握手建立连接,通信后四次挥手断开 | 无连接,数据可直接发送,无需预先建立或维护连接 |
| 传输模式 | 面向字节流,将数据看作无边界的数据流,按需分割或合并数据 | 面向报文,保留每个数据报的界限,作为独立单元传输 |
| 传输效率 | 相对较低,因包含流量控制、拥塞控制等机制 | 高,头部开销小,无须确认机制,适用于高效传输 |
| 流量控制 | 有,使用滑动窗口机制防止数据溢出接收方缓冲区 | 无,发送方不会因接收方状态调整发送速率 |
| 拥塞控制 | 有,能根据网络拥塞情况动态调整发送速率 | 无,不会减少数据发送速率以应对网络拥塞 |
| 应用场景 | 适用于对数据完整性要求高的场景,如文件传输、HTTP、HTTPS、FTP、SMTP等 | 适用于实时性要求高、能容忍一定丢包的场景,如在线视频、音频、游戏、DNS查询、IP语音(VoIP)等 |
| 通信模型 | 全双工,双方可同时发送和接收数据 | 支持全双工,但每一条数据报都是单独处理的 |
TCP/UDP报文格式
TCP报文格式(了解)
了解即可,重点是源目端口号

UDP报文格式(了解)
了解即可,重点是源目端口号
与TCP相比,UDP报文做了很大精简,省略诸多控制字段

端口号
- 源端口随机分配,目标端口使用知名端口
- 应用客户端使用的源端口一般为系统中未使用的且大于1024
- 目的端口号为服务器端应用服务器的进程,如telnet为23
下面我们给出 TCP/IP 体系的应用层常用协议所使用的运输层熟知端口号
以下是一些TCP/IP体系中应用层常用协议及其对应传输层熟知端口号的表格概览:
| 应用层协议 | 传输层协议 | 端口号 | 功能描述 |
|---|---|---|---|
| HTTP | TCP | 80 | 超文本传输协议,用于网页浏览 |
| HTTPS | TCP | 443 | 安全的超文本传输协议,加密的网页浏览 |
| FTP | TCP | 21 | 文件传输协议,用于文件上传下载 |
| SSH | TCP | 22 | 安全外壳协议,提供安全的远程登录 |
| Telnet | TCP | 23 | 远程登录协议 |
| SMTP | TCP | 25 | 简单邮件传输协议,用于发送电子邮件 |
| POP3 | TCP | 110 | 邮局协议第3版,用于接收电子邮件 |
| IMAP | TCP | 143 | 因特网邮件访问协议,另一种接收邮件的协议 |
| DNS | UDP/TCP | 53 | 域名系统,用于域名解析 |
| DHCP | UDP | 67/68 | 动态主机配置协议,自动分配IP地址及其他网络参数(服务器使用67,客户端使用68) |
| SNMP | UDP | 161 | 简单网络管理协议,用于网络设备管理 |
| TFTP | UDP | 69 | 简单文件传输协议,用于小文件传输 |
请注意,这些端口号是IANA(互联网编号分配管理局)分配的熟知端口,用于标识特定的服务。实际应用中,服务也可以配置使用其他非熟知端口。
TCP的控制机制
TCP序列号及确认号
确认号用来确认收到上一个数据包,以及表示期望收到下一个编号为ack的数据包
PC1的seq和PC2的ack有关,反之亦然
TCP报文的标志位简介
TCP(传输控制协议)报文中的标志位是用来控制TCP连接的建立、数据传输以及连接的终止等过程的。以下是TCP报文头中常见的六个标志位及其含义:
| 全写 | 含义 | 详细 | |
|---|---|---|---|
| SYN | Synchronize | 同步序列编号 | 当SYN=1时,表示这是一个连接请求或连接接受报文。在TCP三次握手过程中,首先由客户端发送一个SYN=1的报文给服务器,请求建立连接。如果服务器同意建立连接,它会响应一个SYN=1且ACK=1的报文,表示确认客户端的序列号并同意连接。 |
| ACK | Acknowledgment | 确认号有效标志 | ACK=1时,确认号字段有效,用来确认接收到的数据。在连接建立后的所有数据传输中,ACK几乎总是被设置为1,以确保数据的可靠传输。 |
| PSH | Push | 强制推送 | 当PSH=1时,它是一个建议性的标志,告诉接收端应该立即将数据推送给应用程序,而不是等待缓冲区填满再交付。但这并不保证立即推送,实际行为取决于接收端的实现。 |
| FIN | Finish | 结束标志 | 当FIN=1时,表明发送方的数据已经发送完毕,希望释放连接。这是TCP四次挥手过程中的第一步,用来结束一个方向上的数据传输。 |
| RST | Reset | 复位标志 | RST=1时,表示TCP连接出现严重错误或者一方不期望的连接请求,需要立即终止连接,不进行正常的连接关闭流程。 |
| URG | Urgent | 紧急标志 | URG=1时,表示报文中包含紧急数据,需要接收端优先处理。通常伴随有紧急指针字段,指出本报文中紧急数据的结束位置。 |
这些标志位的组合使用能够实现TCP的连接管理、流量控制、拥塞控制等功能,确保数据的可靠、有序传输以及连接的高效管理。
TCP三次握手建立连接
| 步骤 | 描述 | 报文详细 | 注释 |
|---|---|---|---|
| 1. 第一次握手 | A请求向B发起连接 | A向B发送seq = ISN_A(A的初始序列号)、标志位为SYN的数据包 | A启动连接过程,表明其发送能力正常 (注:实际序列号ISN为随机生成,非固定值0,以防止重放攻击) |
| 2. 第二次握手 | B收到请求并发送请求确认 | B收到上述报文,向A发送: - seq = ISN_B(B的初始序列号) - ack = ISN_A + 1 - 标志位为SYN和ACK 的数据包 |
B确认收到A的SYN,同时发起自己的连接请求, 表明B的接收与发送功能正常 |
| 3. 第三次握手 | A收到并发送确认 | A收到上述报文,向B发送: - seq = ISN_A + 1 - ack = ISN_B + 1 - 标志位为ACK 的数据包 |
A确认B的SYN,连接建立完成, 表明A的接收功能正常,且确认了B的发送功能 |
注意:
- ISN (Initial Sequence Number): 初始序列号,每次新建连接时由发送方随机生成,用于防止旧的连接数据被误用在新的连接上,增强安全性。
- 在第一次握手时,A设置SYN标志,其序列号seq为A的ISN_A,而不是固定的0,以确保连接的唯一性和安全性。
- 第二次握手中,B不仅确认了A的SYN,还发送了自己的SYN,同时设置ack为ISN_A + 1,表示确认了A的序列号。
- 第三次握手,A回复的ack设置为ISN_B + 1,确认了B的SYN,至此,双方都确认了对方的发送和接收能力,TCP连接完全建立。

TCP四次挥手断开连接
| 步骤 | 描述 | 报文详细 | 注释 |
|---|---|---|---|
| 1. 第一次挥手 | A请求关闭连接 | A向B发送报文: 标志位FIN=1、ACK=1 seq=seq_A(A的当前序列号) ack=ack_B(B的预期确认号) |
A告知B已无数据发送,可以释放A到B的连接方向。 |
| 2. 第二次挥手 | B确认A的关闭请求 | B向A发送报文: 标志位ACK=1 seq=seq_B(B的当前序列号) ack=seq_A + 1 |
B确认收到A的FIN报文,同意关闭从A到B的连接,等待关闭B到A的连接 |
| 3. 第三次挥手 | B请求关闭连接 | B向A发送报文: 标志位FIN=1,ACK=1 seq=seq_B + 1 ack=seq_A + 1 |
B也无数据发送,请求关闭B到A的连接方向。 |
| 4. 第四次挥手 | A确认B的关闭请求,完成连接关闭 | A向B发送报文: 标志位ACK=1 seq=seq_A + 1 ack=seq_B + 2 |
A确认收到B的FIN报文,双方连接完全关闭。 |
注意:
- 在挥手过程中,
seq表示发送方当前的序列号,随着数据或控制报文的发送而递增。 ack表示期望收到的下一个序列号,即确认了对方发送的最后一个字节的序列号加一。- 四次挥手的目的是确保两个方向的连接都被正确且有序地关闭,每个方向的关闭都需要一个FIN和对应的ACK确认。

TCP滑动窗口机制
接收方存在一个缓冲区即窗口,窗口大小决定了在收到确认前可以发送的数据量
缓冲的窗口保证了接收方不会因为处理不过来而导致直接丢弃数据
