0.1、计算机网络-抓包验证 TCP的三次握手和四次握手

版权声明:欢迎转载交流,声明出处即可。体能状态先于精神状态,习惯先于决心,聚焦先于喜好 ——Bestcxx https://blog.csdn.net/bestcxx/article/details/90611349

前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好

关于抓包工具 wireshake 的安装和使用

如果你尚不掌握这个软件但是打算实操一下,请参考笔者之前写的一篇文章 Wireshark 的基本使用

TCP 协议

TCP 协议的简单介绍

在TCP/IP的体系结构中,TCP和UDP一起位于运输层
(a)是标准 OSI 模型,由于过于复杂仅停留在理论层面
(b)是现实世界真实的情况,是商业推广的结果
(c)是为了便于学习的模型,可以看到(c)的应用层、运输层、网络层对应(b),©的数据链路层和物理层对应(a)

在这里插入图片描述

TCP 协议的三次握手

客户端通过TCP协议访问服务端时,需要先建立起连接。
TCP 协议规定,客户端需要先和服务端进行三次信息传输,即三次握手,其中客户端发送两次信息,服务端发送一次信息

三次握手的通俗描述

第一次连接:客户端——>服务端:请求连接
第二次连接:服务端——>客户端:收到请求,请开始发送
第三次连接:客户端——>服务端:我知道你你准备好了
三次握手结束
第四次连接:客户端——>服务端:正式的需要传输的数据

TCP 的控制位

当然,计算机可不会这么唠家常,它们有自己的语言
在 TCP 报文段的首部,其中有6位被叫做控制位,每一位可以取值0或者1,分别代表了不同的情况,他们都有自己的名字

在这里插入图片描述

URG:即Urgent,紧急。当URG=1,表示这是紧急数据会被插队放在报文段的前边,配合首部中的紧急指针使用,比如在向远程服务推送数据中间发现有误,需要给一个取消命令,就可以使用该功能。
ACK:即Acknowlegment,确认。当ACK=0,确认无效,ACK=1表示确认有效,TCP规定,在连接建立后,所有的报文段都必须将ACK置为1
PSH:即Push,推送。PSH=1,接收方在收到报文段后会立即将数据推送给应用层,而不是等到整个缓存填满。即发送方发送紧急报文时可以使用。
RST:即Reset,复位。当RST=1,表示TCP中出现严重错误,需要先释放连接再重连,RST=1也用来拒绝非法连接和报文段
SYN:即Synchronization,同步。在建立连接时用来同步信号,当SYN=1且ACK=0,表示这是请求连接的报文,当SYN=1且ACK=1表示服务端同意请求
FIN:即 Finis,结束。当值为1,表示此报文段已发送完毕,请求释放运输连接。

TCP 的状态位和 seq、ack

控制位 SYN和FIN都会消耗一个序号 seq,
控制位 ACK 如果没有传输数据不消耗序号 seq,
ack 表示我预期你下一个报文的 seq 值
发送方和接收方自己维护自己的 seq值

在这里插入图片描述

·Sequence Number: 32 bits
The sequence number of the first data octet in this segment (except
when SYN is present). If SYN is present the sequence number is the
initial sequence number (ISN) and the first data octet is ISN+1
翻译:这个报文段是第一个八位字节类型数据的序号(除了SYN场景).如果SYN控制位被设置,说明 sequence number 是初始化的序号(ISN)并且在正式第一次发送数据时 seq=ISN+1.(一般初始值是0,但是TCP RFC 并没有对此进行限定)

·Acknowledgment Number: 32 bits
If the ACK control bit is set this field contains the value of the
next sequence number the sender of the segment is expecting to
receive. Once a connection is established this is always sent.
翻译:如果 ACK 控制位被设置,Acknowledgment Number 的值就表示下一次发送者的 sequence number 的值.
一单一个连接被建立起来,这个参数会一直被发送.(即我向你发送报文,预期你下一个报文的seq=我的本次豹纹段的ack值)

传输控制块TCB

TCP 中 Transmission Control Block的简称,用于保存维护一个TCP的相关的变量,服务端和客户端各自维护自己的TCB
tcb结构的定义包括这个连接使用 的源端口、目的端口、目的ip、序号(seq)、应答序号(ack)、对方窗口大小、己方窗口大小、tcp状态、top输入/输出队列、应用层输出队列、tcp的重传有关变量。

TCP 三次握手的术语描述

前提:服务端启动,创建好 传输控制块TCB,准备好监听访问
第一步:客户端——>服务端:客户端创建好传输控制块TCB,报文段内容,控制位 SYN=1;初始化TCB中的序号seq=x,一般首次访问seq=0;SYN 不可携带数据但要消耗一个序号
第二步:服务端——>客户端:发送报文段,控制位 SYN=1,ACK=1;初始化TCB中的序号,seq=y,一般首次访问seq=0(注意这里服务端初始序号和客户端的初始序号没有关系),TCB中的确认序号ack=x+1(注意这里确认序号是客户端的序号值加1);SYN 不可携带数据但要消耗一个序号
第三步:客户端——>服务端:发送报文段,控制位 ACK=1;TCB中自己的序号 seq=x+1, 确认序号ack=y+1(注意这里即服务端的序号值加1);ACK 可携带数据,如不携带序号可以重复使用
三次握手结束
第四步:客户端——>服务端:开始通信,TCP 规定,没有携带数据的通信不消耗序号,所以这一步客户端 控制位:ACK=1;TCB 中依旧 seq=x+1

简单总结就是,seq 默认为0 ,本方每次发送报文段自己的seq 累加,ack 序数则是发送方的seq +1
三次握手中只有第一次握手和第二次握手有控制位SYN,消耗一个序号
第三次握手只有ACK,不懈怠数据,下次seq序号可以重复使用

在这里插入图片描述

TCP 协议的四次握手

TCP 协议中客户端和服务端建立连接后可以进行双向通信,在连接结束时需要进行四次交互,任何一方都可以先发起中断协议请求,发起 FIN 状态位的一方不再发送数据报文,双方都发送FIN后且得到对方确认后连接结束

再次强调,发起中断连接请求的可以是服务端也可以是客户端
这里举例的是客户端发起中断请求
第一步:客户端——>服务端:控制位FIN=1;seq=u;FIN要消耗一个序号,此外,这一步可能有ACK控制位
第二步:服务端——>客户端:控制位ACK=1;seq=v,ack=u+1;
如何服务器端存在未完成传输的数据,可以继续传输,但是客户端在发送FIN后就不再发送新的数据了,当然,通信数据除外
第三步:服务端——>客户端:控制位FIN=1,ACK=1;seq=w,ack=u+1;w可能和v一样,因为这一步表示服务端发送数据完毕了,在第二步和第三步之间是可以继续发送没有发送完的数据的,是要消耗序号的,因为在此期间客户端一直不会发送新数据,所以ack=u+1保持不变,即期待客户端下一次报文 seq=u+1
第四步:客户端——>服务端:控制位ACK=1;seq=u+1,ack=w+1
通信并不会立即结束,还需要经过时间等待计时器,为了防止网络延迟导致的未抵达的数据,时间是2MSL,1MSL=2分钟(建议时间)

在这里插入图片描述

用抓包工具查看TCP的三次握手

借助 http 协议访问一个图片

http协议属于应用层协议,下游是TCP协议,所以我们选择一个可以被访问到的 http 服务即可
这里我选择了一个图片,由于抓包用到 ip,需要获取对应的ip
http://img.alicdn.com/tps/TB1sbSUKVXXXXaQXVXXXXXXXXXX-600-340.png
需要注意的是,这个ip是动态的,使用 telnet img.alicdn.com 80 获取对应ip
我的网络环境获取的ip为 123.6.34.253 ,
当然,也建议你配置一下本地 hosts,这样对应域名就被绑定为一个固定ip了

准备过滤语句选择网络

(ip.addr== 192.168.0.108 and ip.dst == 123.6.34.253) || (ip.addr== 123.6.34.253 and ip.dst == 192.168.0.108)
由于我是wifi联网,所以点击无线网络连接

在这里插入图片描述

访问url并查看结果

初步查看可以得出结论,浏览器同时发送了多次请求

在这里插入图片描述

优化命令-过滤三次握手的包

我们需要将 三次握手 单摘出来
这里利用一个小窍门,seq默认首次访问为0
如下图
第一次:SYN,Seq=0
第二次:SYN,Seq=0,Ack=1
第三次:ACK,Seq=1,Ack=1

在这里插入图片描述

使用 telnet 命令抓包TCP的三次握手和四次握手

使用http实验的一个不好的地方就是抓包内容比较混乱,还需要细心摘取,使用 telnet 命令抓包的数据则非常清晰

命令和操作

telnet img.alicdn.com 80
Telnet 之后一直等到着就行,超时后服务端主动关闭连接
wireshake 命令 (ip.addr== 172.18.166.205 and ip.dst == 122.14.43.188) || (ip.addr== 122.14.43.188 and ip.dst == 172.18.166.205)

抓包和解释

在这里插入图片描述

  • 三次握手:
    客->服:SYN,seq=0,SYN消耗一个序号
    服->客:SYN,seq=0,ack=1,消耗一个序号,且ack=1表示预期客户端下一个报文seq=1
    客->服:ACK,seq=1,ack=1,不传输数据的ACK不消耗序列号下次传输客户端seq=1,ack=1表示预期服务端下一个报文seq=1,
  • 四次握手:
    服->客:FIN,ACK,seq=1,ack=1;FIN消耗一个序数,服务端上次seq=0,这次加1,即seq=1,ack=1表示预期客户端下一个报文seq=1,因为上次客户端ACK无数据不消耗序数,可以重复使用
    客->服:ACK,seq=1,ack=2;客户端重复使用seq=1,服务端FIN消耗了服务端序数,所以预期服务端下一个报文段seq=2,本次不消耗客户端序数seq=1下次可以继续用
    客->服:FIN,ACK.seq=1,ack=2,客户端中断连接,不再发送信息,ack=2表示预期服务端下次seq=2
    服->客:ACK,seq=2,ack=2
    结束

三次握手和四次握手只是最低限度

由于网络延迟等问题,有时候会触发超时重连机制,这样会导致交互次数多于理论次数

参考文档

[1]、tpc rfc793
[2]、《计算机网络》谢希仁 第5版

猜你喜欢

转载自blog.csdn.net/bestcxx/article/details/90611349
今日推荐