TCP 数据包及连接建立过程分析-计算机网络
一、 实验目的
1.1 学习并分析 TCP 数据包的结构、含义
1.2 分析 TCP 连接的建立过程和数据传输过程。
二、 实验环境
2.1 Wireshark 网络分析软件
2.2 实验文件“计算机网络实验.cap”
三、 实验内容
3.1 TCP 数据包的结构和含义分析
打开文件“计算机网络实验.cap”,这是一个包括 204 个分组的网络通信记录,详细记录了分组的序号、相对时间、源地址、目标地址、协议类型、内容,如图 1 是对第 29 个分组的详细信息。

观察文件内第 29 个分组的 TCP 数据包详细信息,见图 1。
l 它的前 16 位是 1668,表示源端口是 1668,是客户端的一般端口,(本机是客户端)
l 它的目的端口是 0050(H)=8080,表明是访问服务器端的 HTTP 应用。
l 当前发送的数据首字节是 0(相对值),表示为首发字节。它携带的数据包长度是 0 字节,64(IP 包全长,见 IP 包头的长度字段值)-20(IP 首部长度)-44(TCP 首部长度)=0 字节,该 TCP 数据包未携带数据。
l 确认号字段为 0,结合后面的 ACK=0,表明未携带确认信息。
l TCP 首部的固定长度部分是 20 字节; b002(H)=1011 0000 0000 0010 (B),其中表示 TCP
首部长度长度.是前 4 位,即 1011(B)=11,以 4 个字节为 1 个单位,因此该 TCP 首部总长度是 11×4 字节=44 字节,其中包含选项字段 24 字节。
l 同步比特 SYN=1,表明它是一个 TCP 连接相关的数据包
l 其它:ACK =0,确认比特 ACK —— 只有当 ACK =1时确认号字段才有效。当 ACK
=0 时,确认号无效。
l 推送比特 PSH (PuSH) —— 接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
l 窗口字段大小 524280 字节,当前可以接收对方发送 524280 字节。
l 校验和=a4ff,正确。
l 紧急指针字段=0,因为紧急 URG=0
l 头部选项字段:给出了最大报文段长度 MMX=1460 字节,注意 MAC 帧携带的数据范围是 46-1500 字节,1500-20(IP 头长)-20(TCP 长)=1460。
观察文件内第 34 个分组的 TCP 数据包详细信息,见图 2。

l 它的源端口是 0050(H)=80,是服务器端的 HTTP 应用服务。
l 它的目的端口是 1668,是客户端的一般端口号。
l 当前发送的数据首字节是 1449(相对值)。它携带的数据包长度是 357 字节,409(IP包全长,见 IP 包头的长度字段值)-20(IP 首部长度)-32(TCP 首部长度)=357字节,该 TCP 数据包携带 357 字节数据,因此下一个 TCP 数据包携带数据的首字节是1449+357=1806。
l 确认号字段为 875,结合后面的 ACK =1,表明已经正确接收对方发送的 875 字节前的
数据。
l TCP 首部长度;8018(H)=1000 0000 0001 1000 (B),其中表示 TCP 首部长度长度是前
4 位,即 1000(B)=8,因此该 TCP 首部长度是 8×4 字节=32 字节,包含选项字段 12
字节。
l 同步比特 SYN=0,表明它不是一个 TCP 连接相关的数据包
l 确认比特 ACK=1 ,确认号字段才有效。当 ACK =0 时,确认号无效。
l 推送比特 PSH (PuSH)=1,接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
l 窗口字段大小 64661 字节,当前可以接收对方发送 64661 字节。
l 校验和=d169,正确。
l 紧急指针字段=0,因为紧急 URG=0
l 头部选项字段:给出了时间戳 Time stamp。
数据被分片,1805 字节的数据被分为第 33 个分组的 1448 字节和第 34 个分组的 357 字
节.
4.2 TCP 连接的建立和释放过程
选择“flow graph” 观察 TCP 连接的建立过程。



客户端进程(IP 地址:219.222.170.14,端口 1668)与服务器端进程(IP 地址:172.30.0.19端口 80)建立连接的 3 次握手过程,对应的分别是第 29、30、31 数据分组。它们分别完成的是:
第 29 数据分组:客户端 的 TCP(SYN=8a42cdc9,这是客户端为了防范某些安全性攻击而选择的起始序号,相对序号是 1)向服务器端发出连接请求报文段;注意该分组的Option 字段内容,给出了 MSS=1460 字节,Sack Permitted 等协商内容。该连接请求报文不携带数据(Len=0),但消耗一个序号。为了防止 TCP syn攻击,该分组选择的初始化序号是8a42cdc9,当然相对序号是 1。
第 30 数据分组:服务器端 的 TCP 收到连接请求报文段后,同意,发回确认(确认报文段中将 SYN 置为 1,ACK=1);注意该分组的 Option 字段内容,给出了 MSS=1460 字节. 该连接请求确认报文不携带数据(Len=0),但消耗一个序号。同时初始窗口值为 32768字节。为了防止 TCP syn 攻击,该分组选择的初始化序号是 27f5bf03,当然相对序号是 1, 对29 数据分组的确认是 8a42cdca(8a42cdc9+1).
第 31 数据分组:客户端收到此报文段后,向服务器端 给出确认(ACK=1)。连接建立完成。
客户端进程(IP 地址:219.222.170.14,端口 1669)与服务器端进程(IP 地址:172.30.0.19端口 80)释放连接的过程,对应的分别是第 47、48、49、50 数据分组。它们分别完成的是:
第 47 数据分组:219.222.170.14 端 的 TCP(FIN 置为 1)向 172.30.0.19 端发出连接释放请求报文段,该释放请求报文未携带数据(Len=0),但消耗一个序号。
第 48 数据分组:服务器端的 TCP 收到连接释放请求报文段后,发回确认(确认报文段中将 ACK 置为 1);窗口值为 64167 字节;注意该分组的 Option 字段内容,时间戳 Timestamp。
第 49 数据分组:172.30.0.19 端也不再需要发送数据,发出连接释放请求报文段(FIN置为 1),未携带数据(Len=0)。
第 50 数据分组:收到第 49 数据分组后,219.222.170.14 端发出确认(ACK=1)。
至此,连接释放的协商过程完毕,收到第 50 数据分组后,172.30.0.19 会释放与219.222.170.14 端 1669 的连接;219.222.170.14 端在 2MSL 后,释放连接。
四、 实验问题
问题一:什么是 TCP 协议?TCP 数据包的结构和含义是怎样的?
答:
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP数据包结构:

1-1.源始端口16位,范围是0-65535。
1-2.目的端口,同上。
2-1.数据序号32位,TCP为发送的每个字节都编一个号码,这里存储当前数据包数据第一个字节的序号。
3-1.确认序号32位,为了安全,TCP告诉接受者希望他下次接到数据包的第一个字节的序号。
4-1.偏移4位,类似IP,表明数据距包头有多少个32位。
4-2.保留6位,未使用,应置零。
4-3.紧急比特URG—当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
4-3.确认比特ACK—只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
4-4.复位比特RST(Reset) —当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
4-5.同步比特SYN—同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。
4-6.终止比特FIN(FINal)—用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
4-7.窗口字段16位,窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
5-1.包校验和16位,包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
5-2.紧急指针16位,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
6-1.可选选项24位,类似IP,是可选选项。
6-2.填充8位,使选项凑足32位。
7-1.用户数据
问题二: TCP 协议建立连接的过程是怎样的?
答:
如图:初始时候,客户端和服务端都处于CLOSED(关闭)状态。当客户端需要给服务端发送数据包的时候,客户端主动打开连接。这个时候应该是通知了服务端,让服务端也打开连接,所以服务端是被动打开连接。打开连接之后,分别开始创建传输控制模块TCB,接着服务端进入LISTEN(监听)状态,等待客户端的连接请求。客户端也开始准备连接请求数据包,开始发送。客户端发送的第一个数据包是一个连接请求报文段,这个报文的内容如图,是一个同步位SYN=1,另一个是一个初始序号seq=x。TCP规定,SYN=1的报文段不能携带数据,但是消耗一个序列号。客户端发送了这个报文之后,进入SYN-SENT(同步已发送)状态。
服务端己收到这个数据包之后,知道有客户端请求连接。如果当前有资源,可以同意连接,则给客户端发送确认报文。这个确认报文的内容有:SYN=1(没有变化),seq=y(变成了服务端的序列号),新增ACK=1,ack=x+1(客户端序列号+1)。这里SYN=1,所以报文不能携带数据,同样消耗了服务端的一个序列号。然后服务端进入了SYN-RCVD(同步收到)状态。
客户端收到服务端的确认报文之后,还需要给客户端发送一个客户端的确认报文。这个报文的内容是ACK=1,seq=x+1,ack=y+1。这里没有了SYN这个字段,所以这个报文可以携带数据。这个客户端确认报文发送出去之后,客户端进入ESTABLISHED(已建立连接)状态。
服务端接收到这个数据包之后,也进入了ESTABLISHED(已建立连接)状态。
上面的三个过程就是TCP建立连接的三次握手。
问题三:根据文件“计算机网络实验.cap”,参照实验 3.1 回答以下问题:
1.分析第 44 个分组 TCP 数据包的结构和含义?
答:
l 它的源端口是 0685(H)=1669,是客户端的一般端口号。
l 它的目的端口是 80,是服务器端的 HTTP 应用服务。
l 当前发送的数据首字节是 769(相对值)。它携带的数据包长度是 600字节,652(IP包全长,见 IP 包头的长度字段值)-20(IP 首部长度)-32(TCP 首部长度)=600字节,该 TCP 数据包携带 600字节数据,因此下一个 TCP 数据包携带数据的首字节是769+600=1369。
l 确认号字段为 1,结合后面的 ACK =1,表明已经正确接收对方发送的首字节的数据。
l TCP 首部长度:0800(H)=0000 1000 0000 0000(B),其中表示 TCP 首部长度长度是前4位,即 1000(B)=8,因此该 TCP 首部长度是 8×4 字节=32 字节,包含选项字段12字节。
l 同步比特 SYN=0,表明它不是一个 TCP 连接相关的数据包。
l 确认比特 ACK=1 ,确认号字段才有效。当 ACK =0 时,确认号无效。
l 推送比特 PSH (PuSH)=1,接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
l 窗口字段大小 32850 字节,当前可以接收对方发送32850字节。
l 校验和=64f6,正确。
l 紧急指针字段=0,因为紧急 URG=0
l 头部选项字段:给出了时间戳 Time stamp。
数据被分片,1368 字节的数据被分为第 43 个分组的 768 字节和第 44 个分组的 600 字节.
2.分析第 127 个分组 TCP 数据包的结构和含义?
答:
l 它的源端口是 0050(H)=80,是服务器端的 HTTP 应用服务。
l 它的目的端口是 1655,是客户端的一般端口号。
l 当前发送的数据首字节是 1(相对值)。它携带的数据包长度是 0 字节,52(IP包全长,见 IP 包头的长度字段值)-20(IP 首部长度)-32(TCP 首部长度)=0字节,因此该 TCP 数据包未携带数据。
l 确认号字段为 1,结合后面的 ACK=1,表明已经正确接收对方发送的首字节的数据。
l TCP 首部长度8×4 字节=32 字节,包含选项字段 12 字节。
l 同步比特 SYN=0,表明它不是一个 TCP 连接相关的数据包
l 确认比特 ACK=1 ,确认号字段才有效。当 ACK =0 时,确认号无效。
l 推送比特 PSH (PuSH)=0,接收 TCP 等到整个缓存都填满了后再向上交付。
l 窗口字段大小 64917 字节,当前可以接收对方发送 64917 字节。
l 校验和=3dda,未验证。
l 紧急指针字段=0,因为紧急 URG=0
l 头部选项字段:给出了时间戳 Time stamp,显示重传时间。
3.分析第 75 个分组 TCP 数据包的结构和含义?
答:
l 它的源端口是 0050(H)=80,是服务器端的 HTTP 应用服务。
l 它的目的端口是 1672,是客户端的一般端口号。
l 当前发送的数据首字节是 1(相对值)。它携带的数据包长度是 0 字节,52(IP包全长,见 IP 包头的长度字段值)-20(IP 首部长度)-32(TCP 首部长度)=0字节,该 TCP 数据包携带 0 字节数据,因此该 TCP 数据包未携带数据。
l 确认号字段为 619,结合后面的 ACK =1,表明已经正确接收对方发送的 619 字节前的数据。
l TCP 首部长度: 8×4 字节=32 字节,包含选项字段 12字节。
l 同步比特 SYN=0,表明它不是一个 TCP 连接相关的数据包
l 确认比特 ACK=1 ,确认号字段才有效。当 ACK =0 时,确认号无效。
l 推送比特 PSH (PuSH)=0,接收 TCP 等到整个缓存都填满了后再向上交付。
l 窗口字段大小 64917 字节,当前可以接收对方发送 64917 字节。
l 校验和=da9c,未验证。
l 紧急指针字段=0,因为紧急 URG=0
l 头部选项字段:给出了时间戳 Time stamp。
问题四:根据文件“计算机网络实验.cap”,参照实验 3.2 回答以下问题:
1. 219.222.170.14 端进程(端口 1672)与服务器端进程(端口 80)建立连接的 3 次握手过
程?该服务器的 IP 地址是?
答:
客户端进程(IP 地址:219.222.170.14,端口 1672)与服务器端进程(IP 地址:172.30.0.19
端口 80)建立连接的 3 次握手过程,对应的分别是第 70、71、72 数据分组。它们分别完成的是:
第 70 数据分组:客户端的TCP(SYN=68f7ed0c,这是客户端为了防范某些安全性攻击而选择的起始序号,相对序号是 1)向服务器端发出连接请求报文段;注意该分组的Option 字段内容,给出了 MSS=1460 字节,Sack Permitted 等协商内容。该连接请求报文不携带数据(Len=0),但消耗一个序号。为了防止 TCP syn 攻击,该分组选择的初始化序号是 68f7ed0c,当然相对序号是 1。
第 71 数据分组:服务器端 的 TCP 收到连接请求报文段后,同意,发回确认(确认报文段中将 SYN 置为 1,ACK=1);注意该分组的 Option 字段内容,给出了 MSS=1460 字节. 该连接请求确认报文不携带数据(Len=0),但消耗一个序号。同时初始窗口值为 32768字节。为了防止 TCP syn 攻击,该分组选择的初始化序号是 36b4fc4e,当然相对序号是 1, 对29 数据分组的确认是 68f7ed0d(68f7ed0c+1).
第 72 数据分组:客户端收到此报文段后,向服务器端给出确认(ACK=1)。连接建立完成。
该服务器的 IP 地址是172.30.0.19。