--- title: 计算机网络-实验(四)TCP抓包分析 mathjax: true date: 2019-06-12 22:40:43 tags: [计算机网络] --- # 实验内容 - 学会安装使用自由软件SNORT - 截获以太网数据包,并描述以太网数据包的各层的帧结构。 - 截获ARP,TCP协议数据包并进行分析 # 实验步骤 实验需要两个主机A(192.168.1.104)和B(192.168.1.105),A访问B,B进行TCP和ARP抓包,本实验报告为抓包主机B视角。 ## 环境配置 主机B需要进行环境配置:设置账户密码、打开FTP站点 ### 设置账户密码 控制面板——用户账户——设置密码 ### 打开FTP站点 控制面板——管理工具——Internet信息服务——FTP站点——属性——用户名——浏览——查找账户——选择`ligong`——应用——确认 ## A访问B - `ftp` - `open 192.168.1.105` - 输入用户名(`ligong`)和密码(`123`,也就是刚才设置的密码) - 一些操作,如`dir` - `quit`,退出,断开连接 ## B进行抓包 使用`Snort`软件进行抓包,进入`D:/snort/bin`目录。 输入`snort -dev -l /snort/log`,开始抓包,按下`Ctrl+C`停止抓包。 如果主机B抓到了A发出的FTP请求,在`D:/snort/log`目录下可以找到文件夹`192.168.104`,在其中可以看到名如`TCP_1980-21.ids`的文件,21为端口号。 # 数据包分析 ARP抓包失败,原因未知,其他同学似乎也未抓到,抓到的都是3号机器广播的ARP包。下边进队TCP数据包进行分析。 ## TCP数据包分析 - TCP是面向连接的协议,所以TCP运输连接的建立和释放时每一次通信中必不可少的过程。 - 运输连接分为三个阶段:**连接建立**、**数据传送**、**连接释放**。 每一次握手大概包括以下内容: 第一行数据包括了时间戳、源物理地址、目的物理地址、类型、长度; 第二行数据包括了源IP、目的IP、TCP、TTL、TOS、ID、IP长度、Dgm长度; 第三行数据包括SYN位、ACK位、序号、确认号、窗口大小、TCP长度; 第四行信息包括TCP选项等。 以下主要选取TCP数据包中连接建立(三次握手)和连接释放(四次握手)的相关内容进行分析。 ### 连接建立 ```c++ 01/01-01:40:15.948470 0:16:EC:D2:50:7D -> 0:19:21:57:7:85 type:0x800 len:0x3E 192.168.1.104:1980 -> 192.168.1.105:21 TCP TTL:128 TOS:0x0 ID:11743 IpLen:20 DgmLen:48 DF ******S* Seq: 0x75C7623D Ack: 0x0 Win: 0xFFFF TcpLen: 28 TCP Options (4) => MSS: 1460 NOP NOP SackOK =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ ``` 上边为连接建立的**第一次握手**,可以看到数据包从主机A(104)发往主机B(105)的21号端口; SYN位设置为1; 序号为`0x75C7623D`。 ```c++ 01/01-01:40:15.948524 0:19:21:57:7:85 -> 0:16:EC:D2:50:7D type:0x800 len:0x3E 192.168.1.105:21 -> 192.168.1.104:1980 TCP TTL:128 TOS:0x0 ID:11647 IpLen:20 DgmLen:48 DF ***A**S* Seq: 0xF085016 Ack: 0x75C7623E Win: 0xFFFF TcpLen: 28 TCP Options (4) => MSS: 1460 NOP NOP SackOK =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ ``` 上边为连接建立的**第二次握手**,可以看到数据包从105发往104, SYN位设置为1; ACK位设为1; 序号为`0xF085016`; 确认号为`0x75C7623E`,即**确认号为上一次握手序号+1的值**。 ```c++ 01/01-01:40:15.948661 0:16:EC:D2:50:7D -> 0:19:21:57:7:85 type:0x800 len:0x3C 192.168.1.104:1980 -> 192.168.1.105:21 TCP TTL:128 TOS:0x0 ID:11744 IpLen:20 DgmLen:40 DF ***A**** Seq: 0x75C7623E Ack: 0xF085017 Win: 0xFFFF TcpLen: 20 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ ``` 上边为连接建立的**第三次握手**,可以看到数据包从104发往105, ACK位设为1; 序号为`0x75C7623E`,即**序号为上一次握手的确认号**,本质是A上一次向B发出的请求的序号+1; 确认号为`0xF085017`,即**确认号为上一次握手序号+1的值**。 ### 数据传送 ![TCP数据包.png](https://i.loli.net/2019/06/06/5cf7f404924bd20321.png) ### 连接释放 **注意**:这里是**服务器主动释放连接**,与教材上写的客户机主动释放情况不同。 ```c++ 01/01-01:40:25.769622 0:19:21:57:7:85 -> 0:16:EC:D2:50:7D type:0x800 len:0x36 192.168.1.105:21 -> 192.168.1.104:1980 TCP TTL:128 TOS:0x0 ID:11666 IpLen:20 DgmLen:40 DF ***A***F Seq: 0xF085092 Ack: 0x75C7625B Win: 0xFFE2 TcpLen: 20 ``` 上边为连接释放的**第一次握手**,可以看到数据包从105发往104, ACK位设为1; FIN位设为1; 序号为`0xF085092`; 确认号为`0x75C7625B`。 ```c++ 01/01-01:40:25.769759 0:16:EC:D2:50:7D -> 0:19:21:57:7:85 type:0x800 len:0x3C 192.168.1.104:1980 -> 192.168.1.105:21 TCP TTL:128 TOS:0x0 ID:11763 IpLen:20 DgmLen:40 DF ***A**** Seq: 0x75C7625B Ack: 0xF085093 Win: 0xFF84 TcpLen: 20 ``` 上边为连接释放的**第二次握手**,可以看到数据包从104发往105, ACK位设为1; 序号为`0x75C7625B`,即**序号等于上次握手确认号**; 确认号为`0xF085093`,即**确认号等于上次握手序号+1**。 ```c++ 01/01-01:40:25.771844 0:16:EC:D2:50:7D -> 0:19:21:57:7:85 type:0x800 len:0x3C 192.168.1.104:1980 -> 192.168.1.105:21 TCP TTL:128 TOS:0x0 ID:11764 IpLen:20 DgmLen:40 DF ***A***F Seq: 0x75C7625B Ack: 0xF085093 Win: 0xFF84 TcpLen: 20 ``` 上边为连接释放的**第三次握手**,可以看到数据包从104发往105, ACK位设为1; FIN位设置为1; 序号为`0x75C7625B`,即**序号等于上次握手序号**; 确认号为`0xF085093`,即**确认号等于上次握手确认号**。 ```c++ 01/01-01:40:25.771894 0:19:21:57:7:85 -> 0:16:EC:D2:50:7D type:0x800 len:0x36 192.168.1.105:21 -> 192.168.1.104:1980 TCP TTL:128 TOS:0x0 ID:11667 IpLen:20 DgmLen:40 DF ***A**** Seq: 0xF085093 Ack: 0x75C7625C Win: 0xFFE2 TcpLen: 20 ``` 上边为连接释放的**第四次握手**,可以看到数据包从105发往104, ACK位设为1; 序号为`0xF085093`,即**序号等于上次握手确认号**; 确认号为`0x75C7625C`,即**确认号等于上次握手序号+1**。 # 心得体会 本次实验前在计算机网络课堂上还并没有学过TCP的连接过程如何建立与释放,仅仅听说过三次握手和四次握手。 通过这次实验,更加直观、具体地看到了TCP建立和释放连接的过程。在实验之后,又通过学习,对三次握手和四次握手的原理有了进一步的了解。 问:为什么建立连接是三次握手,释放连接是四次握手? 答: - 建立连接时,服务器收到客户的SYN连接请求报文,可以直接发送SYN+ACK报文,其中ACK报文是用来应答的,SYN报文是用来同步的。 - 当释放连接时,当服务器收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端:“你发的FIN报文我收到了”。只有等到服务器所有的报文都发送完了,它才能发送FIN报文,因此ACK报文和FIN报文不能一起发送,故需要四步握手。 --- 作者:[@臭咸鱼](https://github.com/chouxianyu) 转载请注明出处: 欢迎讨论和交流! ---