传输层协议TCP/UDP

TCP和UDP对比

TCP(Transmission Control Protocol,传输控制协议)

UDP(User Datagram Protocol,用户数据报协议)

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

TCP/UDP报文格式

TCP报文格式(了解)

了解即可,重点是源目端口号

image-20231002163536726

UDP报文格式(了解)

了解即可,重点是源目端口号

与TCP相比,UDP报文做了很大精简,省略诸多控制字段

image-20231002163551553

端口号

  • 源端口随机分配,目标端口使用知名端口
  • 应用客户端使用的源端口一般为系统中未使用的且大于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连接完全建立。

image-20231002164132790

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确认。

image-20231002164731399

TCP滑动窗口机制

接收方存在一个缓冲区即窗口,窗口大小决定了在收到确认前可以发送的数据量

缓冲的窗口保证了接收方不会因为处理不过来而导致直接丢弃数据

image-20231002165010516

站内搜索

没有找到内容!