2017.5.30 TCP协议(wireshark操作)
一.实验目的
掌握TCP协议的原理,深入理解TCP协议的连接管理、可靠传输机制、流量控制机制和拥塞机制。
二.实验内容
1.TCP协议基础
i. 传输层源地址结构
ii. 传输层目的地址结构
2.分析TCP连接管理的机制
。i. 建立连接机制
ii. 释放连接机制
iii. 连接过程中的异常处理
3.分析TCP可靠传输原理
i. 确认机制
ii. 重传机制
iii. 分析其传输模型
4.分析TCP的流量控制原理
i. 流量控制机制
ii. 零窗口处理机制
iii. 小窗口,傻瓜窗口问题
5.分析TCP的拥塞控制原理
三.实验过程和截图
1. TCP协议基础
实验之前,我了解了下TCP协议的定义及特点。
TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。
TCP的特点有:
○1TCP是面向连接的运输层协议
○2每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
○3 TCP提供可靠交付的服务
○4 TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
○5 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。
在wireshark中,封包详细信息为
Frame: 物理层的数据帧概况
Ethernet II: 数据链路层以太网帧头部信息
Internet Protocol Version 4: 互联网层IP包头部信息
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
本次实验是在机房用FTP上传一个文本文档作为例子。
- IP地址和端口号用来唯一的确定网络上数据的地址。
所以,每个TCP传输连接有两个端点,也就是有两个套接字,即“源IP地址和端口号”组合和“目的IP地址和端口号”组合,可表示为{socket1,socket2},或者{ (IP1,port1),(IP2,,port2) }。
TCP包的具体内容:
- 分析TCP连接管理的机制
i. TCP建立连接时,会有三次握手过程,如下图所示:
如下实例:
前三次为TCP的三次握手
第一次握手:SYN=1,Seq=0,ACK=0
第二次握手:SYN=1,ACK=1,Seq=0
第二次握手:SYN=0,ACK=1,Seq=1
ii.TCP释放连接时,会有四次挥手过程,如下图所示:
第一次挥手:
Fin=1,ACK=1,Seq为X=287,ack为Z=1244
第二次挥手:
ACK=1,Seq=Z=1244,ack=X+1=188
第三次挥手:
FIN=1,ACK=1,Seq=Y=1244,ack=X+1=288
第四次挥手:
ACK=1,Seq=X+1=288,ack=Y+1=1245
四次挥手后,连接被释放。
3.分析TCP可靠传输原理
i. 确认机制
确认号ACK会告诉发送端哪些数据段已经成功接收,并且确认号会向发送端指出接收端希望收到的下一个序列号。即,确实号ACK为上个数据序列号的下个数据序列号。
FTP报文段:此时序列号Seq=1133,下个序列号为1186
TCP确认报文:此时确认号ACK=1186,说明上个数据报已成功接收,并发送期望接收的下个数据报。
ii. 重传机制
当发送端在给定时间间隔内收不到那个数据段的应答时,发送端就会重传那个数据段。
情况1:网络延时/环路,数据段丢失
情况2:网络延时,数据段推迟到达
情况3:数据段成功到达,应答因为1.2不能达到。
TCP重传过程发送的第一个报文如下图:
包含561字节数据②,从112.253.38.113发送至172.18.27.27
在通常情况下,第一个报文发送之后很快会收到TCP ACK报文。然而,在这里,第二个是重传报文。可以在Packet list面板里看到,Info栏清楚的标明“TCP Retransmission”,报文以黑色背景红色字体标出。
比较两个报文的Packet Bytes,都为561bytes。
所以第二份为重传报文。
4.分析TCP流量控制原理
i. 流量控制机制
窗口数决定了当前传输的最大流量。当我们在传输过程中,通信双方可以根据网络条件动态协商窗口大小,调整窗口大小时,即可实现流量控制。(在TCP的每个确认中,除了ACK外,还包括一个窗口通知)。
TCP通过滑动窗口机制检测丢包,并在丢包发生时调整数据传输速率。滑动窗口机制利用数据接收端的接收窗口来控制数据流。
在网上搜资料发现一组不错的图能很好的解释窗口实现流量控制,如下是固定窗口大小的传输:
客户端向服务器发送数据,服务器接收窗口是5000字节。客户端发送了2500字节,服务器缓冲区还剩2500字节,之后又发送了2000字节,从而缓冲区只剩500字节。服务器发送确认信息。对缓存中数据进行处理并清空缓存。此过程重复进行,客户端又发送3000字节和1000字节,服务器缓存减少至1000字节,客户端再次确认数据并处理缓存中内容。
调整窗口大小:
当TCP堆 栈接收到数据的时候,生成一个确认信息并以回复的方式发送,但是放置在接收端缓存中的数据并不总是立即被处理。当服务器忙于处理从多个客户端接收的报文, 服务器很有可能因为清理缓存而变得缓慢,无法腾出空间接收新的数据,如果没有流控,则可能会造成丢包和数据损坏。好在,接收窗口所设定的速率无法使服务器 正常处理数据时,能够调整接收窗口大小。通过减小返回给发送端的ACK报文的TCP头窗口大小值来实现。如下图所示:
上图中,服务器初始窗口大小为5000字节。客户端发送2000字节,之后又发送了2000字节,缓冲区中只有1000字节可用。服务器意识到缓冲区正在快速填满,它知道如果数据继续以此速率传输,很快会有报文丢失。为了防止报文丢失,服务器发送确认信息给客户端,更新窗口大小为1000字节。结果,客户端减少数据发送,服务器以可以接受的速率处理缓存内容,即保持数据流以稳定的速率传输。
调整窗口大小在两个方向都是可行的。当服务器能够更加快速的处理报文时,它会发送一个较大窗口的ACK报文。
ii. 零窗口机制
某些情况下,服务器无法再处理从客户端发送的数据。可能是由于内存不足,处理能力不够,或其他原因。这可能会造成数据被丢弃以及传输暂停,但接收窗口能够帮助减小负面影响。
当上述情况发生时,服务器会发送窗口为0的报文。当客户端接收到此报文时,它会暂停所有数据传输,但会保持与服务器的连接以传输探测(keep-alive)报文。探测报文在客户端以稳定间隙发送,以查看服务器接收窗口状态。一旦服务器能够再次处理数据,将会返回非零值窗口大小,传输会恢复。
此时窗口大小变为0,
随后窗口大小变为59,
本次实验着重学习通过wireshark了解TCP传输数据报文的原理,并认识到TCP与UDP的不同与优势之处,TCP是一种面向连接的、可靠的基于字节流的传输层通信协议。通过实验,对TCP连接管理机制,其中的标志发生的变化有了更深的了解与印象。并学习了它的传输原理,什么情况下会重传报文,以及为什么要进行流量控制,掌握了流量控制的机制。通过实验,让我不只是对书本那样抽象的了解,总之这次实验令我收获颇丰。