极客996

极客996

  • 8文章
  • 1评论
  • 215文章浏览
小白图解TCP建立连接(三次握手)到关闭连接全过程(四次挥手)

小白图解TCP建立连接(三次握手)到关闭连接全过程(四次挥手)

在分析之前先介绍一下需要用到的工具,有助于加深理解 Postman :一种开发人员经常会使用到的测试工具,常用于测试自己写的API接口是否能够正常请求与响应。当然作用不仅于此,对于我这种CURD接口编写员目前作用确实仅此而已(逃 Wireshark(来自百度百科): (前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。 在过去,网络封包分析软件是非常昂贵的,或是专门属于盈利用的软件。Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是全世界最广泛的网络封包分析软件之一。 在分析每次交互的过程中会出现以下几种标识需要了解,不然不知道每次交互的作用是什么 ,后面步骤序号算法可能会省略,可以理解为协议之间的约定 SYN 表示建立连接 FIN 表示关闭连接 ACK 表示响应,1为是,0为否 PSH 表示有 DATA数据传输 RST 表示连接重置。 还需要论述一下seq、ack表示什么意思,应该以什么样的角度去理解这两个序列号。 sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。(注意这里使用的是“应该”。因为对于没有数据的传输,如ACK,虽然它有一个seq,但是这次传输在整个data stream中是不占位置的。所以下一个实际有数据的传输,会依旧从上一次发送ACK的数据包的seq开始) acknowledge number:表示的是期望对方(接收方)的下一次sequence number是多少。 注意,SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一,但是,ACK的传输,不会让下一次的传输packet加一。 测试 1. 由于wireshark无法抓取到以太网本地请求的数据包,所以先要去Nmap(一个很强大的网络安全分析工具网站,里面的很多工具值得玩玩)下载Npcap(数据包嗅探库),下载安装完后将会出现一个名为 Adapter for loopback traffic capture的接口,选错该接口就可以捕获本地发送的请求,如下图: 2. 在本地启动了一个Web项目编写一个简单的测试接口,这里我用的服务端 8080 端口的接口 /test,Postman(客户端)使用的是本地的54416 端口,下面是使用Get请求发送请求产生的数据包,已经使用过滤器再次 Postman请求示例 wireshark捕获该次Get请求的数据包 结合经典的TCP三次握手示例图一一对比每次请求(后面标注的序号) 1.第一次握手,客户端 54416 请求(SYN)服务端 8080 建立连接,发送报文SYN=1(可以在传输层Transmission Control Protocol的Flags中看到),seq=0(|X),TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定: SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号 2.第二次握手,服务端 8080 响应(ACK)客户端54416 确认建立连接,发送报文 seq=0(|y,随机生成),ack=1(期望 54416 报文中 seq+1),这个报文也不能携带数据,但是同样要消耗一个序号 3.第三次握手,客户端发送确认报文,ACK=1,ack=y+1,seq=x+1(第一次握手的序号+1)。TCP规定:ACK报文段可以携带数据,但是如果不携带数据则不消耗序号 4.当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了,客户端发送HTTP Get请求到服务端 5.服务端确认收到请求后响应Http请求,本次请求状态码为 200(成功) 结合经典的四次挥手示例图一一对比每次请求(后面标注的序号) n:客户端不断询问服务端是否保持连接 n+1(服务端: 我想关闭我对你的连接,希望你按照我的要求回答我): 服务端发送FIN标识请求关闭连接(发起方可以是客户端,也可以是服务器端),发送报文 FIN=1,seq=119, ack=320。客户端进入FIN-WAIT-1(终止等待1)状态,TCP规定:FIN报文段即使不携带数据,也要消耗一个序号。 n+2(客户端: 收到,准备中....):客户端收到了服务端响发送的FIN报文段,像服务器回一个ACK=320,seq=120的报文段 , 服务端进入了CLOSE-WAIT(关闭等待)状态。 n+3(客户端: 我已经做好关闭准备,希望你按照我的要求回复我):客户端像服务端发送FIN标识请求关闭连接(双向关闭),此时客户端进入进入FIN-WAIT-2(终止等待2)状态, n+4(服务端:收到,你可以关闭了): 服务端发送确认响应后,客户端将会立即关闭该次连接进入CLOSED(关闭)状态, 而服务端等待2MSL没得到回复后,则证明客户端已经关闭,那么也就进入关闭状态。

Rick  39  2020-09-05 阅读全文

极客996

  • 8文章
  • 1评论
  • 215文章浏览
音乐推荐
热门文章
SSR免费节点———不定时更新
2020-09-04   103
且看且行,人微言轻。
2020-09-04   39
小白图解TCP建立连接(三次握手)到关闭连接全过程(四次挥手)
2020-09-05   39
堆区和非堆区
2020-09-15   9
为什么 HashMap中的hashTabel的长度要设置成2^n?
2020-09-16   8
Google广告