《计算机网络基础》课程报告
基于 Wireshark 的 TCP 和 UDP 报文分析
院系:
班级:
学号:
姓名:
教师:
1
2012 年 11 月 4 日
目 录
一 TCP 连接时的三次握手··································3
二 TCP 连接释放时的四次握手······························5
三 UDP 报文分析··········································7
3.1 UDP 报文结构······································7
3.2 UDP 检验和的计算·································7
四 结束语···············································9
2
一、TCP 连接时的三次握手
TCP 协议为终端设备提供了面向连接的、可靠的网络服务。TCP 在交换数据
报文段之前要在发送方和接收方之间建立连接。客户是连接的发起者,服务器是
被动打开和客户进行联系。具体的过程如下所述。
第一次握手:客户发送 SYN=1,seq=0 的 TCP 报文给服务器
Ps:客户的 TCP 向服务器发出连接请求报文段,其首部中的同步位 SYN = 1。
序号 seq = 0,表明报文中未携带数据。
报文如下:
源 端口号:56644(56644)
目的端口号:http(80)
[Stream index: 0]
Sequence number: 0
Header length: 32 bytes
Flags: 0x02 (SYN)
(relative sequence number)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...0 .... = Acknowledgement: Not set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..1. = Syn: Set
.... .... ...0 = Fin: Not set
Window size: 8192
Checksum: 0x1030 [validation disabled]
Options: (12 bytes)
第二次握手:服务器发送 SYN=1,ACK=1,seq=0 的 TCP 报文给客户
Ps:服务器的 TCP 收到客户发来的连接请求报文段后,如同意,则发回确认。
服务器在确认报文段中应使 SYN = 1,使 ACK = 1。序号 seq = 0,表明报文中
未携带数据。
报文如下:
源 端口号:http(80)
目的端口号:56644(56644)
[Stream index: 0]
Sequence number: 0
Acknowledgement number: 1
(relative sequence number)
(relative ack number)
3
Header length: 32 bytes
Flags: 0x12 (SYN, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgement: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..1. = Syn: Set
.... .... ...0 = Fin: Not set
Window size: 5840
Checksum: 0x54f6 [validation disabled]
Options: (12 bytes)
第三次握手:客户发送 ACK=1 的 TCP 报文给服务器
Ps:客户收到报文段后向服务器给出确认,其 ACK = 1。客户的 TCP 通知上
层应用进程,连接已经建立。服务器的 TCP 收到主机客户的确认后,也通知其
上层应用进程,TCP 连接已经建立。
报文如下:
源 端口号:56644(56644)
目的端口号:http(80)
[Stream index: 0]
Sequence number: 1
Acknowledgement number: 1
Header length: 20 bytes
Flags: 0x10 (ACK)
(relative sequence number)
(relative ack number)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgement: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
Window size: 65928 (scaled)
Checksum: 0x1024 [validation disabled]
4
二、TCP 连接释放时的四次握手
数据传输结束后,通信的双方都可释放连接。客户应用进程先向其 TCP 发出连
接释放报文段,并停止再发送数据,主动关闭 TCP 连接。接下来服务器半关闭
连接,最后等待结束后释放连接资源。具体过程如下所述
第一次握手:客户发送 FIN=1,seq=u 的 TCP 报文给服务器
Ps:客户把 TCP 连接释放报文段首部的 FIN = 1,等待服务器的确认。
报文如下:
源 端口号:56644(56644)
目的端口号:http(80)
[Stream index: 0]
Sequence number: 1
Acknowledgement number: 1
Header length: 20 bytes
Flags: 0x11 (FIN, ACK)
(relative sequence number)
(relative ack number)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgement: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...1 = Fin: Set
Window size: 65928 (scaled)
Checksum: 0x1024 [validation disabled]
第二次握手:服务器发送 ACK=1,Acknowledgement number=u+1 的 TCP 报文给
客户
Ps:服务器发出确认,确认号 Acknowledgement number = u +1。TCP 服务器
进程通知高层应用进程。从客户到服务器这个方向的连接就释放了,TCP 连接
处于半关闭状态。服务器若发送数据,客户仍要接收。
第三次握手:服务器发送 FIN=1,ACK=1,seq=w,Acknowledgement number=u+1
的 TCP 报文给客户
Ps:若服务器已经没有要向客户发送的数据,其应用进程就通知 TCP 释放连
接。
事实上,第二次握手和第三次握手常常整合体现在同一服务器向客户发送的
TCP 报文中。
报文如下:
5
源 端口号:http(80)
目的端口号:56644(56644)
[Stream index: 0]
Sequence number: 1
Acknowledgement number: 2
Header length: 20 bytes
Flags: 0x11 (FIN, ACK)
(relative sequence number)
(relative ack number)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgement: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...1 = Fin: Set
Window size: 6144 (scaled)
Checksum: 0xac93 [validation disabled]
[SEQ/ACK analysis]
第四次握手:客户发送 ACK=1,seq=u+1,Acknowledgement number=w+1 的 TCP
报文给服务器
Ps:客户收到连接释放报文段后,必须发出确认。在确认报文段中 ACK = 1,
确认号 Acknowledgement number =w +1。自己的序号 seq = u + 1。 随之服务器
TCP 关闭,而客户进入 timed wait,等时间到后连接关闭。
报文如下:
源 端口号:56644(56644)
目的端口号:http(80)
[Stream index: 0]
Sequence number: 2
Acknowledgement number: 2
Header length: 20 bytes
Flags: 0x10 (ACK)
(relative sequence number)
(relative ack number)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgement: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
6
.... .... ...0 = Fin: Not set
Window size: 65928 (scaled)
Checksum: 0x1024 [validation disabled]
[SEQ/ACK analysis]
三、UDP 报文分析
3.1 UDP 报文结构
UDP 报头定长为 8B。按顺序为:
源端口号:关于端口号有一些规定,服务器端通常用熟知端口号,通常在
0-1023 之间。而客户端用随机的端口号,其范围在 49152 到 65535 之间。
目的端口号
长度:包括报头和数据的长度之和。在[8,65535]区间。
检验和:提供差错检测功能
3.2 UDP 检验和的计算
3.2.1 UDP 的检验和所需信息
1 UDP 伪首部:源 IP + 目的 IP + Byte 0 + Byte 17+ UDP 长度,其目的是
让 UDP 两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。
2 UDP 首部:该长度不是报文的总长度,而只是 UDP(包括 UDP 头和数
据部分)的总长度
3 UDP 的数据部分
3.2.2 检验和的计算步骤:
1 把伪首部添加到 UDP 上;
2 计算初始时将检验和字段添零的;
3 把所有位划分为 16 位(2 字节)的字
4 把所有 16 位的字相加,如果遇到进位,则将高于 16 字节的进位部分的
值加到最低位上。
5 将所有字相加得到的结果应该为一个 16 位的数,将该数按位取反则可
以得到检验和。
3.2.3 举例子分析
该例子计算的是一个 UDP 的检验和
由上图可知源 IP、目的 IP、UDP 长度和数据。
计算步骤:
7
1 首先将检验和部分添零;
2 然后将 TCP 伪首部部分,TCP 首部部分,数据部分都划分成 16 位的一
个个 16 进制数;
3 将这些数逐位相加,记得溢出的部分加到最低位上,这是循环加法,最
终得到 0x4bff
4 最后,将得到的结果取反,则可以得到检验和 0xb400
8