Loading...

文章背景图

传输层

2026-02-15
5
-
- 分钟
|

传输层提供的服务

端口号的作用

通过“端口号”标识本主机的一个特定进程(注意:每台主机的端口号是相互独立的;TCP、UDP两种协议的端口号也是相互独立的)

TCP或UDP协议,通过Socket套接字 = {IP地址:端口号},唯一标识网络中的一台主机上的一个应用程序

端口号的分类

服务器使用的端口号:0~1023(通常只能用于被熟知的重要应用程序);1024~49151(登记端口号)

客户端使用的端口号:49152~65535(短暂端口号)

传输层的功能

实现端到端(进程到进程)的通信

复用和分用

复用(从上到下):在发送数据的时候,同一台主机上的多个进程可以将使用同一个传输层协议

分用(从下到上):在接收数据的时候,传输层可以正确交付到目的进程

差错检测

TCP检测出差错后丢弃数据,并通知发送方重传

UDP检测出错误后直接丢弃数据,且不通知发送方

向应用层提供两种服务

面向连接的、可靠的端到端传输服务(TCP)——确保数据正确、完整,但开销大、实时性较差

无连接的、不可靠的端到端传输服务(UDP)——数据可能出错、丢失,但速度快、开销小

UDP

UDP协议

UDP协议的特点

  • UDP首部很小,只占8B

  • UDP每次传输一个完整的报文,不支持报文自动拆分、重装

  • UDP是无连接的、不可靠的(可靠性可以交给应用层处理),也不支持拥塞控制

  • UDP支持一对一(封装成单播IP数据报)、一对多(封装成广播/多播IP数据报)

UDP数据报格式

screenshot-20260210_153156.png

UDP检验

差错检测算法

检验和的计算:将原始数据以16bit为一组,进行二进制加法(最高位产生进位需要回卷),加法运算的最终结果逐位取反,得到16bit“检验和”

差错检验方法:接收方将收到的内容以16bit为一组,进行二进制加法(最高位产生进位需要回卷)

如果加法结果为全1,说明没有差错,否则证明有差错

要点

发送方在计算检验和之前,需要添加伪首部,计算完校验和之后,拆除伪首部

接收方在差错检验之前,需要添加伪首部,检验完之后,拆除伪首部(如果检验出差错,就对其该UDP数据报,如果没有差错,就接受该UDP数据报)

TCP

TCP协议

TCP协议的特点

  • TCP首部更大,占20~60B

  • TCP支持报文自动拆分、重装,因此可以传输长报文

  • TCP是有连接的、可靠的、支持拥塞控制

  • TCP仅支持一对一传输

TCP协议的三大阶段

  • 建立连接(三次握手)

  • 数据传输

  • 释放连接(四次挥手)

TCP段的格式

screenshot-20260211_145841.png
  • URG:为1时,紧急指针有效,表示这是紧急数据,应尽快插队发送

  • ACK:为1时,表示ack字段是否有效;只有握手1的ACK = 0,其他的都ACK = 1

  • PSH:为1时,表示希望接收方尽快回复(用于交互式通信)

  • RST:为1时,表示出现严重差错(如主机崩溃),必须释放连接;也可用于拒绝一个非法报文段(如恶意的黑客攻击)

  • SYN:表示当前的TCP报文段是否是在请求连接或同意请求连接;只有握手1、握手2的SYN = 1,其他的都SYN = 0

  • FIN:表示其中一个进程向另一个进程挥手告别;只有挥手1、挥手3的FIN = 1,其他的都FIN = 0

建立TCP连接时,在握手1、握手2的选项中协商MSS(最大段长)

MSS的值表示在接下来的数据传输中,一个TCP报文段最多携带多少数据(首部不算在内)

TCP连接管理

建立连接

建立连接过程中SYN、ACK、FIN、seq、ack_seq的值

screenshot-20260211_153051.png

握手3是否携带数据对ack_seq的影响

screenshot-20260211_153022.png

进程的TCP状态转换

screenshot-20260211_153207.png

释放连接

释放连接过程中SYN、ACK、FIN、seq、ack_seq的值

screenshot-20260211_153933.png

进程的TCP状态转换

screenshot-20260211_154040.png

MSL:最长报文段寿命,是由TCP协议规定的一个固定时间长度

TCP可靠传输

序号:进程在建立连接时确定起始序号,数据传输过程中,每个字节对应一个序号

确认机制

累计确认规则:若果而收到ack_seq = n,说明序号在n之前的所有字节都已正确接收

  • 返回ACK的时机:推迟时间最多不能超过0.5秒(推迟确认)

  • 如果自己也有数据要传送给对方,立即返回ACK段,并“捎带”自己的数据

  • 若连续收到两个长度为MSS的报文段,就应该立即返回ACK段

两种ACK段

  • 专门确认:一个ACK段只有TCP首部,没有携带数据

  • 捎带确认:一个ACK段顺道携带了数据

重传机制

超时重传:每发出一个报文段,就设置一个计时器,若计时器到期还没收到确认,就重传这个报文段,并重置计时器

快重传

作用:让可能出错的报文段尽早重传,而不是非要等到超时在重传

配套机制:立即确认(每收到一个TCP报文段,就立即返回一个ACK段;及时收到一个失序报文段,也要立即返回ACK段)

当发送方连续收到三个确认号相同的冗余ACK(1 + 3 个ACK)时,就立即重传该确认号对应的报文段

TCP流量控制

接收方维持一个接收窗口,接收窗口不能大于接收缓冲区的大小;接收窗口“框住”的是接收方还允许接收的序号范围

发送方维持一个发送窗口,发送窗口不能大于发送缓冲区的大小;发送窗口不能大于接收窗口的大小;发送窗口“框住”的是发送缓冲区中,已发送但尚未收到确认的数据,以及可以发送但尚未发送的数据

TCP拥塞控制

拥塞控制

如何判断网络拥塞

  • 发出的每个报文段,都能顺利地收到ACK确认——不拥塞

  • 收到冗余ACK,引发快重传——有点拥塞

  • 发出的报文段未能按时收到ACK,引发超时重传——严重拥塞

如何解决拥塞

  • 迅速减少发送的数据量

  • 严重拥塞就迅速缩小拥塞窗口

  • 有点拥塞就适当缩小拥塞窗口

慢开始算法

cwnd值从1开始,每收到一个ACK,就让cwnd + 1(当cwnd < ssthress时适用)

拥塞避免算法

在一个RTT内,即使收到多个ACK,也只能让cwnd + 1(当cwnd >= ssthress时适用)

快恢复算法

一旦发生快重传,就将阈值、cwnd都设置为当前cwnd的一半,然后切换到“拥塞避免算法”

screenshot-20260215_105045.png

注:ssthresh不能小于2

评论交流

文章目录