5.8.10 TCP协议
我们通过一个实例来看一下TCP协议
如图
图中是六个IP数据报的前40个字节的内容,使用的是16进制数表示的,该数据报的背景如下图
主机H通过快速以太网连接Internet,主机H的IP地址是192.168.1.100,服务器S的IP地址是202.119.224.201,在使用TCP通信时在主机H上捕获到的六个IP数据报的前四十个字节就是前图所示,这里使用十六进制数表示。
在分析前我们先了解一下基础的知识
在Wireshark采集到的报文段中,我们能够分析出很多网络通信中非常有价值的内容,我们从上面六个相互关联的IP数据报的前四十个字节部分根据我们前面学习的IP数据报的格式(5.2.3 IP数据报(一)IP数据报的格式)、TCP报文段首部格式(5.8.2 TCP报文段首部格式)可以发现很多非常重要的分析内容。如图
我们可以得到IP数据报的总长度、生存时间、协议、源和目的IP地址、TCP首部中的源端口、目的端口、序号、确认号、标志位、窗口字段。
根据TCP相关知识,解决下面五个问题
-
IP数据报中,哪几个是由主机H发送的?
从源IP地址字段我们可以明显的看出192.168.1.100对应的16进制数为c0 a8 01 64,也就是第一个,第三个、第四个报文都是由该主机发出的。其余的都是由服务器S发出的报文。
-
根据默认端口,请问服务器S开通的是什么应用服务?
根据第一个报文的协议字段赋值为06我们知道其IP数据报中携带的数据是TCP的数据,进一步我们看到源端口de 7e是一个一般的端口,但是目的端口00 50对应的是80,我么通过默认的TCP端口号知道该服务器开通的是HTTP的应用服务。
-
前三个IP数据报的内容完成了TCP协议的什么功能?
完成功能需要查看TCP首部的标志位字段。这里我们知道标志位都是以位为单位显示的,这里我们需要先将16进制转化为二进制表示。
第一个报文段中标志位显示02对应的二进制为0000 0010,这里我们可以看出SYN=1
第二个报文段中标志位为12对应的二进制为0001 0010,表示SYN=1,ACK=1
第三个报文段中标志位为10对应的二进制为0001 0000,表示ACK=1
综合来看,前三个报文段完成了TCP三次握手的连接管理功能。
同时我们也可以注意一下通信双方的序号和确认号的变化。这里主机H的初始序号是7a 89 25 c1,第二个报文段的确认号信息7a 89 25 c2,与第一个报文段的序号信息相比增加了1。这是因为第一个报文段中的SYN标志位为1,需要消耗一个序号。
第二个报文段则是服务器发送数据的初始序号为0e 7c ba f5,在第三个报文段中确认号是0e 7c ba f6也比服务器初始序号增加了1,这是因为在第二个报文段中,SYN=1,也消耗掉了一个序号。
主机H发出的第一个字节的数据序号是7a 89 25 c2,因为第三个报文段仅有ACK=1,它并没有消耗小序号。
-
题表中的IP数据报,主机H和服务器分别发送了应用层数据字节数是多少?如果第7个报文段是对第六个报文段的确认,那确认号应该是多少?
这里我们需要参考TCP报文段中的序号和确认号字段,从第四个报文段开始我们知道是由主机192.168.1.100发送给服务器的,其序号为7a 89 25 c2,而第五个报文段是服务器发回的应答确认,确认号为7a 89 25 da,也就是服务器期望接收来自于主机H的下一个报文段中的第一个字节的序号是7a 89 25 da,二者之间的差值就是主机H向服务器端发送的数据字节大小,也就是536个字节。
第六个报文段是由服务器向主机H发出的数据,这里我们需要换一种方法来判定本报文段所携带的数据,这里我们使用IP数据报总长度减去IP数据报和TCP报文段的首部长度,剩余的就是TCP报文段的数据,我们看到第六个报文段中IP总长度为02 13,也就是531个字节,我们从中间去20个字节的IP数据报首部长度,再减去20个字节的TCP的首部,从而得到所携带的数据是531-20-20=491个字节。
我们也可以判定如果第七个报文段是对第六个报文段的确认,确认号Ack字段应该是从0e 7c ba f6开始加上491也就是0e 7c bc e1
-
TCP报文段的窗口值有什么变化?表示什么意思?
TCP报文段的窗口值一直在发生变化,从主机H到服务器的窗口值从初始的20 00到11 1c,服务器到主机的窗口尺寸从初始的16 d0变化成00 36
这些变化也验证了窗口是大小可变的滑动窗口进行流量控制。