其实对于网络通信的学习,最好还是能够自己抓到包详细地一下,不然只单单通过文字和图的描述印象不够深刻。本文通过实际的抓包操作来看一下tcp的连接与断开是怎样的。

  首先需要去https://www.wireshark.org/下载wireshark对应你机器位数的版本,也可以用这个连接直接下载(64位)http://sw.bos.baidu.com/sw-search-sp/software/16fb23dbe1547/Wireshark-win32-2.4.3.0.exe。

  安装完成后打开,会看到如下页面:

  

  下面这两个以太网指的是你电脑上不同的网卡,选择一个可以跑的网卡,双击。

  打开之后你会看到各种各样颜色的包,这里就是wireshark抓到的包了,我们需要做的就是过滤出我们想看的tcp包。这里我们过滤器栏输入过滤条件,过滤出我们想要的。本文以PC和www.baidu.com作为通信的双方,百度其中一个ip为14.215.177.38。在过滤器栏中输入如下内容:(ip.src==XXX.XXX.XXX.XXX and ip.dst==14.215.177.38) or (ip.src==14.215.177.38 and ip.dst==XXX.XXX.XXX.XXX),其中XXX.XXX.XXX.XXX为你本机的地址。我们要看tcp连接和断开,需要的是本机发送给百度的包和百度发送给本机的包,所以过滤条件就是刚才输入的,当看到过滤栏为绿,即说明输入语法正确。

  接着打开一个浏览器,建议选择无痕模式的浏览器。然后启动抓包:

  启动抓包之后,在浏览器的地址栏输入14.215.177.38,回车,这时候你会看到类似于:

  

  那么红框内的前三条就是tcp的握手了。对比一下前后两图,客户端即本机source的60055端口发送一个包给14.215.177.38(百度)的80端口,内容为SYN=1,seq=0(第一次握手)。百度接收到请求后,返回一个包给本机,内容为SYN=1,ACK=1,seq=0,ack=1(第二次握手),这里大写的为标志位,小写的为数据。本机接收到百度返回的包之后,也发送一个包给百度,内容为ACK=1,seq=1,ack=1(第三次握手),到这里三次握手全部完成,连接建立。发现下面一行的包是http的,这也验证了http是基于tcp协议的,需要先建立tcp连接http才能启动。

  

  继续分析后面的包:

  

  上面说到本机向百度发送了一个http请求,请求的是百度的主页面,百度收到这个请求后返回两个包,第二个即为整个html页面,即红框中的第二个其标志位为PSH,ACK。拿到html页面不算结束,因为我们直到html页面需要css、js、图片来渲染,所以需要继续从百度那边拿到css、js、图片回来才行。这样就可以解释为什么我们网慢的时候会出现页面结构不一样或者图片加载不出来,因为我们只从服务端拿到了html代码而没有拿到其他东西。可以看一下PSH,ACK包中的内容:

  

  再往下就是从百度继续拿取资源,都是成对出现的。本机发一个过去,百度返回一个回来,tcp中的传输数据就是这样,直到资源拿取结束(比如这里的http拿取结束):

  

  状态码200,表示成功,即该http请求成功并返回给本机。

  由于我们用的是浏览器直接访问,所以我们无法手动断开连接(可能是我不会吧 滑稽脸),但是百度那边会自动断开:

  

  

  这里看到的是tcp断开四次挥手,由于实际操作原因这里只出现了3次,后面会有解释。

  看红框中第一行知道时百度发出的断开连接请求,再看红框的上一行,对比一下第二列会发现正好差60,单位秒,因为访问百度的人很多,如果你没有实际操作不可能给你一直占用资源,所以当超过60s也就是一分钟还无操作的时候百度就会自动发起断开请求。也正因为时百度发起的断开请求导致了我们只有三次挥手。

  百度发起请求FIN,ACK(第一次挥手),本机接收到并返回两个包,一个为ACK(第二次挥手),另一个为FIN,ACK(第三次挥手)。接着应该是百度发一个ACK返回给本机(第四次挥手)然后结束,但是由于百度单方面强制关闭了,并且不再接收本机的数据包,导致第三次挥手无法送法,也就有了下面深红色的TCP Retransmission(TCP重传),因为第三次挥手发给百度的包一直没有回应,本机启动超时重传机制。重传几次之后仍然没有回应,发送一个RST,ACK包,RST为复位,即表示TCP整个连接(这里连接是名词)中出现了重大差错(如服务器崩溃或其他原因,也就是百度强制关闭了),必须释放连接。至此连接关闭,希望可以找到方法来让客户端主动发送断开请求,这样可以出现四次握手。

  

wireshark抓包分析tcp连接与断开的更多相关文章

  1. wireshark抓包分析——TCP/IP协议

    本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...

  2. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

    Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...

  3. Wireshark抓包分析TCP“三次握手,四次挥手”

    1.目的 客户端与服务器之间建立TCP/IP连接,我们知道是通过三次握手,四次挥手实现的,但是很多地方对这个知识的描述仅限于理论层面,这次我们通过网络抓包的方式来看一下实际的TCP/IP传输过程. 2 ...

  4. Wireshark抓包分析/TCP/Http/Https及代理IP的识别

    前言 坦白讲,没想好怎样的开头.辗转三年过去了.一切已经变化了许多,一切似乎从没有改变. 前段时间调研了一次代理相关的知识,简单整理一下分享之.如有错误,欢迎指正. 涉及 Proxy IP应用 原理/ ...

  5. Wireshark抓包分析TCP 3次握手、4次挥手过程

    Wireshark简介 更多有关Wireshark的教程.软件下载等,请见:http://www.52im.net/thread-259-1-1.html,本文只作简要介绍. 1Wireshark 是 ...

  6. Wireshark抓包分析TCP协议

      版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!! 之前有一篇文章介绍了http协议「初识http协议」, http协议协议是基于tcp协议的,所以作者觉得有必要针对tcp ...

  7. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制

    关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...

  8. 基于wireshark抓包分析TCP的三次握手

    1. TCP的三次握手 在TCP/IP协议通讯过程中,采用三次握手建立连接,从而保证连接的安全可靠. 所有基于TCP的通信都需要以两台主机的握手开始.这个握手过程主要是希望能达到以下不同的目的.[1] ...

  9. 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手

    [摘要]本文重点分析计算机网络中TCP协议中的握手和挥手的过程. [前提说明] 前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需 ...

随机推荐

  1. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  2. 【NOI2004】郁闷的出纳员(splay)

    题面 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工 作,但是令人郁闷的是,我们的老板反复无 ...

  3. MySQL根据出生日期计算年龄的五种方法比较

    方法一 SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age 方法一,作者也说出了缺陷,就是当日 ...

  4. 大文件视频断点续传插件resumabel.js,优化上传速度,缩短最后一片等待时长。

    在angular中使用resumable.js遇到的一个问题:大视频上传到99-100%时,此时正在上传最后一片,最后一片的xhr一直是pending状态.原因插件会检查第一片和最后一片的元数据,检测 ...

  5. PHP随机函数-集锦

    1 PHP随机函数收藏 function random_string($len = 6) { $chars = array( "a", "b", "c ...

  6. Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

    尝试在一个空的对象引用上引用boolean java.util.List.add()这个方法: 错误例子: private ArrayList<String> classList; cla ...

  7. 深入java虚拟机学习 -- 类的加载机制(四)

    类加载的命名空间 每个类加载器都有自己的命名空间,命名空间由所有以此加载器为初始类加载器的类组成,不同命名空间的两个类是不可见的,但只要得到类所对应的Class对象的refrence(反射),还是可以 ...

  8. CentOS配置本地yum源

    如果CentOS服务器处在内网环境中时,如果缺少依赖手动安装那么会非常麻烦,要花费很多时间来寻找rpm包,现在如果搭建本地的yum源,就非常方便了,使用yum源首先需要一个CentOS安装镜像,去官网 ...

  9. Hive数据仓库笔记(三)

    Joins: Inner  joins: hive> SELECT * FROM sales; Joe 2 Hank 4 Ali 0 Eve 3 Hank 2 hive> SELECT * ...

  10. 使用git工具快速push项目到github(精简)

    Dear Weber ,相信有很多刚开始接触前端的程序猿,在刚接触到git工具传项目到github上时会遇到一些问题,那么下面的话呢,我就整理一下一个大致的思路提供给大家参考: 工具:git (自行下 ...