(9 分)本地主机 A 的一个应用程序使用 TCP 协议与同一局域网内的另一台主机 B 通信。用 Sniffer 工具捕获本机 A 以太网发送和接收的所有通信流量,目前已得到 8 个 IP 数据报。表 1 以 16 进制格式逐字节列出了这些 IP 数据报的全部内容,其中,编号 2、3、6 为主机 A 收到的 IP 数据报,其余为主机 A 发出的 IP 数据报。假定所有数据报的 IP 和 TCP 校验和均是正确的。
表 1 Sniffer 捕获到的 IP 数据报
IP 分组头结构和 TCP 段头结构分别如图1、图2所示:
协议域为1、6、17、89分别对应ICMP、TCP、UDP、OSPF协议。
本题中窗口域描述窗口时使用的计量单位为1字节。 请回答下列问题:
(1) 表 1 的 IP 分组中,哪几个完成了 TCP 连接建立过程中的三次握手?根据三次握手报文提供的信息,连接建立后,如果 B 发数据给 A,那么首字节的编号是多少?
(2) 根据表 1 中的 IP 分组,A 上的应用程序已经请求 TCP 发送的应用层数据的总字节是多少?
(3) 如果 8 号 IP 分组之后,B 正确收到了 A 已发出的所有 IP 分组,B 发给 A 的 TCP 报文段中 ack 号应当是多少(十六进制)?在 8 号 IP 分组之后,A 上的应用程序请求 TCP 发送新的 65495 字节的应用层数据,那么,按 TCP 协议,在 A 未能得到 B 的任何确认报文之前,TCP 可以发送到网络中的应用层数据最多是多少字节?
[tag_link]
(1)编号 2、3、6 包为主机 A 收到的 IP 数据报,其他均为主机 A 发送的数据报,由主机 A 发送的数据报中的源 IP 地址可知主机 A 的 IP 地址为 c0 a8 00 15。对比编号 2、3、6 包,可知 2 号数据报是来自一个发送方,3、6 号是来自同一个发送方,由 2 号帧的源 IP 地址和目的 IP 地址以及其协议字段(ICMP 协议)可知该数据报来自于不知名的一方(可能是网络中某个节点),而 3、6 号来自于主机 B,则主机 B 的 IP 地址为 c0 a8 00 c0,所以三次握手应该是编号为 1、3、4 的三个数据报。
连接建立后,由主机 A 最后的 4 号确认报文段以及之后发送的 5 号报文段可知 seq 字段为 22 68 b9 91,ack 号为 5b 9f f7 1d,可知主机 A 期望收到对方的下一个报文段的数据中的第一个字节的序号为 5b 9f f7 1d,也就是说如果 B 发送数据给 A,首字节的编号就应该是 5b 9f f7 1d。
(2)主机 A 从 4 号报文段才可以携带应用层数据,所以只需要将 4、5、7、8 报文中的数据部分加起来即可,观察 4、5、7、8 号报文的头部长度字段,均为 5,表示 TCP 头部长度均为 5*4B=20B,由图表可知,从第三行开始的内容均为要传输的数据,其和为:0 + 16 + 16 + 32 = 64B。
(3)主机 B 接收到主机 A 的 IP 分组后,会在 8 号报文段的序号字段的基础之上,加上其发送的数据字节数,即为:(22 68 b9 a1)₁₆ + 32 = (22 68 b9 c1)₁₆。
B 在 6 号报文段中指出自己的窗口字段为 (20 00) = 8192B,说明此时 B 还能接收到这么多数据。而之后 A 发送了两个报文段。由 7 号和 8 号报文段的序号和确认号可知 8 号是 7 号的重复发送数据,所以 B 只需要接收 8 号的数据部分,也就是 32B,所以之后 A 还可以发送的字节数为 8192-32B = 8160B。