无标题
第五章 传输层

5.1 传输层概述



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


==TCP靠谱(面向连接的,可靠的)==,适合传文件
==UDP不靠谱(无连接的,不可靠的)==,适合视频电话
- 有连接的传输:(发送方)确认对方已经准备好接受数据,之后告知对方已结束。

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

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


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

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

回顾

新的检验方式(差错控制)
发送一个UDP数据报之后,接收方如何检验出UDP数据报当中是否有比特错误。
==16bit检验位==:把原始信息(包括数据部分)以16bit为一组,进行相加,再把中间结果进行逐位取反,得到最终检验位。
- 检验:如果没发生比特错误,三行相加得到全1


【 回卷:如果最高位产生进位,就“回卷”加到最低位,之后才取反。】
UDP检验(发送方的传输层)
- 计算检验和之前,先添加“伪首部”。
- 计算完之后,去掉伪首部。(所以“伪首部”并不会在各层之间传输)
- 计算的过程:刚才学了。(要把新加入的伪首部也进行加和)

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

回顾

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

5.3 TCP
TCP 报文段(TCP段)

==TCP协议的三大阶段:==
建立连接(三次握手)
数据传输(全双工通信,双向)
释放连接(四次挥手)(2+2,中间变成单向传输TCP段/单向通信)
客户端:主动发起连接的一方。
服务器:被动等待连接的一方。

建立一次TCP连接可以传输 多个 报文(双向)
- (MSS:双方协商的最大段长)
==TCP是面向字节流的,UDP是面向报文的。==
- 无论传输多少个报文,在TCP协议看来都是一连串的字节流。

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

源端口,目的端口:就是发送方进程/接收方进程的端口号
**==序号seq==**:用于标记数据部分第一个字节在原始字节流中的位置(不一定从0开始,是发送方自己设置的)
==确认号ack==或acq_seq:用于反馈,表示序号在确认号之前的所有字节都已正确收到。且具有累积确认的特性(收到1,2,4:返回2)
ACK:值域握手①的ACK=0,其余ACK都等于1。

数据偏移:表示TCP首部 长度,以*4B为单位。4bit
- 填充:用于凑足4B的整数倍。
- 在TCP首部中,不会专门记录TCP数据部分长度。

几个少考的标志位:


⭐
==SYN==:同步位。表示这是一个连接请求或者连接接收报文。(只有握手①,我握手③的SYN=1)
==FIN==:终止位finish。表示此报文段的发送方的数据已发送完毕。(只有挥手①,挥手③的FIN=1)


⭐==窗口==(rwnd,rcwnd)
16bit,表示剩余接收窗口的大小。
是实现“流量控制”的关键。

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


⭐ 选项
在TCP建立连接时,在握手①、握手② 选项中协商 ==MSS==(最大段长)
==MSS的值表示在接下来的数据传输中,一个TCP报文段最多携带多少数据(首部不算在内)==

回顾

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


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



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

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

==四次挥手==
1.SYN,FIN,seq,ack_seq,ACK的值为多少
- 只有挥手①,挥手③的FIN=1。
- 挥手①,挥手③即使不携带数据,也要消耗1个序号seq。==【seq +1→ ack】==
- 挥手②可以携带数据==(seq + n → seq)==。挥手④不可以携带数据。

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

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



回顾

TCP 可靠传输 与 流量控制 ⭐




注:
一个端口可以支持多个TCP连接。
但是每一个TCP连接仅支持一对一的全双工通信
























回顾




补充:快重传机制






TCP 拥塞控制

==流量控制==:控制端到端的数据发送量,是局部的。
==拥塞控制==:控制整个网络中每台主机的数据发送量,降低路由器负载,是全局的。
- Solution:迅速减少发送的数据量。
- 发送窗口的上限值 = min { 接收窗口,拥塞窗口 }

==如何判断网络拥塞:==
- 不拥塞:发出的每一个报文段,都能顺利地收到ACK确认。
- 有点拥塞:收到冗余ACK,引发快重传。
- 此时应当适当缩小拥塞窗口。
- 严重拥塞:发出的报文段 未能按时收到ACK,引发超时重传。
- 此时应当迅速减小拥塞窗口。
慢开始算法,拥塞避免算法

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







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

快重传,快恢复


==快恢复:把拥塞窗口C变成1/2C==
==新阈值S = 1/2C==
Note:阈值不能小于2!
然后切换到拥塞避免算法。

