用 Wireshark 图解:TCP 三次握手

ClarissaWol 7年前
   <p style="text-align: center;"><img src="https://simg.open-open.com/show/98e48b8b5c2ed0545711dd523512aa45.jpg"></p>    <p><strong>一、什么是 Wireshark ?</strong></p>    <p>简单地说,Wireshark 是抓包工具。官网说,“Wireshark 是一个网络包分析工具。 网络数据包分析仪将尝试捕获网络数据包并试图尽可能详尽显示该数据包。”</p>    <p>Wireshark 不单单能抓包,主要的 Features 是 对数据包进行各种的分析 。下载打开界面非常简单直观:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/a241a8ec138d24d790c1214942c23837.jpg"></p>    <p>最上面是 Packet List 窗口,它列出了所有网络包。</p>    <p>在 Packet List 中选定的网络包会详细地显示在中间的 Packet Details 窗口中。</p>    <p>最底下是 Packet Bytes Details 窗口(16 进制数据),我们一般不会用到它。</p>    <p><strong>二、我们抓什么包呢?如题 TCP</strong></p>    <p>TCP 一脸懵逼。记得上次在 《图解Http协议》得知,HTTP 是一个客户端和服务器端请求和响应的标准TCP。其实建立在 TCP 之上的。那我们就抓 HTTP,这很简单。</p>    <p><strong>三、实操 Wireshark</strong></p>    <p>选择 Capture – Options,选择当前网络,点击 Start 。如图:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/77bb757d962efe97e9d897a908dfe349.jpg"></p>    <p>浏览器打开我的博客 www.bysocket.com ,然后在 Wireshark 中的过滤器输入博客 IP 过滤:ip.addr == 106.14.40.18</p>    <p>选择第一行,如第一张图,简单介绍下 Packet Details 窗口参数详情:</p>    <p>Frame – 物理层</p>    <p>Ethernet – 数据链路层</p>    <p>Internet Protocol Version – 网络层</p>    <p>Transmission Control Protocol – 传输层</p>    <p>大家知道 网络层次划分为 标准的OSI七层模型 ,还有  TCP/IP四层协议  以及 TCP/IP五层协议 。如图:</p>    <p><img src="https://simg.open-open.com/show/24151f0f827fad11b252d848d527746a.png"></p>    <p>其中, Transmission Control Protocol – 传输层 是我们最为关心的。如图已经展开了:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/034a8ac8d99bfa7eae0d43e9ca7808a6.jpg"></p>    <p>具体我们先学习 TCP 报文段格式:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/36809987567465ddbbd4ea4cbc1ac0dd.jpg"></p>    <p>那么第二个红框,由上至下,一一大家可以对应下,重点的是:</p>    <p>Sequence number – 序号</p>    <p>Acknowledgment number – 确认号</p>    <p>Flags – 标志位</p>    <p>— Acknowledgment 确认位</p>    <p>— Push 急迫位</p>    <p>— Reset 重置位</p>    <p>— Syn 同步位</p>    <p>— Fin 终止位</p>    <p><strong>a. 第一次握手标志位</strong></p>    <p>localhost Seq=0 -> 博客地址</p>    <p>从标志位看出,同步位有值,在做请求(SYN):Syn 同步位为1</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/e0359f2aecb7158f616a4aeef19b241a.jpg"></p>    <p><strong>b. 第二次握手标志位</strong></p>    <p>博客地址 Seq=0 Ack=1 -> localhost</p>    <p>从标志位看出,确认位、同步位有值,在做应答(SYN+ACK):Syn 同步位为 1 、Acknowledgment 确认位为 1</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/92f8ee68daa13dceeadfa14fcb725e30.jpg"></p>    <p><strong>c. 第三次握手标志位</strong></p>    <p>localhost Seq=1 Ack=1 -> 博客地址 (注: Seq=Seq+1)</p>    <p>从标志位看出,只有确认位有值,在做再次确认(SYN):Acknowledgment 确认位为 1</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/50bac255f2346080165bb1a982eea62b.jpg"></p>    <p>综上所述,一个完整的三次握手就是:</p>    <p>请求(SYN) — 应答(SYN+ACK) — 再次确认(SYN)</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/cc4b060bc57b2850605546aaa2ddfec4.jpg"></p>    <p>如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“ 分享 ”悬浮按钮哦,让更多的人阅读这篇文章。</p>    <p> </p>    <p>来自:http://www.bysocket.com/?p=1404</p>    <p> </p>