EduCoder 计算机网络实验 传输层协议分析
第1关:TCP 包基础
任务描述
本关任务:了解 TCP 数据包结构及格式,以及其具体的含义。
相关知识
为了完成本关任务,你需要掌握:
- 理解并掌握 TCP 报文段标记的具体含义;
- 在 Wireshark 抓包软件中分析 TCP 报文。
TCP 首部格式
- 源端口( 16 位):通信发送方使用的端口号
- 目标端口( 16 位):通信接收方使用的端口号
- 序列号( 32 位):用来确保数据可靠传输的唯一值
- 确认号( 32 位):接收方在响应时发送的数值
- 数据偏移( 4 位):标志数据包开始的位置,TCP 头部的长度
- 标记( 12 位/ 6 位):
SYN:(同步)发起连接的数据包:同步SYN=1表示这是一个连接请求或连接接受报文。ACK:(确认)确认收到的数据包:只有当ACK=1时,确认号字段才有效;当ACK=0时,确认号无效。RST:(重置)之前尝试的连接被关闭,(信号差,信号拥挤):当RST=1时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。FIN:(结束)连接成功,传输完毕之后,连接正在断开:用来释放一个连接,FIN=1表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。PSH:(推送)数据包直接发送给应用,而不是缓存起来:接收 TCP 收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。URG:(紧急)数据包中承载的内容应该立即由 TCP 协议栈立即进行处理:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。CWR:(拥塞窗口减小)缓存区已满或者拥挤,通信双方都应该降低传输的速率。 - 窗口大小( 16 位):匹配缓存区的大小
- 校验和( 16 位):确认 TCP 数据段中的内容是否发送了变化
- 紧急指针( 16 位):明确显示数据之前的 16 进制序列号
其中,ACK 是可能与 SYN,FIN 等同时使用的,比如 SYN 和 ACK 可能同时为 1 ,它表示的就是建立连接之后的响应, 如果只是单个的一个 SYN ,它表示的只是建立连接。( TCP 的几次握手就是通过这样的 ACK 表现出来的), 但 SYN 与 FIN 是不会同时为 1 的,因为前者表示的是建立连接,而后者表示的是断开连接。RST 一般是在 FIN 之后才会出现为 1 的情况,表示的是连接重置。一般地,当出现 FIN 包或 RST 包时,我们便认为客户端与服务器端断开了连接;而当出现 SYN 和 SYN+ACK 包时,我们认为客户端与服务器建立了一个连接。
捕获从计算机到远程服务器的批量 TCP 传输
我们需要使用 Wireshark 来获取文件从计算机到远程服务器的 TCP 传输的数据包内容。首先访问一个网页,在网页上输入计算机上存储的文件名(包含 Alice in Wonderland 的 ASCII 文本),然后使用 HTTP POST 方法将文件传输到 Web 服务器(不使用 GET 方法的原因是我们希望大量数据从您的计算机传输到另一台计算机)。而在此同时,要运行 Wireshark 以获取从您的计算机发送和接收的 TCP 区段的内容。
- 打开浏览器,在
http://gaia.cs.umass.edu/wireshark-labs/alice.txt查看 Alice in Wonderland 的 ASCII 档案文件,将其保存; - 浏览
http://gaia.cs.umass.edu/wireshark-labs/TCP-wireshark-file1.html,能得到以下内容;
- 在此表单的”Browse…”按钮在计算机上输入包含 Alice in Wonderland 的文件名(完整路径名)。这时不用按下”Upload alice.txt file”按钮;
- 启动 Wireshark ,开始捕获,在 Wireshark 数据包捕获选项视窗上按 OK;
- 返回浏览器,按”Upload alice.txt file”将按钮文件上传到
gaia.cs.umass.edu服务器。文件上传后,浏览器窗口显示一条简短的祝贺消息; - 停止 Wireshark 数据包捕获,Wireshark 显示内容。
抓包软件中的 TCP 分析
展开 Flags 的头,得到的信息如下:
由此我们可以得到具体的 TCP 报文信息。
使用git将本地文件推送到远程仓库永久保存
评测通关后,需要推送文件到远程仓库,请在评测通关后,执行以下操作:
-
在桌面空白处点击鼠标右键,点击“在此打开终端”,通过代码
cd /data/workspace/myshixun/,进入到实训代码仓库; -
执行 git 命令:
git pull --unshallow origin mastergit add .git commit -m "Fisrt commit"git push origin master
“Fisrt commit”相当于备注,可以是其它内容。这里需要输入 educoder 的用户名和密码,用户名输入 educoder 平台的登录用户名、手机号或者邮箱,密码输入 educoder 平台的登录密码,按照提示输入即可。
注意:密码输入过程中 Shell 窗口并不会显示输入的字符,正常输入后回车即可,注意不能使用退格键。
操作要求
双击打开桌面上的工作区文件夹”workspace”,再打开实训文件夹”myshixun”,将查询的信息保存到文件message-1.txt。具体要求如下: (1)打开 Wireshark ,加载实训文件夹中的tcp-ethereal-trace-1文件,并筛选出其中的”TCP”报文; (2)展开TCP分组,查看本机使用的 IP 地址和 TCP 端口号是什么,填写到文件中; (3)gaia.cs.umass.edu(目标网站)的 IP 地址和 TCP 端口号是什么,填写到文件中。 (4)保存文件并使用 git 将文件 message-1.txt 推送到远程仓库,此步骤不影响评测。

第2关:三次握手
任务描述
本关任务:分析 TCP 的三次握手的具体过程。
相关知识
为了完成本关任务,你需要掌握:
- 了解三次握手协议的内容;
- 在 Wireshark 中抓取 TCP 数据包。
三次握手建立连接
- 第一次握手:客户端将标志位 SYN 置为 1 ,随机产生一个值
SEQ = X,并将该数据包发送给服务器,客户机进入 SYN_SENT 状态,等待服务器确认; - 第二次握手:服务器收到数据包后由标志位
SYN = 1,知道客户端请求建立连接,服务器将标志位 SYN 和 ACK 都置为 1 ,ACK = X + 1,随机产生一个值SEQ = Y,并将该数据包发送给客户端以确认连接请求,服务器进入 SYN_RCVD 状态; - 第三次握手:客户端收到确认后,检查 ACK 是否为
X + 1,ACK 是否为 1 ,如果正确则将标志位 ACK 置为 1 ,ACK = Y + 1,并将该数据包发送给服务器,服务器检查 ACK 是否为K + 1,ACK 是否为 1 ,如果正确则连接建立成功,客户端和服务器进入 ESTABLISHED 状态。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
TCP 的三次握手在 Wireshark 中分析
打开 Wireshark 抓包软件,开始抓包,打开浏览器输入www.baidu.com,进入网页。停止抓包,在过滤窗口输入TCP。 由下图可知,先进行了 TCP 三次传输,然后才开始 HTTP 传输。
第一次握手:客户端发送 SYN 报文到服务器;
第二次握手:服务器接收到客户端的 SYN 报文,回复 SYN + ACK 报文;
第三次握手:客户端接收到服务端的 SYN + ACK 报文后,回复 ACK 报文。
四次握手断开连接
第一次握手:主动关闭方发送一个 FIN ,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在 FIN 包之前发送出去的数据,如果没有收到对应的 ACK 确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。第二次握手:被动关闭方收到 FIN 包后,发送一个 ACK 给对方,确认序号为收到序号 + 1 (与 SYN 相同,一个 FIN 占用一个序号)。第三次握手:被动关闭方发送一个 FIN ,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。第四次握手:主动关闭方收到 FIN 后,发送一个 ACK 给被动关闭方,确认序号为收到序号 + 1 ,至此,完成四次挥手。
四次握手的过程:
使用git将本地文件推送到远程仓库永久保存
评测通关后,需要推送文件到远程仓库,请在评测通关后,执行以下操作:
-
在桌面空白处点击鼠标右键,点击“在此打开终端”,通过代码
cd /data/workspace/myshixun/,进入到实训代码仓库; -
执行 git 命令:
git add .git commit -m "Fisrt commit"git push origin master
“Fisrt commit”相当于备注,可以是其它内容。这里需要输入 educoder 的用户名和密码,用户名输入 educoder 平台的登录用户名、手机号或者邮箱,密码输入 educoder 平台的登录密码,按照提示输入即可。
注意:密码输入过程中 Shell 窗口并不会显示输入的字符,正常输入后回车即可,注意不能使用退格键。
操作要求
双击打开桌面上的工作区文件夹”workspace”,再打开实训文件夹”myshixun”,并打开其中的文件message-2.txt,将查询的信息保存到文件message-2.txt。具体要求如下: (1)打开文件夹中tcp-ethereal-trace-1文件; (2)打开编辑 ( edit ) ->首选项 ( preferences )-> Protocols -> TCP ,取消勾选 Relative sequence numbers(相对序列号); (3)第一次握手时, TCP SYN 区段的序列号( SEQ )是什么,填写到 txt 文件中; (4)由三次握手协议,客户端首次回复中,ACK=SEQ+1,根据(3)中的 SEQ 号,用tcp.ack==SEQ+1(具体数字)命令筛选出相应数据报,查看gaia.cs.umass.edu 发送给客户端计算机回复的 SYN 的序列号( SEQ )是多少,填写到 txt 文件中; (5)保存文件并使用 git 将文件 message-2.txt 推送到远程仓库,此步骤不影响评测。

第3关:拥塞控制
任务描述
本关任务:了解拥塞控制,掌握重传机制。
相关知识
为了完成本关任务,你需要掌握:
- 了解拥塞控制;
- 在 Wireshark 中抓取 TCP 数据包。
什么是拥塞
拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。这种现象跟公路网中经常所见的交通拥挤一样,当节假日公路网中车辆大量增加时,各种走向的车流相互干扰,使每辆车到达目的地的时间都相对增加(即延迟增加),甚至有时在某段公路上车辆因堵塞而无法开动(即发生局部死锁)。
造成拥塞的原因
-
多条流入线路有分组到达,并需要同一输出线路,此时,如果路由器没有足够的内存来存放所有这些分组,那么有的分组就会丢失;
-
路由器的慢带处理器的缘故,以至于难以完成必要的处理工作,如缓冲区排队、更新路由表等。
防止拥塞的方法
-
在传输层可采用重传策略、乱序缓存策略、确认策略、流控制策略和确定超时策略;
-
在网络层可采用子网内部的虚电路与数据报策略、分组排队和服务策略、分组丢弃策略、路由算法和分组生存管理;
-
在数据链路层可采用重传策略、乱序缓存策略、确认策略和流控制策略。
使用git将本地文件推送到远程仓库永久保存
评测通关后,需要推送文件到远程仓库,请在评测通关后,执行以下操作:
-
在桌面空白处点击鼠标右键,点击“在此打开终端”,通过代码
cd /data/workspace/myshixun/,进入到实训代码仓库; -
执行 git 命令:
git add .git commit -m "Fisrt commit"git push origin master
“Fisrt commit”相当于备注,可以是其它内容。这里需要输入 educoder 的用户名和密码,用户名输入 educoder 平台的登录用户名、手机号或者邮箱,密码输入 educoder 平台的登录密码,按照提示输入即可。
注意:密码输入过程中 Shell 窗口并不会显示输入的字符,正常输入后回车即可,注意不能使用退格键。
操作要求
双击打开桌面上的工作区文件夹”workspace”,再打开实训文件夹”myshixun”,并打开其中的文件message-3.txt,。然后进行如下操作: (1)打开 Wireshark,加载实训文件夹中的tcp-ethereal-trace-1文件; (2)使用命令ip.dst==128.119.245.12进行筛选; (3)选中一条数据报,点击统计( Statistic s)-> TCP 流图形->时间序列( Stevens ),观察图形。判断此文件中是否有重传的区段(序列号一直增大则无,反之则有),填写到 txt 文件中; (4)使用 http 命令筛选数据报,查看数据传输大小以及使用时间,计算 TCP 链接的吞吐量(kb/s、结果保留整数),填写到 txt 文件中。
注:{吞吐量=数据传输大小/所用时间}。 (5)保存文件并使用 git 将文件
message-3.txt推送到远程仓库,此步骤不影响评测。
数据大小:
所用时间:

第4关:UDP 包分析
任务描述
本关任务:能够掌握简单的 UDP 包分析。
相关知识
为了更好掌握本章内容,你需要了解的有:
- UDP 报文的简介;
- UDP 报文格式;
- Wireshark 软件中的 UDP 抓包分析。
UDP 简介
UDP(User Datagram Protocol),用户数据报协议,是 OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP 协议与 TCP 协议一样用于处理数据包,在 OSI 模型中,两者都位于传输层,处于 IP 协议的上一层。UDP 有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
许多应用只支持 UDP ,它不产生任何额外的数据,即使知道有破坏的包也不进行重发。当强调传输性能而不是传输的完整性时,如音频和多媒体应用,UDP 是最好的选择。数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP 也是一个好的选择。
UDP 报文格式
UDP 首部有 8 个字节,由 4 个字段构成,每个字段都是两个字节:
- 源端口: 源端口号,需要对方回信时选用,不需要时全部置 0 ;
- 目的端口:目的端口号,在终点交付报文的时候需要用到;
注:端口是用来指明数据的来源(应用程序)以及数据发往的目的地(同样是应用程序)。字段包含了 16 比特的 UDP 协议端口号,它使得多个应用程序可以多路复用同一个传输层协议及 UDP 协议,仅通过端口号来区分不同的应用程序。
- 长度:UDP 的数据报的长度(包括首部和数据)其最小值为 8(只有首部)。字段记录了该 UDP 数据包的总长度(以字节为单位),包括 8 字节的 UDP 头和其后的数据部分。最小值是 8(报文头的长度),最大值为 65535 字节;
- 校验和:检测 UDP 数据报在传输中是否有错,有错则丢弃。它的值是通过计算 UDP 数据报及一个伪包头而得到的。校验和的计算方法与通用的一样,都是累加求和。
UDP 校验和的计算
原理
对发送方的 UDP 报文段的所有 16 比特字的和进行反码运算,当求和遇见溢出的时候,进行回卷(回卷的补充在下面),得到的结果放在 UDP 报文段中的检验和字段。 ######UDP 校验的所需信息 (1)UDP 伪首部:源 IP + 目的 IP + Byte 0 + Byte17 + UDP 长度,目的是让 UDP 两次检查数据是否以及正确到达目的地,只是单纯为了做校验用; (2)UDP 首部:该长度不是报文的总长度,而是 UDP(包括 UDP 头和数据部分)的总长度; (3)UDP 的数据部分。 ######计算步骤 (1)把伪首部添加到 UDP 上; (2)计算初始时将校验和字段添零; (3)把所有位划分为 16 位( 2 字节)的字; (4)把所有 16 位的字相加,如果遇到进位,则将高于 16 字节的进位部分的值加到最低位上; (5)将所有字相加得到的结果应该为一个 16 位的数,将该数按位取反则可以得到校验和。
在计算校验和的时候,需要在 UDP 数据报之前增加 12 字节的伪首部,伪首部并不是 UDP 真正的首部。只是在计算校验和,临时添加在 UDP 数据报的前面,得到一个临时的 UDP 数据报。校验和就是按照这个临时的 UDP 数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了 UDP 数据报,又对 IP 数据报的源 IP 地址和目的 IP 地址进行了检验。
Wireshark 中 UDP 抓包分析
打开 Wireshark 抓包软件,开始抓包。停止抓包后在过滤窗口输入 UDP 进行过滤操作。
无论多大包,从 UDP 协议这一层级来说,并没有分为多个 UDP 包。在试验中,当包的长度达到 10153 时,接收端根本无法接收到发送的包(发送方并不能得到是否接收成功的消息)。
UDP 与 TCP 对比
UDP 和 TCP 协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP 协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息。发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与 TCP 不同,UDP 协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把 UDP 协议称为不可靠的传输协议。
TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务,TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;UDP具有较好的实时性,工作效率较TCP协议高;UDP段结构比TCP的段结构简单,因此网络开销也小;TCP协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用TCP传输数据。
使用git将本地文件推送到远程仓库永久保存
评测通关后,需要推送文件到远程仓库,请在评测通关后,执行以下操作:
-
在桌面空白处点击鼠标右键,点击“在此打开终端”,通过代码
cd /data/workspace/myshixun/,进入到实训代码仓库; -
执行 git 命令:
git add .git commit -m "Fisrt commit"git push origin master
“Fisrt commit”相当于备注,可以是其它内容。这里需要输入 educoder 的用户名和密码,用户名输入 educoder 平台的登录用户名、手机号或者邮箱,密码输入 educoder 平台的登录密码,按照提示输入即可。
注意:密码输入过程中 Shell 窗口并不会显示输入的字符,正常输入后回车即可,注意不能使用退格键。
操作要求
双击打开桌面上的工作区文件夹”workspace”,再打开实训文件夹”myshixun”,并打开其中的文件message-4.txt,将查询的信息保存到文件message-4.txt。具体要求如下: (1)打开 Wireshark,加载实训文件夹中的http-ethereal-trace-5文件,筛选 UDP 数据包; (2)从跟踪中选择一个 UDP 数据包。打开该数据包,查看 UDP 标头中的四个字段的名称,并将这四个字段的名称写入 txt 文件(用“;”分隔); (3)UDP 标头的四个字段总共有多少字节,将信息写入 txt 文件; (4)从 IPV4(Internet Protocol Version4)中找到 UDP 的协议号是多少,将信息写入 txt 文件; (5)保存文件并使用 git 将文件 message-4.txt 推送到远程仓库,此步骤不影响评测。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)