关于TCP三次握手和四次挥手大家都在《计算机网络》课程里学过,还记得当时高超老师耐心地讲解。大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过《java程序设计》和《计算机网络》,但每次课几乎都动手敲代码或者当场做实验。好了不扯了,下面进入正题。

     关于三次握手和四次挥手的理论部分可以在很多资料上找到,我今天动手抓了几个包验证书上的理论,毕竟那些字段和整个通信的过程学起来很枯燥。

一、三次握手:

      我用wireshark抓取的数据包如下:

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_三次握手

 

观察其中红色方框内的3条数据包就是一次TCP建立连接的过程,客户端首先向服务器发一个数据包syn位置1,5774->80,嘿,哥们儿,您我想访问你的web资源,能不能把你的80端口打开;服务器向客户端返回一个数据包syn位置1,ack位置1,80->5774,可以啊,我已经把80端口打开了,但是为了保证待会儿可靠传输,你也把你的5774端口打开呗;最后,客户端会再向服务器端发送一个数据包ack位置1,5774->80,没问题我也把的5774端口打开了,好的到此一次TCP连接就此建立。下面具体分析数据包的各个字段。

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_三次握手_02

 

在wireshark的这个界面中,左边这个框框是对数据包各个层的概述和详细信息,右边的框框是真实的数据包,我调成用16进制显示,最右边还有一堆乱七八糟的符号,其实就是16进制数据的ascii码解释,0000,0010,0020,0030就是16进制的地址,如果对汇编比较熟的话右边的框框应该很容易看明白。左边的框框第一行是数据包整体概述,第二行是以太网这一层(链路层)的详细信息,最主要的是双方的mac地址,第三行是网络层(网际层)的详细信息,最主要的是双方的IP地址,第四行是传输层的详细信息,最主要的是双方的端口号。

 每一层都有一个字段指向上一层,表明上一层是什么协议。这大概是因为发包的时候会在数据上依次加上应用层、传输层、网络层、链路层的头部,但是对方收到数据包后是从最底层(链路层)开始层层剥去头部解包的,所以在每层上有一个字段指向上层表明上层的协议,对方就知道下一步该怎么解包了。说了这么多,可能又要被喷了,no picture you say a J8 a !

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_字段_03

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_04

由于建立TCP连接用不到应用层协议,所以传输层就没有相应的指明上层(应用层)的字段了。

  下面更直观地感受一下,三次握手过程中标志位的变化情况,首先客户端发送的数据包syn位置1,然后服务器端回复的数据包syn位置1,ack位置1,最后客户端发送的数据包ack位置1.以下三幅图分别为TCP三次握手的数据包中传输层的标志位字段

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_05

 

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_字段_06

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_三次握手_07

 

二、四次挥手:

  这次抓到的包和书本上分析的过程有点不一样,过程就不赘述了,直接看图分析

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_字段_08

关于可靠传输好像没抓到合适的包啊,下次有机会再写一篇博客,今天太晚了。

三、抓取telnet明文传输的值

众所周知,telnet在网上是明文传输,因为这样技术出现比较早,当时的人心里也没那么黑暗,想不到去盗取别人账号密码什么的,现在不同了,用telnet这种远程登录方式是很不安全的,如果黑客通过一定方式把你的流量欺骗到他的电脑,再通过抓包软件分析你的账号和密码,那就.........。所以,建议使用ssh,毕竟安全一点。

   我这次是用telnet远程登录美国的一台开放的路由器telnet   route-server.ip.att.net。账号:rviews,密码:rviews。用wireshark抓包并过滤后发现了密码和账号。还是那句话,no picture you say a J8 a!由于telnet是一个字符一个字符的传的,所以截的图可能会有点多。先用户名部分:

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_09

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_10

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_11

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_三次握手_12

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_13

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_三次握手_14

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_三次握手_15

  可见,将这些字符连起来就可以得到rviews,也就是用户名。而且最后传送的'\r\n'还可以推断作者用的是windows系统,因为linux下的换行是'\n',而windows下是'\r\n'。密码部分只上传部分截图:

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_16

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_17

  关于可靠传输也找到了一个好点的例子,没错,就是telnet,TCP通过每个数据包的seq序列号+len长度都等于下个数据包的seq序列号,如果不等说明中间丢了比特,下次会从新的seq位开始传一定长度的数据。telnet每次好像都传1比特,传2比特的是'\r\n'字符。

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_字段_18

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_TCP_19

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_wirespark抓tcp三次握手_20

wirespark抓tcp三次握手 wireshark抓取tcp三次握手_三次握手_21