解析一(TCP-1.1)
这个包是发送方向服务器发送的SOCKET请求包。也就是请求连接。
---DLC HEADER---
00-11-D8-76-8D-A3 目标主机的MAC地址
00-11-D8-54-5B-5C 发送机MAC地址
---SNAP HEADER---
08-00 表示以太网类型使用的是IP协议
---IP HEADER---
45 4代表IP版本为V4,5是以32位(也就是4个字节)为单位的报头长度,共20(bytes),也就等于告诉我们该包是一个最常见的、不包含任何填充字节和IP选项字节IP包。
00 服务类型。这里是一般类型
00-30 IP数据报的总长度48个字节,也就是去掉DLC HEADER和SNAP HEADER后的长度
01-06 标识符字段,262这些数据段属于同一个数据报
40-00 标志位和段偏移
010 第二位为1表示允许对该数据报进行分段。第三位为0表示当前分段为最后一个分段。
00000 00000000 段与原数据报开始位置的偏移
80 TTL,允许从开始节点到达目标节点最多128跳,每一跳经过的设备可能是网关、路由或者主机,如果超过这个值,则视为该包丢失。
06 表示协议类型为TCP。如果是17,则为UDP,IP将根据该字段的值来确定将其转交给相应的上层进程。
8E-0B 报头校验和。这里是正确的
0A-79-2B-62 源IP地址,转成十进制为10.121.43.98
0A-79-2B-63 目的地址字段,转成十进制为10.121.43.99
---TCP HEADER---
04-0E 源地址使用的端口,转换为十进制为1038
04-D2 目的机使用的端口,转换为十进制为1234
DD-0C-75-FC 顺序编号,转为十进制是3708581372,它能保证数据报以正确的顺序接收;
00-00-00-00 确认编号,它指发送方希望收到的下一个数据报的顺序编号,由于这里的包还没有从服务器返回,所以设置为0
70-02 70二进制01110000,前四位0111表示TCP报头中32位字的编号,另六位是保留字段,再六位就是TCP的标志位字段。也就是说:十六进制的02表达为二进制为:00000010在对应到TCP协议规定的低六位依次为:
URG-0
ACK-0
PSH-0
RST-0
SYN-1 发送方设置此位表示同步,并在顺序编号中填入了数据包的顺序编号。
FIN-0
FF-FF 窗口大小,发送方可用来接收数据的字节数
BB-7F 报头校验和
00-00 无TCP可选项
02-04-05-B4-01-01-04-02 选项字段(无用数据)
解析二(TCP-1.2)
这个包是从服务器返回的应答包。
和上一个包不同之处有三:
第一,61-C5表示393669这些数据段属于同一个数据报
第二,这里服务器的顺序编号字段为E7-CB-C0-FF,也就是十进制的3888890111,而客户端来的顺序号加1以后变为响应编号,即原来的DD-0C-75-FC变成了DD-0C-75-FD
第三,标志位发生了变化:70-12,其中12变成二进制为00010010,对应到标志位为:
URG-0
ACK-1 服务器接收到客户端的响应,要求客户端发送确认消息。
PSH-0
RST-0
SYN-1 发送方(这里为服务器)设置此位表示同步,并在顺序编号中填入了自己数据包的顺序编号。
FIN-0
解析三(TCP-2.1)
该包是客户端接收到服务器响应包后发送给服务器的响应包(第二次握手)。
其中,8E-12是IP报头的校验和,其数据是从45-00开始到2B-63(含)结束,共20个字节,校验和应该为128Eh。校验和计算方法如下:
将数据以字为单位累加到一个双字中,如果数据的长度为奇数,那么最后一个字节将被扩展到字以后再进行累加,累加的结果是32位,而校验和字段是16位的,因此校验和最终需要被定义为16位,算法是将累加和的高16位和低16位相加后取反,注意,因为这20个字节里含有校验和字段,因此在计算校验和之前首先应该将校验和字段设置为0
如上数据包,计算IP校验和的方法如下:
~((0045+0028+0701+0040+0680+0000+790a+622b+790a+632b)&ffff0000>>16+(0045+0028+0701+0040+0680+0000+790a+622b+790a+632b)&0000ffff)
结果为:128E
以下过程解释了一段我们经常听到的话:
设对一IP包的IP Header(注意这时不包含IP Header的校验和字段)求得校验和:SUM1 = 01010101 01010101 01010101 01010101, 随后SUM1被填入校验和字段,接着该IP包被发送。
接收方接到该IP包,校验和计算步骤可分解如下:
(1)对IP包的IP Header(注意这时不包含IP Header的校验和字段)求得校验和:SUM2 = 01010101 01010101 01010101 01010101, 这里计算方法跟上面一样,显然SUM2 == SUM1。
(2)取IP Header的校验和字段填入SUM3, 显然SUM3 == SUM1。
(3)IP Header 的校验和SUM = SUM2 + SUM3的反码 = SUM1 + SUM1的反码 = 11111111 11111111
11111111 11111111。
这也就是我们经常听说的:IP报文头部20个字节中间有4个字节是校验位,对其进行16位二进制取反求和,结果就是校验码。接收方收到后同样对IP数据头进行二进制取反求和,得出的结果应该全是1
再来看TCP校验和的计算,与IP校验和计算不同的是,TCP校验和的计算还要加上12个字节的伪头部,主要包括源、目的ip地址,协议和长度,udp的长度从udp字段中可以得到(UDP的校验和可选,TCP则是必须的),而tcp的长度是tcp包头加上数据的长度,这点需要特别注意。udp和tcp的伪头部在数据包中是不会体现出来的,必须计算校验和时自己加上去。以下是伪头部的详细定义:
(1)32位源IP地址
(2)32位目的IP地址
(3)8位保留,默认值为0
(4)8位协议,TCP为6,UDP为17
(5)16位UDP/TCP长度
共12字节
如上数据包,TCP校验和的计算方法如下:
~((790a+622b+790a+632b+0600+1400+0e04+d204+0cdd+fd75+cbe7+00c1+1050+ffff+0000+0000)&0ffff0000>>16+
(790a+622b+790a+632b+0600+1400+0e04+d204+0cdd+fd75+cbe7+00c1+1050+ffff+0000+0000)&0000ffff)
注意长度的写法,因为没有数据,因此TCP数据报的长度为0014h(即20个字节)
结果为673F
第一,IP标识符01-07
第二,再次向服务器发送一个数据包,顺序编号自动加1,即由最初的DD-0C-75-FC变成了DD-0C-75-FD,客户端的响应编号为E7-CB-C1-00
第三,TCP标志位:50-10,其中10变为二进制为00010000,对应到各标志位:
URG-0
ACK-1 客户端接收到服务器的响应,告诉服务端已经得到确认消息。
PSH-0
RST-0
SYN-0
FIN-0
至此,一个TCP连接建立完成。
解析四(TCP-2.2)
服务器侦听程序接受了该连接,逻辑线路建立。服务器开始工作,向客户端发送应该发送给客户端的信息。
第一,IP标志61-C6。
第二,顺序编号:E7-CB-C1-00,响应编号:DD-0C-75-FD
第三,TCP标志位 50-18,其中18的二进制为00011000,对应到各标志位:
URG-0
ACK-1 服务器接收到客户端的响应,继续要求客户端确认;
PSH-1 要求客户端收到后立即刷新缓冲区,以读出缓冲区的内容。
RST-0
SYN-0
FIN-0
TCP包数据的内容为“53-65-72-76-65-72……--31-32-33-34”。
下面我们来看一下对数据定位和个长度的计算:
IP包总长度=IP包报头长度+TCP包报头长度+TCP数据长度
IP包的总长度为“00-69”=105个字节,注意这个长度不包含DLC HEADER和SNAP HEADER
IP包报头的长度为“45”中的5*4=20个字节
TCP包报头的长度为“50-18”中的5*4=20个字节
TCP数据的长度可以算出为:105-20-20=65个字节,这六十五个字节就是服务器向客户端发送的:“Server Information:Local host: media/10.121.43.99Port : 1234”
解析五(TCP-3.1)
这个包是客户端向服务器发送一个结束连接的请求
第一,IP标识:01-08
第二,顺序编号:DD-0C-75-FD,响应编号:E7-CB-C1-41
第三,TCP标识:50-11,其中11转换为二进制:00010001,对应到各标识位:
URG-0
ACK-1 客户端接收到服务端的响应,继续要求服务器端确认;
PSH-0
RST-0
SYN-0
FIN-1 请求释放端点的连接
解析六(TCP-3.2)
服务器结束对话
第一,IP标志: 61-C7
第二,顺序编号:E7-CB-C1-41,响应编号DD-0C-75-FE
第三,TCP标志:50-10,中的10二进制为00010000,对应到各标志位:
URG-0
ACK-1 客户端接收到服务端的响应,继续要求服务器端确认;
PSH-0
RST-0
SYN-0
FIN-0
由于客户端发送断开请求,因此,该连接就被释放,分配的TCP协议栈也被收回,所以虽然服务器请求客户端继续应答,但服务器就不会再得到客户端的应答了。至此,一个完整的TCP应用也就结束了。
4、对这次实验的总结:
一个TCP的建立到双工通讯到结束,中间需要不断地握手,不断地请求对方响应。
(1)看一下这个过程中四个主要信息的变化:
客户端向服务器发送的三个数据包:
类型 IP标识位 顺序编号 确认编号 TCP标志位
c-s1 01-06 DD-0C-75-FC 00-00-00-00 SYN
c-s2 01-07 DD-0C-75-FD E7-CB-C1-00 ACK
c-s3 01-08 DD-0C-75-FD E7-CB-C1-41 ACK FIN
服务器端向客户端发送的三个数据包:
类型 IP标识位 顺序编号 确认编号 TCP标志位
s-c1 61-C5 E7-CB-C0-FF DD-0C-75-FD ACK SYN
s-c2 61-C6 E7-CB-C1-00 DD-0C-75-FD ACK PSH
s-c3 61-C7 E7-CB-C1-41 DD-0C-75-FE ACK
那这里的顺序编号和确认编号到底是个什么关系呢?TCP协议通过顺序编号和确认编号保持对所传输字节数的跟踪。在交换了每一个节点的初始顺序编号以后(客户端的是DD-0C-75-FC,服务端的是:E7-CB-C0-FF),客户端通过把所发送的字节数加到服务器的顺序编号上,并在确认编号中返回这一结果。
举例说明:顺序编号为E7-CB-C1-00节点(服务器端)发送了65(十六进制为41H)个字节的数据(s-c2),另一端(客户端)通过将已接收到的顺序编号加上字节数(E7-CB-C1-00+41H)作为确认字段返回发送端。该确认编号携带了上次该端收到的字节数信息。也就是讲,客户端返回给服务器端的确认编号是E7-CB-C1-41。
(2)三个有关问题的解答
现在来看一下关于在通讯过程中TCP是如何保证差错重发、减少来回应答次数以减少网络负载以及如何动态适应窗口大小变化的。
首先看第一个问题:
当服务器端接收到对方发来的数据后,却因为网络忙无法给客户及时响应。客户是否一直等待?
答:不等待。客户方维持一个计数器,默认初始值为200ms,如果在这个时间内无法获得服务器端响应,就认为数据没有到达,重新发送。发送时通过顺序号服务器端可以知道这个数据包是否曾经接收过,从而进行覆盖或追加处理。
再看第二个问题:
由于TCP是面向连接的,因此,客户每发送一个包,就要得到服务器的确认,那么在数据包相当多的情况下,这种一来一往会消耗掉网络的大量带宽。如何解决?
答:TCP采用了窗口技术来解决这个问题。窗口大小就是指规定每接收到客户端多少字节的数据就应答一次。当然该值越小应答次数越多。
最后看第三个问题:
当接收方因为各种原因动态改变了窗口的大小,势必会导致上一次传输操作与当前传输的一个衔接问题。那么TCP是如何解决这个衔接的呢?
答:发送方可以根据接收方返回的ACK重新调整发送顺号(seq),就可以解决两次传输的衔接问题。
tcp
最新推荐文章于 2024-10-03 21:54:17 发布

2466

被折叠的 条评论
为什么被折叠?



