《计算机网络》中第五章“运输层”中5-23题的思考
关于《计算机网络(第七版)》(谢希仁编著)中第245页,5-23题的思考
@Author: Kai
@Time: 2024.5.22
原题
主机A向主机B连续发送了两个TCP报文段,其序号分别是70和100。试问:
(1)第一个报文段携带了多少字节的数据?
(2)主机B收到一个报文段后发回的确认中的确认号应当是多少?
(3)如果B收到第二个报文段后发回的确认中的确认号是180,试问A发送的第二个报文段中的数据有多少字节?
(4)如果A发送的第一个报文段丢失了,但第二个报文段到达了B。B在第二个报文段达到后向A发送确认。试问这个确认号应为多少?
第一种解法
按照作者意图,编号70和编号100是连续的两个报文段,70和100是数据编号。报文段A是7099的字节数据,共30个字节数据;报文段B是100179(以第三问为例)的字节数据,共80个字节数据。那么下一个连续的报文段C的编号是180,是180~'未知’的字节数据。
那么(即使各小问间没有关联),
(1)第一个报文段携带了30个字节的数据;
(2)主机B收到一个报文段后发回的确认中的确认号应当是多少?这里既可以”选择确认SACK“,也可以是”逐段确认”,但是题目没有说明前面有缺失的段,我们就只能认为是下一个连续段:报文段B,所以主机B收到一个报文段后发回的确认中的确认号应当是100;(但按照第四问,“选择确认SACK”应该在第二个报文达到后被使用,就算各题间没有关联,此处”选择确认SACK“也不一定被使用,按作者意图,我们应该当它被使用)
(3)报文段B中的数据有80字节;
(4)按照作者意图,这里应当是支持”选择确认SACK“,所以确认号是缺失的数据段A,确认号是70;
第二种解法
这道题有些疑问,报文段也可以是这样编号(也可能不是):
按照”逐段确认“的机制,主机B两次向主机A确认,需要编号70的报文段A和编号100的报文段B,或者是“选择确认SACK”机制,需要报文段A和报文段B,或者是编号70的报文段A和编号100的报文段B没有被确认,需要重传。我们可以认为71~99的报文段都已被成功接收。那么报文段70可能是第一个报文段,数据长度为1字节;报文段B可能是最后一个字节,那么数据长度未知;而且70~100是为了传送连续数据的数据段。我们假设数据段70~数据段100都是传输数据的中间几个报文段,那么他们的数据长度可以为”最大报文段长度MSS”。
MSS的介绍可以看这篇《最大报文段长度——MSS》
这么看来的话,
(1)第一个报文段携带了MSS字节的数据;
(2)主机B收到一个报文段后发回的确认中的确认号应当是100,因为71~99的报文段都已被接受,主机B不会给出71的确认码,而是给出其继续需要的报文段。(这里有问题,难道主机A需要两次发送报文B吗,如果是“逐段确认SACK”机制就不会有这个问题,但是题目这里显然是“逐段确认”)
(3)A发送的第二个报文段中的数据有MSS个字节;
(4)在“选择确认SACK”机制下,确认号应当是70;“逐段确认”机制下,确认号应当是101或者更后面的报文段编号,而报文段A在主机A没有收到确认后超时进行重传。
现在默认认为使用“选择确认SACK”。
其他
个人才疏学浅,欢迎指正。