感谢老师课程!
课程链接:《计算机网络》4 小时期末速成课!期末速成丨考前突击丨期末不挂科丨考点总结
主讲人:paper 老师(B 站 UP:数学建模老哥)
什么是传输层?
传输层(英语:Transport Layer)在计算机网络中是互联网协议包与开放系统互连(OSI)网络堆栈中协议的分层结构中的方法的一个概念划分。该层的协议为应用进程提供端到端的通信服务。它提供面向连接的数据流支持、可靠性、流量控制、多路复用等服务。
传输层的功能:
传输层提供进程和进程之间的逻辑通信,靠套接字Socket=(主机IP地址,端口号)找到应用进程。
传输层对收到的报文进行差错检测。
传输层的两种协议:
面向连接的传输控制协议TCP:
传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认、流量控制、计时器及连接管理等。
可靠,面向连接,时延大。
无连接的数据报协议UDP:
传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。
不可靠,无连接,时延小。
TCP协议
TCP是面向连接(虚连接)的传输层协议。
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重
TCP提供全双工通信:
发送缓存:准备发送的数据、已发送但尚未收到确认的数据
接收缓存:按序到达但尚未被接受应用程序读取的数据、不按序到达的数据
TCP段格式
字段名称 | 大小 | 作用 |
---|---|---|
源端口(Source Port) | 16位 | 指定发送端应用进程的端口号 |
目标端口(Destination Port) | 16位 | 指定接收端应用进程的端口号 |
序列号(Sequence Number) | 32位 | 用于标识数据流中的字节顺序,第一个数据字节的序列号 |
确认号(Acknowledgment Number) | 32位 | 如果ACK标志位被设置,表示接收端期望收到的下一个字节的序列号 |
数据偏移(Data Offset) | 4位 | 表示TCP头部的长度,以32位字(4B)为单位,指示数据开始的位置 |
保留(Reserved) | 3位 | 保留字段,暂时未使用,设置为0 |
标志位 | 9位 | URG:紧急指针有效。 ACK:确认号有效。 PSH:接收方应尽快将数据推送给应用层。 RST:重置连接。 SYN:同步序列号,用于连接建立。 FIN:发送方完成发送任务,准备关闭连接。 |
窗口大小(Window Size) | 16位 | 用于流量控制,表示接收方能接收的最大字节数 |
校验和(Checksum) | 16位 | 用于检验TCP头部和数据部分的传输错误 |
紧急指针(Urgent Pointer) | 16位 | 如果URG标志位设置,指示紧急数据的偏移量 |
选项(Options) | 可变 | 提供额外的控制信息,如最大段大小(MSS)、时间戳等 |
填充(Padding) | 可变 | 为了使TCP头部长度为32位的倍数,可能需要填充一些无效位 |
数据 | 可变 | TCP段的有效载荷,包含传输的数据 |
TCP连接的三个阶段
TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。
三次握手
ROUND 1:
客户端发送连接请求报文段,无应用层数据。
SYN=1,seq=x(随机)
ROUND 2:
服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。
SYN=1,ACK=1,seq=y(随机),ack=x+1
ROUND 3:
客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。
SYN=0,ACK=1,seq=x+1,ack=y+1
ACK(Acknowledgment Flag)和ack(Acknowledgment Number)对别
属性 | ACK | ack |
---|---|---|
类型 | TCP 报文头的标志位 | TCP 报文头的字段(数值) |
含义 | 确认该报文是否为确认报文 | 确认收到的序列号 |
取值 | 0 或 1 | 一个具体的数字 |
作用 | 指示报文是否包含确认功能 | 指明期望接收的下一个序列号 |
SYN(Synchronize)
表示同步序列号,是连接建立时用来发起请求的标志位。
如果 SYN=1,说明这是一个同步请求,用于初始化序列号并建立连接。
seq(Sequence Number)
表示发送方的初始序列号,用于标识数据的顺序。
每一方在通信中都会用自己的序列号 seq,并在握手时交换。
在第一次握手时,seq=x 表示客户端的初始序列号。
ACK(Acknowledgment)
表示确认应答标志位。
如果 ACK=1,表示该报文是对之前报文的确认。
ack(Acknowledgment Number)
表示确认号,用于告诉对方:“我期望接收的下一个数据包的序列号是什么”。
例如,ack=x+1 表示已经成功接收了序列号为 x 的报文,下一个期望收到的是 x+1。
步骤 | 发起方 | SYN | ACK | seq | ack |
---|---|---|---|---|---|
第一次握手 | 客户端 A | 1 | 0 | x | – |
第二次握手 | 服务器 B | 1 | 1 | y | x+1 |
第三次握手 | 客户端 A | 0 | 1 | x+1 | y+1 |
四次挥手
ROUND 1:
客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN=1,seq=u
ROUND 2:
服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了——半关闭状态。
ACK=1,seq=v,ack=u+1
ROUND 3:
服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。
FIN=1,ACK=1,seq=w,ack=u+1
ROUND 4:
客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。 ACK=1,seq=u+1,ack=w+1
FIN(Finish)
断开连接的标志位,表示发送方不再有数据需要传输了,要求释放连接。
ACK(Acknowledgment)
确认标志位,用来确认对方的 FIN 请求。
seq(Sequence Number)
发送方的序列号,用于标识该报文在数据流中的位置。
ack(Acknowledgment Number)
确认号,用于确认接收到的对方序列号。
步骤 | 发起方 | FIN | ACK | seq | ack |
---|---|---|---|---|---|
第一次挥手 | 客户端 A | 1 | 0 | u | – |
第二次挥手 | 服务器 B | 0 | 1 | v | u+1 |
第三次挥手 | 服务器 B | 1 | 0 | v | – |
第四次挥手 | 客户端 A | 0 | 1 | u+1 | v+1 |
可靠传输
流量控制
流量控制:让发送方慢点,要让接收方来得及接收。
TCP利用滑动窗口机制实现流量控制。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗
口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方) ,发送方的发送窗口取接
收窗口rwnd和拥塞窗口cwnd的最小值(拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的
窗口值,反映网络当前容量)。
出现拥塞的条件:
对资源需求的总和 -> 可用资源网络中有许多资源同时呈现供应不足
拥塞控制:
网络性能变坏 -> 网络吞吐量将随输入负荷增大而下降
防止过多的数据注入到网络中
拥塞控制四种方法:
1.慢开始 2.拥塞避免 3.快重传 4.快恢复
慢启动 (Slow Start):
在 TCP 连接开始时,发送方会逐步增加其发送窗口大小,尝试找到网络的可用容量。
初始的拥塞窗口(Congestion Window, CWND)从一个较小的值开始,通常是1个最大报文段(MSS)。
每次收到确认(ACK),CWND会指数级增长(即每个RTT加倍),直到达到慢启动阈值(ssthresh)或者发生丢包。
拥塞避免 (Congestion Avoidance):
当 CWND 达到慢启动阈值后,TCP 会进入拥塞避免阶段。
在这个阶段,CWND 的增长从指数变为线性,每经过一个RTT,CWND 增加一个 MSS。
目的是更稳健地寻找网络的最大吞吐量,避免出现拥塞。
快重传 (Fast Retransmit):
当接收方收到一个丢失的数据包后,会快速发送多个重复的 ACK 给发送方。
如果发送方在收到三个重复的 ACK 时,尚未收到对丢失报文的确认,它会立即重传丢失的数据包,而无需等待超时。
快恢复 (Fast Recovery):
与快重传结合使用。
当发送方检测到丢包并重传丢失的数据包后,它不会像传统的慢启动那样将 CWND 直接降到初始值。
相反,它将 CWND 减半(通常设置为 ssthresh),然后进入拥塞避免阶段。
UDP协议
UDP首部
UDP首部总共占用8个字节,包含以下四个字段:
源端口号(Source Port) – 16位
目的端口号(Destination Port) – 16位
长度(Length) – 16位
校验和(Checksum) – 16位
例题:下面是以十六进制格式存储的一个UDP首部:CB84000D001C001C试问:源端口号是 [填空1](请用16进制表示),目的端口号是 [填空2](请用10进制表示),数据长度是 [填空3] 字节。
源端口号是 CB84
目的端口号是 13
数据长度是 20 字节(数据长度是UDP数据报长度-首部长度8字节)