第五章 传输层

image-20260926130541173

5.1 传输层概述

image-20260926130934656

image-20260926131146978

image-20260926131357911

套接字,可以简化代码量 。格式:(IP地址:端口号)

回顾

image-20260926133058062

image-20260926132329705

==TCP靠谱(面向连接的,可靠的)==,适合传文件

==UDP不靠谱(无连接的,不可靠的)==,适合视频电话

  • 有连接的传输:(发送方)确认对方已经准备好接受数据,之后告知对方已结束。

image-20260926132726472

  • 可靠传输:(接收方)有确认机制

image-20260926132837515

5.2 UDP数据报

UDP TCP
首部很小,只有8B 首部更大,占20-60B
每次传输一个完整的报文,不支持报文自动拆分,重装 支持报文自动拆分,重装,因此可以传输长报文
是无连接的,不可靠的(可靠性可以给应用层处理),不支持拥塞控制 有连接的,可靠的,支持拥塞控制
支持一对一(封装成单播IP数据报),一对多传输(封装成广播/多播IP数据报) 仅支持一对一传输

image-20260926133226453

image-20260926133409979

UDP数据报格式(4+1个部分)

image-20260926134538188

【UDP数据报理论最大长度:65535B】

示例

image-20260926134817446

回顾

image-20260926134903122

新的检验方式(差错控制)

发送一个UDP数据报之后,接收方如何检验出UDP数据报当中是否有比特错误。

==16bit检验位==:把原始信息(包括数据部分)以16bit为一组,进行相加,再把中间结果进行逐位取反,得到最终检验位。

  • 检验:如果没发生比特错误,三行相加得到全1

image-20260926141718864

image-20260926141747147

【 回卷:如果最高位产生进位,就“回卷”加到最低位,之后才取反。】

UDP检验(发送方的传输层)

  • 计算检验和之前,先添加“伪首部”。
  • 计算完之后,去掉伪首部。(所以“伪首部”并不会在各层之间传输)
  • 计算的过程:刚才学了。(要把新加入的伪首部也进行加和)

image-20260926142225976

UDP检验(接收方的传输层)

  • 网络层向传输层递交UDP数据报。
  • 传输层在UDP数据报之前,添加伪首部。
  • 计算。
  • 如果加法结果全1,说明没有比特错误。如果加法结果不全为1,说明有差错,丢弃该UDP数据报。

image-20260926142434239

回顾

image-20260926142850231

  • IP数据报的首部校验和的计算,只有IP数据报的首部会参与,IP数据报的数据部分不参与,也不会在IP数据报的前面添加一个伪首部的。
  • 而UDP的首部校验是包含UDP首部和整个数据部分的。

image-20260926142919137

5.3 TCP

TCP 报文段(TCP段)

image-20260926143308422

==TCP协议的三大阶段:==

  • 建立连接(三次握手)

  • 数据传输(全双工通信,双向)

  • 释放连接(四次挥手)(2+2,中间变成单向传输TCP段/单向通信)

  • 客户端:主动发起连接的一方。

  • 服务器:被动等待连接的一方。

image-20260926143843526

建立一次TCP连接可以传输 多个 报文(双向)

  • (MSS:双方协商的最大段长)

==TCP是面向字节流的,UDP是面向报文的。==

  • 无论传输多少个报文,在TCP协议看来都是一连串的字节流。

image-20260926144335207

TCP 段格式

==TCP报文段== = TCP首部(20-60B) + TCP数据部分

IP报文段 = IP首部(20-60B) + IP数据部分(TCP报文段)

image-20260926144558233

源端口,目的端口:就是发送方进程/接收方进程的端口号

**==序号seq==**:用于标记数据部分第一个字节在原始字节流中的位置(不一定从0开始,是发送方自己设置的)

==确认号ack==或acq_seq:用于反馈,表示序号在确认号之前的所有字节都已正确收到。且具有累积确认的特性(收到1,2,4:返回2)

ACK:值域握手①的ACK=0,其余ACK都等于1。

image-20260926145618910

数据偏移:表示TCP首部 长度,以*4B为单位。4bit

  • 填充:用于凑足4B的整数倍。
  • 在TCP首部中,不会专门记录TCP数据部分长度。

image-20260926150006481

几个少考的标志位:

image-20260926150034804

image-20260926150439130

⭐

==SYN==:同步位。表示这是一个连接请求或者连接接收报文。(只有握手①,我握手③的SYN=1)

==FIN==:终止位finish。表示此报文段的发送方的数据已发送完毕。(只有挥手①,挥手③的FIN=1)

image-20260926150725316

image-20260926150835438

⭐==窗口==(rwnd,rcwnd)

  • 16bit,表示剩余接收窗口的大小。

  • 是实现“流量控制”的关键。

image-20260926151245837

检验和

  • 与UDP差不多。计算检验和之前也需要添加12B伪首部。
    • (只需将UDP伪首部中:“协议字段”的17改为6,“UDP长度”改成“”TCP长度)

image-20260926151402906

image-20260926151412435

⭐ 选项

在TCP建立连接时,在握手①、握手② 选项中协商 ==MSS==(最大段长)

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

image-20260926151732730

回顾

image-20260926152251889

TCP 连接管理(三次握手,四次挥手)

image-20260926152507183

image-20260926152520179

==三次握手==

1.SYN,FIN,seq,ack_seq,ACK的值为多少。

  • 握手①,握手②尽管不能携带数据,但是仍要消耗1个序号seq。==【seq +1→ack】==
  • 握手③不携带数据时就不消耗序号seq,携带数据时就消耗seq(消耗多少取决于携带的数据量)==【seq + n→ack】==

image-20260926153230081

image-20260926153429287

image-20260926153715710

2.每发出一个握手报文段后,进程的TCP状态转换。

image-20260926154008917

3.建立连接阶段的最短耗时分析。

image-20260926154241187

==四次挥手==

1.SYN,FIN,seq,ack_seq,ACK的值为多少

  • 只有挥手①,挥手③的FIN=1。
  • 挥手①,挥手③即使不携带数据,也要消耗1个序号seq。==【seq +1→ ack】==
  • 挥手②可以携带数据==(seq + n → seq)==。挥手④不可以携带数据。

image-20260926155212766

2.每收到一个挥手报文段后,进程的TCP状态转换。

image-20260926155641463

3.ack_seq。断开连接的最短耗时分析

image-20260926160123325

image-20260926160403058

image-20260926160503728

回顾

image-20260926160817173

TCP 可靠传输 与 流量控制 ⭐

image-20260926200815010

image-20260926201127662

image-20260926201555355

image-20260926203122243

注:

一个端口可以支持多个TCP连接。

但是每一个TCP连接仅支持一对一的全双工通信

image-20260926203149234

image-20260926203827499

image-20260926203856305

image-20260926204027738

image-20260926204132019

image-20260926204406436

image-20260926204445433

image-20260926204708269

image-20260926204724084

image-20260926205826487image-20260926205842716

image-20260926204941172

image-20260926205159557

image-20260926205351202

image-20260926205656340

image-20260926205952109

image-20260926205932604

image-20260926210156546

image-20260926210210897

image-20260926210407814

image-20260926210431167

image-20260926210606877

image-20260926210618910

image-20260926210636304

回顾

image-20260926210714668

image-20260926221348156

image-20260926211059582

image-20260926212132185

补充:快重传机制

image-20260926215252872

image-20260926213351601

image-20260926213148733

image-20260926214726486

image-20260926214734565

image-20260926221258883

TCP 拥塞控制

image-20260927150044571

==流量控制==:控制端到端的数据发送量,是局部的。

==拥塞控制==:控制整个网络中每台主机的数据发送量,降低路由器负载,是全局的。

  • Solution:迅速减少发送的数据量。
  • 发送窗口的上限值 = min { 接收窗口,拥塞窗口 }

image-20260927145357717

==如何判断网络拥塞:==

  • 不拥塞:发出的每一个报文段,都能顺利地收到ACK确认。
  • 有点拥塞:收到冗余ACK,引发快重传。
    • 此时应当适当缩小拥塞窗口。
  • 严重拥塞:发出的报文段 未能按时收到ACK,引发超时重传。
    • 此时应当迅速减小拥塞窗口。

慢开始算法,拥塞避免算法

image-20260927150522740

  • ==慢开始算法==(每个RTT,拥塞窗口翻倍)
  • ==拥塞避免算法==(每个RTT,拥塞窗口+1)
  • ==拥塞控制阈值==,在严重拥塞时会减小,阈值=拥塞窗口值/2。
    • 只有 超时重传 会把拥塞窗口一下子变成1,而收到冗余ACK时拥塞窗口的值不会下降地这么快。

image-20260927151809439

image-20260927151531390

image-20260927151555741

image-20260927152015886

image-20260927152109571

image-20260927152138864

image-20260927152847562

拥塞窗口的数字和MSS是有联系的(如果MSS=2KB,C=9*2=18KB)

image-20260927153742365

快重传,快恢复

image-20260927153956207

image-20260927154050092

==快恢复:把拥塞窗口C变成1/2C==

==新阈值S = 1/2C==

Note:阈值不能小于2!

然后切换到拥塞避免算法。

image-20260927154442561