专业知识 HTTP 的三次握手是一个非常重要的面试和考试考点,但是今天早上看书上的一幅图和三段话将近看了半个小时,于是来总结一下。 ? HTTP 的三次握手使用的是 TCP 协议,所以先看一下 TCP 的报文段首部,三次握手需要注意到的是用红线括起来的部分。 ? 抓包示例 ? Wirshark 追踪某个 HTTP 流 示例分析 192.168.1.11 为客户端 A,42.121.252.58 为服务器 B。 面试问题 为什么使用三次握手? 参考文章 TCP 三次握手 TCP为什么需要3次握手与4次挥手 Wireshark基本介绍和学习TCP三次握手 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com
本文使用小白抓包软件演示5G隐藏WiFi的抓包方法。百度网盘下载:https://pan.baidu.com/s/1Q9oWrHF_nKgwOtKyVcb7IQ? 如果没有网卡,或网卡不支持抓包,可按文档推荐购买(需注意mt76x2u这个芯片虽然支持抓包,但经常识别错误,本软件目前使用不了)。 程序会默认将有客户端连接的WiFi都置于顶部,没有客户端连接的WiFi是半透明的,方便观察和抓包。点击“抓包”,等待程序自动捕获完毕。 若检测捕获到了客户端连接过程中的握手信息,则抓包完成(如果WiFi是隐藏的,还会显示出WiFi名称)。程序内置了几个简单的小字典,可做简单的弱密分析。点击旁边的钥匙按钮可以对抓到的握手包进行跑包。 一般密码是比较复杂的(如手机号),可以点击“下载”将握手包下载,点击菜单栏上字典下载地区手机号或使用其他大字典配合专业跑包软件(EWSA、WiFiPR或hashcat)做进一步跑包分析。
用Wireshark抓包进行详细的讲解。抓的是某机构腾讯课堂的首页。 (因为网页有变动,所以实际抓包抓到的内容与图片不符。但是图片中抓到的包是正确的,讲解的技术也是正确的。) 一、就能看到完整的SSL交互的过程: 上面是TCP三次握手,三次握手之后就进入SSL握手的过程。 二、SSL握手过程 1.第一个SSL握手是客户端向服务器发起的Client Hello消息。 TLS协议里面是这样的类型:是一个握手协议,并且是个Client Hello。 支持TLS1.0,TLS1.2。 TLS是SSL协议的一个版本。 这个是为了保证数据完整性的一个信息: 从抓包内容来看,客户端发完之后,这个过程完成了。(抓包工具将交互的过程简化了,都放一起了。如果看分开的具体过程就是上篇文章图片画的过程。) 三、握手结束,后面就开始发送HTTP数据包了。 可以看到这个HTTP数据包是加过密的: http-over-tls意思是:是在tls基础上发的一个HTTP交互报文,是加密的。
.^) 关于TCP/IP的三次握手: 当服务端的状态为LISTEN,客户端的状态为CLOSED时,客户端发起连接 客户端发送有SYN字段报文,此时状态为SYN_SENT状态 服务端接收该报文时,状态处于 大量发送含有少量数据的报文(极端情况一个报文只有一字节数据),因为在协议层中对数据是层层封装的过程,因此对于数据来说有大量的协议头,传输开销过大;或接收端在缓存区接受数据过慢; 解决方法: 发送端使用Nagle算法,当发送包长度小于 关于粘包问题: 因为要解决糊涂窗口而使数据积攒发送,或收端不及时接受缓存区数据而同时接收多个包,会导致发送的原数据接收后拼接在一起无法分离。 解决方法: 当数据传输是一次交互后立即断开(多个Client与一个Server)时,数据无结构时(文件传输,一方发另一方收),使用UDP时(有消息边界)不会产生粘包问题; 发送端设置强制数据立即发送,不必等待缓存区满
一、抓包 通过Wireshark这个抓包工具演示下正常能抓到tcp三次握手,能看到的内容是不是和上篇文章tcp三次握手中用图画出来的内容是一样的呢? 现在就抓个包详细得讲解下。 随意看下某个tcp连接,它的三次握手的过程。 我就看这个,怎么过滤出来这一个连接呢? 二、详解tcp3次握手 第1个报文,请求连接消息:syn: 显示出来这是个syn包: syn包用来发起连接请求的,客户端向服务器发起连接请求,syn标志位置1。看下标志位置1是什么样子的。 双击它,点开看下: syn,ack包与syn包对比: 第3个报文,确认消息:ack 客户端发给服务器的: seq=1,是因为syn,ack包中确认号是1,表示我希望你收到下一个包的序列号是1。 第4个,http报文: 三次握手之后,直接是个http的报文: 传输层已经建立完tcp连接,那应用层才能去在它的这个连接基础上面,去发送http的请求。 以上就是tcp3次握手的过程。
using PMKID 根据Hashcat官方论坛文章介绍,作者在研究WPA3安全标准时,意外发现的使用PMKID破解WPA预共享密钥的方法,与现有的其它破解方法不同,该方法不再需要抓取完整的EAPOL四次握手包 该方法注意的优势如下: 1.攻击者直接与AP通信,无需普通用户参与(即“无客户端”攻击); 2.无需等待普通用户与AP完成四次握手; 3.无需重传EAPOL帧(重传可能导致无法破解); 4.无需普通用户发送无效密码 相关工具 该攻击方法需要用到以下几个工具: 1.hcxdumptool v4.2.0 or higher; 2.用于抓包并保存为Hashcat破解可用的格式; 3.支持的无线网卡: USB ID 148f 、AP的MAC地址及基站的MAC地址拼接组成,计算公式如下: PMKID = HMAC-SHA1-128(PMK, "PMK Name" | MAC_AP | MAC_STA) 因为PMK和普通的四次握手中的相同 如果AP接受到攻击端的协商请求包并支持发送PMKID,过一会儿将看到“FOUND PMKID”的提示。 ?
握手过程中采用非对称加密,得到一个对称加密的秘钥。数据传输的过程中,采用对称加密。 握手: 对称加密秘钥的生成: 握手期间,client与server两次往来。会生成三个随机数,由这三个随机数组成对称加密的秘钥。 数据传输: http报文的内容都会经过TLS层进行对称加密,秘钥是握手时生成的。发送使用秘钥加密,接收时使用秘钥解密。 前两个随机数可以被抓包拿到,但是第三个随机数已经使用非对称加密算法加密过,所以最终生成的秘钥是保密的。 现在的问题就是,对称秘钥的安全靠第三个随机数的不可破解来保证。 但是为了足够安全,我们可以考虑把握手阶段的算法从默认的RSA算法,改为 Diffie-Hellman算法(简称DH算法)。 下面是DH算法握手的过程: ?
机器 A 192.168.75.119 场景1:抓取网卡 80 端口数据包,观察3次握手4次挥手过程 命令 tcpdump -nn -i venet0:0 port 80 命令解释 -nn 两个 n 表示不解析域名和端口 方便查看 IP 和端口号 -i 要抓取的接口,上述命令抓取 venet0:0 网卡 port 端口过滤器 机器 A 执行抓包命令,另开一个终端执行 curl 百度,以下为机器 A 抓包的输出 xxx@root 18.699755 IP 180.101.49.12.80 > 192.168.75.119.43670: Flags [R], seq 3139177705, win 0, length 0 3 次握手过程 方便查看 IP 和端口号 -s0 获取报文全部内容 -A 以ASCII格式打印每个数据包,方便查看数据包内容 -i 要抓取的接口,上述命令抓取 venet0:0 网卡 port 端口过滤器 机器 A 执行抓包命令 核心过程1:除去 3 次握手部分,往下看,机器 A 向百度发送 http 头 20:02:49.886390 IP 192.168.75.119.45332 > 180.101.49.12.80: Flags
这些异常场景共分为两大类,第一类是 TCP 三次握手期间的异常,第二类是 TCP 四次挥手期间的异常。 TCP 三次握手期间的异常 我们先来看看 TCP 三次握手的过程。 当第五次超时重传后,会继续等待 32 秒,如果服务端仍然没有回应 ACK,客户端就不再发送 SYN 包,然后断开 TCP 连接。 第二次握手的 SYN-ACK 报文其实有两个目的 : 第二次握手里的 ACK, 是对第一次握手的确认报文; 第二次握手里的 SYN,是服务端发起建立 TCP 连接的报文; 所以,如果第二次握手丢了,就会发送比较有意思的事情 因为第二次握手报文里是包含对客户端的第一次握手的 ACK 确认报文,所以,如果客户端迟迟没有收到第二次握手,那么客户端就觉得可能自己的 SYN 报文(第一次握手)丢失了,于是客户端就会触发超时重传机制, 因为这个第三次握手的 ACK 是对第二次握手的 SYN 的确认报文,所以当第三次握手丢失了,如果服务端那一方迟迟收不到这个确认报文,就会触发超时重传机制,重传 SYN-ACK 报文,直到收到第三次握手,
TCP协议在双方建立连接的时候需要三次握手,首先客户端发送SYN标志为1的TCP数据包,然后服务器端收到之后,也会发送一个SYN标志置位,并且带有ack应答的数据包,最后客户端再发送给服务端一个应答, 首先看TCP数据包头部各个字段: 在三次握手和四次挥手过程中,主要看UAPRSF6个标志和seq ack的变化。 看最后一次握手,客户端发送给服务器端的确认 192.168.0.10.53548 > 14.215.177.39.https: Flags [.], cksum 0x80cb (incorrect - > 0xc571), seq 1, ack 1, win 229, length 0,发现没了选项字段,说明在默认情况下,选项字段是在三次握手中前两次握手时确定了双方的各种属性。 而抓包结果是第二和第三也就是服务端发送的ack和FIN合并成了一个报文。
finis ['faɪnɪs] 终结 2、三次握手连接 ? 注 1.连接开始时,连接建立方(Client)发送SYN包,并包含了自己的初始序号x; 2.连接接受方(Server)收到SYN包以后会回复一个SYN包,其中包含了对上一个x包 的回应信息ACK,回应的序号为下一个希望收到包的序号 ,即x+1,然后还包含 了自己的初始序号y; 3.连接建立方(Client)收到回应的SYN包以后,回复一个ACK包做响应,其中包含了下一个希望收到包的序号即y+1。 3.服务器B向客户A发送断开连接请求,包中FIN=1,seq=w,ack = u+1。 4.A收到后回复一个确认信息,发送包,ack=w+1,并进入TIME_WAIT状态。 4、使用tcpdump抓包查看tcp三次握手过程 4.1建立连接 [root@docker-01 ~]# yum install tcpdump [root@docker-01 ~]# ssh root
SSL握手 过程 客户端给出协议版本号, 客户端生成的随机数(client random), 以及客户端支持的加密方式. 握手之后的对话使用对话密钥(session secret)加密, 是对称加密. 服务器的公钥和私钥只用于加密和解密对话密钥, 是非对称加密, 没有其他作用. 整个握手阶段都不加密(也没法加密), 是明文传输的. 因此如果有人偷听到了, 就可以知道双方的加密方式和两个随机数(client random 和 server random).
websocket的握手流程 上面我们讲过了,websocket是从HTTP协议升级的,客户端通过发送: Upgrade: websocket Connection: Upgrade 到服务器端,对协议进行升级
先来一张握手图: image.png image.png 对应的wireshake中的握手记录 image.png 1. 02 00 - 表示512字节的握手消息 image.png 1.2 Handshake Header 每个握手消息都以类型和长度开始。 在握手时,客户端和服务器都会提供随机数。这种随机性对每次握手都是独一无二的,在身份验证中骑着举足轻重的作用。它可以防止重放攻击,并确认初始数据交换的完整性。 16 -类型是0x16(握手记录) 03 03 -协议版本是“3,3”(TLS 1.2) 00 31 - 0x31(49)字节的握手消息 2.2 Handshake Header 每个握手消息都以类型和长度开始 16 -类型是0x16(握手记录) 03 03 -协议版本是“3,3”(TLS 1.2) 03 2f - 0x31(49)字节的握手消息 3.2 Handshaker Heade 每个握手消息都以类型和长度开始
一 点睛 握手协议是TLS握手协议的一部分,负载生成共享密钥以及交换证书。其中,生成共享密钥是为了进行密码通信,交换证书是为了通信双方相互进行认证。 握手协议这一名称中的“握手”,是服务器和客户端在密码通信之间交换一些必要信息这一过程比喻。 实际上,ChangeCipherSpec消息并不是握手协议的消息,而是密码规格变更协议消息。 通过这一消息,就可以确认握手协议是否正常结束,密码套件的切换是否正确。 从结果来看,握手协议完成了下列操作。 客户端获得服务器合法公钥,完成了服务器认证。
抓包过程 使用了 Wireshark 进行抓包,用两个最常用的 curl 和 ping 命令来演示抓包情况,开启抓包。 抓包分析 TCP 首部分析 ? TCP包首部内容一一对应 ? 下一个请求包的序列号 = 上一个请求包序列号 + 数据长度 请求应答过程如下 ? 请求应答 确认号就是用来确认回复哪个序列号的多大的数据包,所以Ack=请求包的Seq+数据长度 。 ,优先处理此包的命令。 Seq = 同一端上一个包的序列号+数据长度; 下一个包的Seq = 上一个应答包的Ack 涨姿势:借助wireshark的分析工具,点击 wireshark 的 Statistic 下面的Follow
IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。 如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责。 UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。 7. 小结 TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。 不使用「两次握手」和「四次握手」的原因: 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号; 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数 当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。
对于IT从业者来说,TCP/IP是几乎所有IT人都绕不开的话题,TCP/IP协议更是互联网发展的基础,而不论是工作还是面试,TCP三次握手也是不得掌握的知识点,下面将来讨论一下TCP的三次握手 : 一、TCP包头结构 端口号:范围0~65535,即2^16 序号:TCP进程生成的顺序编号 确认号:为了确保数据正确接收而产生的数字编号 二、握手过程 第一次握手: 客户端发起连接请求 完成三次握手,客户端和服务端之间便可以进行数据传输了 三、常见问题 为什么TCP需要三次握手? 第三次握手ACK包丢失,会怎么样? 服务端会一直重传 SYN和ACK 包,重传次数超过阈值后放弃,关闭连接; 而客户端会分下列两种情况: (1)未开启会话保持:客户端会一直重传报文,直至重传次数超过阈值后关闭 TCP连接
三次握手 第一次:客户端发送请求给服务端,确定服务端可以接收到消息 第二次:服务端收到客户端的请求后,做出回应 第三次:客户端发送请求给服务端,建立TCP连接 最基础的是两次握手,那么为什么客户端还会向服务器发送一次请求呢 第三次握手是为了防止已经失效的客服端请求又被发送到了服务端,从而发生错误。 假设没有第三次握手会怎样? 客户端发送的第一次请求因为网络延迟等原因迟迟没有发送到服务端,因为服务端没有接受到客户端的请求,就不会给客户端回应,没有收到回应的客户端就再次给服务端发送了一个请求,等待网络通畅后,失效的报文和正确的报文一起被发送到了服务端,如果只握手两次 ,你的好友回复“在的”,你回复“我也在”,好了确定你俩都在线可以开始聊天了,这就是三次握手。 如果是你发送“在吗?” 这就是两次握手会造成的问题。
,是第一次握手,也就是说小萌你的发送消息的能力没有问题,然后我回了你一句“小萌,我可以听到你说话,你能听到我说话吗?” 这是第二次握手,我回了你一句,说明了我可以听到你说话(说明了我具有接受消息的能力),我对你说了“你能听到我说话吗”也说明了我这里也有可以发送消息的能力。 到第二次握手结束,说明了我具有发送消息和接受消息的能力,小萌你具有发送消息的能力。然后你说“乔哥,我听到你说话了”,这是第三次握手,你听到我说话,也就是说明小萌你的接受消息的能力没有问题。 小萌:1.两次握手,这个我想是因为服务器收到了客户端的消息,服务器知道了客户端是可以发送消息的,但由于没有第三次握手,所以服务器不知道客户端是否具有接受消息的能力;2.客户端从服务器接受到了消息,客户端知道了服务器接受到了我的消息才回复 这次没有阻塞,成功连接了,因为是讨论的两次握手,所以只进行两次连接就可以进行通信了。 通信结束,然后就断开了连接。