其实对于网络通信的学习, 最好还是能够自己抓到包详细地看一下, 不然只单单通过文字和图的描述印象不够深刻本文通过实际的抓包操作来看一下 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 页面需要 CSSjs 图片来渲染, 所以需要继续从百度那边拿到 cssjs 图片回来才行这样就可以解释为什么我们网慢的时候会出现页面结构不一样或者图片加载不出来, 因为我们只从服务端拿到了 html 代码而没有拿到其他东西可以看一下 PSH,ACK 包中的内容:
再往下就是从百度继续拿取资源, 都是成对出现的本机发一个过去, 百度返回一个回来, tcp 中的传输数据就是这样, 直到资源拿取结束(比如这里的 http 拿取结束):
状态码 200, 表示成功, 即该 http 请求成功并返回给本机
由于我们用的是浏览器直接访问, 所以我们无法手动断开连接(可能是我不会吧 滑稽脸), 但是百度那边会自动断开:
这里看到的是 tcp 断开四次挥手, 由于实际操作原因这里只出现了 3 次, 后面会有解释
看红框中第一行知道时百度发出的断开连接请求, 再看红框的上一行, 对比一下第二列会发现正好差 60, 单位秒, 因为访问百度的人很多, 如果你没有实际操作不可能给你一直占用资源, 所以当超过 60s 也就是一分钟还无操作的时候百度就会自动发起断开请求也正因为时百度发起的断开请求导致了我们只有三次挥手
百度发起请求 FIN,ACK(第一次挥手), 本机接收到并返回两个包, 一个为 ACK(第二次挥手), 另一个为 FIN,ACK(第三次挥手)接着应该是百度发一个 ACK 返回给本机 (第四次挥手) 然后结束, 但是由于百度单方面强制关闭了, 并且不再接收本机的数据包, 导致第三次挥手无法送法, 也就有了下面深红色的 TCP Retransmission(TCP 重传), 因为第三次挥手发给百度的包一直没有回应, 本机启动超时重传机制重传几次之后仍然没有回应, 发送一个 RST,ACK 包, RST 为复位, 即表示 TCP 整个连接 (这里连接是名词) 中出现了重大差错(如服务器崩溃或其他原因, 也就是百度强制关闭了), 必须释放连接至此连接关闭, 希望可以找到方法来让客户端主动发送断开请求, 这样可以出现四次握手
来源: https://www.cnblogs.com/GoForMyDream/p/8707813.html