问题描述
解决思路
利用如下拓扑对前面的知识进行回顾。
图1 拓扑图
问题:源主机
H
1
\textrm{H}_1
H1?要和目的主机
H
2
\textrm{H}_2
H2?进行通信,源主机
H
1
\textrm{H}_1
H1?要构建数据包封装来自应用层的数据。根据MAC层和IP层首部字段信息,同学们可以去思考如何填充以下四个字段:(MAC目的地址,MAC源地址,IP源地址,IP目的地址)?
步骤:
同学们也可以利用这个拓扑,复习一下如下知识:
实际网络存在如下的现象:
解决方法:在运输层使用协议端口号 (protocol port number),简称为端口 (port)。把端口设为通信的抽象终点。
端口用一个 16 位端口号进行标志,允许有 65,535 个不同的端口号。
两大类、三种类型的端口:
常用的熟知端口:
TCP协议包括四个重要的技术:
根据图1的拓扑图,令A为源主机
H
1
\textrm{H}_1
H1?,B为目的主机
H
2
\textrm{H}_2
H2?:
问题:A 如何知道 B 是否正确收到了
M
1
\textrm{M}_1
M1? 呢?
解决方法:超时重传
发送窗口:
累积确认:
连续 ARQ 协议采用 Go-back-N(回退N)。
Go-back-N(回退N):表示需要再退回来重传已发送过的 N 个分组。当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
流量控制 (flow control) :让发送方的发送速率不要太快,使接收方来得及接收。
利用滑动窗口机制可以很方便地在 TCP 连接上实现对发送方的流量控制。
(1) 发送窗口
P
1
\textrm{P}_1
P1? = 后沿,
P
2
\textrm{P}_2
P2? = 当前,
P
3
\textrm{P}_3
P3? = 前沿。
P
3
?
P
1
\textrm{P}_3 - \textrm{P}_1
P3??P1? = A 的发送窗口(又称为通知窗口)
P
2
?
P
1
\textrm{P}_2 - \textrm{P}_1
P2??P1? = 已发送但尚未收到确认的字节数
P
3
?
P
2
\textrm{P}_3 - \textrm{P}_2
P3??P2? = 允许发送但尚未发送的字节数(又称为可用窗口)
(2) 接收窗口
强调三点:
(3)利用可变窗口进行流量控制举例
A 向 B 发送数据,MSS = 100 字节。在连接建立时,B 告诉 A:“我的接收窗口 rwnd = 400(字节)”
问题:可能发生死锁:
解决思路:持续计时器 (persistence timer),只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。
糊涂窗口综合症:每次仅发送一个字节或很少几个字节的数据时,有效数据传输效率变得很低的现象。
发送方糊涂
问题描述:发送方 TCP 每次接收到一字节的数据后就发送。
解决方法:Nagle 算法。
接收方糊涂
问题描述:接收方应用进程消耗数据太慢,例如每次只读取一个字节。
解决方法:让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。
发送方和接收方相互配合使用上述方法,使得在发送方不发送很小的报文段的同时,接收方也不要在缓存刚刚有了一点小的空间就急忙把这个很小的窗口大小信息通知给发送方。
(1)慢开始 (slow-start)
方法描述:
(2)拥塞避免 (congestion avoidance)
方法描述:每经过一个往返时间 RTT(不管在此期间收到了多少确认),发送方的拥塞窗口 cwnd = cwnd + 1。
慢开始和拥塞避免算法的实现举例:
(3)快重传 (fast retransmit)
方法描述:发送方只要连续收到三个重复的确认,就立即进行重传(即“快重传”),这样就不会出现超时。
(4)快恢复 (fast recovery)
方法描述:当发送端收到连续三个重复的确认时,不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法。
快重传和快恢复算法的实现举例: