传输层 == 运输层
套接字(Socket) = IP地址 + 端口号(port),位于应用层
理解:你的的手机正在浏览网页,刷新电子邮件,同时连接到微信。所有这些连接都通过同一链路发送,这一过程为复用;手机接收到的数据包流将被分割并发送到相应的网络、电子邮件、微信程序,该过程为分用




引入3种功能:
1. 通过 checksum 来校验错误
2. 接收者 反馈接受 ACK 和 NAK信息
3. 重传
理解:传输层对应用层的数据进行打包处理时,新增checksum(校验和),从而接收端可以对其数据包进行检验,如果正确,返回ACK,发送者继续发送下一个数据包;如果不正确,返回NAK,发送者重传数据。**














面向连接:只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费
TCP 报文段结构:

具体应用:

超时时长的设置
D
e
v
R
T
T
=
(
1
−
β
)
∗
D
e
v
R
T
T
+
β
∗
∣
S
a
m
p
l
e
R
T
T
−
E
s
t
i
m
a
t
e
d
R
T
T
∣
DevRTT = (1-\beta)*DevRTT + \beta*|SampleRTT-EstimatedRTT|
DevRTT=(1−β)∗DevRTT+β∗∣SampleRTT−EstimatedRTT∣
T i m e o u t = E s t i m a t e d R T T + 4 ∗ D e v R T T Timeout = EstimatedRTT + 4 * DevRTT Timeout=EstimatedRTT+4∗DevRTT
其中
R
T
T
RTT
RTT为 round-trip-time 往返时间;
D
e
v
R
T
T
DevRTT
DevRTT为 RTT偏差值(safety margin);
S
a
m
p
l
e
R
T
T
SampleRTT
SampleRTT为 报文段的样本RTT;
E
s
t
i
m
a
t
e
d
R
T
T
EstimatedRTT
EstimatedRTT为TCP对下一个数据往返值进行的估计
实现:
TCP 重传方案


快速重传
通过 重复的ACK 来检测报文段丢失:发送方通常连续发送大量报文段,如果报文段丢失,发送方一般会收到多个重复的ACK
如果发送方收到同一数据的3个重复ACK,重传对方需要的数据段(第一个ACK正常,后面三个为重复ACK)

问题:考虑一个可靠的数据传输(rdt)协议,通过一个有比特错误的信道(数据包被破坏但没有丢失)。解释检测错误并恢复的过程。
Q:Consider a reliable data transfer (rdt) protocol over a channel with bit errors (packets are corrupted but not lost). Explain the procedure to detect and recover from errors.
答:① 从数据包头部解析出校验和 checksum,② 通过数据包及头部计算新的校验和,③ 如果两者不匹配,则说明包错误,④ 接收方回应NAK(rdt2.1) 或 回应带有错误编号的ACK(rdt2.2/rdt3.0)
(往年考题) rdt2.1相关问题 (书 P191 第三章习题 P6):
考虑我们改正协议rdt2.1的动机。试说明如图3-57所示的接收方与如 图3-11 所示的发送方运行时,接收方可能会引起发送方和接收方进人死锁状态,即双方都在等待不可能发生的事件。
P6. Consider our motivation for correcting protocol rdt2.1 . Show that the receiver, shown in
Figure 3.57 , when operating with the sender shown in Figure 3.11 , can lead the sender and
receiver to enter into a deadlock state, where each is waiting for an event that will never occur.
参考答案:
假设发送方(图3-11)处于“等待来自上层的调用1”状态时,而接收方(图3-57)处于“等待来自下层的1”,
发送方发送1号数据包,并转换到“等待ACK或NAK 1”状态,等待ACK或NAK。
现在假设接收方正确地接受了1号数据包,发送了ACK,然后转换到“等待来自下层的0”状态,等待0号数据包。
但是,若ACK消息损坏,rdt2.1发送方接收到损坏的ACK,条件rdt_rcv(rcvpkt)&&(corrupt(rcvpkt)为 True,
发送方会执行udt_send(sndpkt),重新发送1号数据包,而接收方在等待0号,has_seq1(rcvpkt)为 True,
在没接收到0号数据包时会始终返回NAK消息,而发送方处于当前状态时接收到NAK会始终发送1号数据包。
因此,发送方处于“等待ACK或NAK 1”状态,始终接收NAK并发送1号数据包,
接收方处于“等待来自下层的0”状态,始终接受1号数据包并丢弃,返回NAK,从而陷入死锁状态。
Go-Back-N 理解练习
Go-back-N 接收方收到了packets 1,2,3,5,下面说法正确的是:
A) 回复 ACKs 1,2,3,5
B) 发送 packets 1,2,3,5 给应用层
C) 不应该向应用层发送包,因为缺失了部分数据(4)
D) 应该丢弃 packet 5
✓
\checkmark
✓
TCP快速重传练习
TCP sender 窗格大小为5,待发送包共10个,sender发送pkt(1,2,3,4,5)。当sender收到下列情况的ACKs时会执行什么操作?
① 收到 ACK(1,2,3,4,5)
② 收到 ACK(1,3)
③ 收到 4次 ACK1
答:① 正常发 pkt(6,7,8,9,10);② 发 pkt(6,7,8),等待pkt(4)是否超时(收到ACK3说明pkt2肯定收到,发送方窗格移动到[45678],pkt45已发,只需要发送pkt678即可);③ 重发pkt(2),正常发pkt(6)(本题ACK n的序号与现实传输不同,表示对n号包的确认,而不是需要sender的pkt-n;第一次ACK1表示收到了pkt-1,pkt-2传输时丢失,后三次ACK1分别来自receiver接收到pkt-3,4,5时的反馈,因为没收到pkt-2,只能回复确认pkt-1收到了;收到ACK1,sender窗格移动到[23456],可以正常发pkt-6)