从wireshake分析http和https的通信过程

参考文章:

  • Wireshark基本介绍和学习TCP三次握手
  • 【技术流】Wireshark对HTTPS数据的解密
  • Wireshark/HTTPS
  • Journey to HTTP/2
  • 以TCP/IP协议为例,如何通过wireshark抓包分析?
  • TCP三次握手和四次挥手
  • Https详解+wireshark抓包演示

前言

面试被问到有没有用过抓包工具, 还真没有... 弥补一波. 一直以来看http和https的介绍, 都是文章, 然后图片, 理解的也不深入. 借此一个机会, 深入理解下.

入行不久, 写的哪里不对的, 请谅解. 还望各位路过的大佬帮忙指出, 十分感谢.

软件使用

软件使用分析

我刚开始用, 哪里不对的. 望大神们见谅.

软件图片介绍

各层介绍

操作步骤

在官网中有很舒服的操作原理说明: Wireshark/HTTPS

  1. 安装Wireshark
  2. 装个浏览器就行了
  3. 点击开始捕获, 右上角, 鲨鱼标志
  4. 在浏览器中输入http://www.cnblogs.com/zhangrunhao/
  5. 或者是https
  6. 页面渲染完成后, 点击停止捕获
  7. 在筛选栏中输入http, 看到一个infoGET /zhangrunhao/ HTTP/1.1
  8. 记录下请求的ip. (注: 当你找不到ip的时候, 不要慌, 尝试 ping <域名>即可, 例如: ping www.cnblogs.com)
  9. 筛选栏中改为ip.addr == <记录下的ip地址>
  10. 大概你就可以看到你想要的了.

图片03

大概了解tcp字段

具体的tcp协议的讲解, 可以参考TCP协议

tcp协议中的各个字段.
这篇文章中需要用到的三个字段:

  • sequence number: 序列号

    占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400;序号是32bit的无符号数,序号到达2^32-1后从0开始.

  • Acknowledgment number: 确认码

    占4字节, 是期望收到对方下次发送的数据的第一个字节的序号, 也就是期望收到的下一个报文段的首部中的序号. 确认序号应该是上次已成功收到数据字节序号+1. 只有ACK标志为1时, 确认序号才有效.

  • Flag: 标志位.(共用6个标志位, 我们只看需要用的几个.)
    • ACK:只有当ACK=1时,确认序号字段才有效
    • SYN:SYN=1,ACK=0时表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段.
    • FIN:发端完成发送任务。

    tcp数据包的各个字段

HTTP协议中TCP握手过程

三次握手的简单建立过程: 所有的TCP链接都是通过三次握手开始的, 也就是客户端和服务器在发送应用数据之前, 发送一系列的数据包.

图片

一次完整的三次握手的过程就完成了, 客户端和服务器端的数据就可以开始传输了. 需要注意的是, 客户端一旦发送完最后一个ACK数据包, 就立即开始发送应用数据, 但是服务器端需要等到最后一个ACK包接受完成才会去响应请求.

抓包看三次握手

  • 第一次握手:

    图片04
    客户端向服务器发出请求建立的链接, 标志为是SYN, 这个时候报文中的同部位SYN=1, 然后我们的序列号也回生成好, seq=x. 这个时候, 三次握手也就开始了.

  • 第二次握手:

    图片05
    服务器收到请求, 并发送给客户端确认报文. 在确认的报文中, 标志位应该为ACK SYN, 因为此时还没有携带数据, 所以这个时候, ack = seq(x, 客户端发送过来的那个) + 1, 并在这条报文中初始化序列号, seq = y. 发送给客户端, 让客户端用来确认, 我们第二次握手的请求建立过程. 询问下客户端是否准备完成了.

  • 第三次握手:

    图片06
    客户端收到服务器发送过来的第二次握手的tcp请求, 再次向服务器发送确认. 只是确认的时候, 标志为只需要是ACK, 同时生成确认序号: ack = y(这里的y, 是服务器第二次握手发送过来的seq) + 1. 这里表示客户端, 已经准备好了.

  • 题外话: 为什么是三次握手, 而不是两次?

    因为在我们第一次客户端发送握手请求的时候, 会出现网络情况不好, 发了很久才给服务器. 服务器收到请求后, 就会发送确认收到. 后面就会一直傻傻等待客户端传数据过来, 其实不知道, 这条请求链接在客户端那边已经作废了. 从而造成资源的浪费.

抓包看四次挥手

four-shark

在实际的捕获中, 只抓到三个tcp的数据包, 有资料讲解, 服务器给客户端确认关闭, 并向客户端发起关闭请求的的链接合并成了一个. 也就是第二和第三次挥手, 都是由服务器端发送给客户端的, 这个时候合并成了一个请求.

图片07

  • 第一次挥手:

    图片08

    第一次挥手的过程, 是客户端向服务器端发起请求. 发送一个带有FIN ACK标志位tcp包. 我们可以看到这个时候seq = 1; ack = 1. 表示, 凡是带有FIN标志位的tcp包, 都是为了告诉另一端, 我再没有数据需要传递给你了.

  • 第二次挥手和第三次挥手:

    图片09

    本来, 第二次挥手是, 服务器用来确认客户端发送过来的请求的.然后再告诉客户端, 服务器也没什么好给你的东西了. 我理解的, 这应该是一种资源的优化, 既然都是服务器发送给客户端, 如果再服务器确认之后, 确实也没有要发送的了, 就直接一起发送过去了.变成了seq=1, ack=2. 标志位是FIN ACK, 其中ack = 2表示确认第一次挥手.

  • 第四次挥手:

    图片10

    这是我们的最后一次挥手过程, 由客户端向服务器发送确认过程. 标志位ACK, 表示, 这是一个用于确认的tcp包. 发送ack(确认二三次挥手seq + 1) = 2. 至此一次完整的http通信过程就全部完成了.

  • 那么问题来了: 为什么是四次挥手, 而不是三次呢?

    因为, 在挥手的过程中, 第一次挥手的时候, 客户端发送向了服务器端不需要通信的请求. 服务器端通过第二次挥手确认了收到. 但并不能保证, 服务器端再没有需要给客户端发送的信息了啊. 只是表明了, 客户端没有要发送给服务器的数据了, 服务器知道了. 但是服务器没有需要给客户端的数据, 就需要通过第三次挥手来表示. 客户端回复收到. 至此才算完完全全的完成.

HTTPS中的TCP交互过程

一句话概况: 通过非对称加密的方式来传递对称加密所需要的秘钥.

我懒, 还是贴图好了(原谅我这名盗图狗), 等会我们在抓包的过程中逐步分析.

https图解

注意一点: ssl / tls的交互过程, 是在完成我们上面的三次握手开始的.

具体的抓包分析

此过程完全参考了Wireshark中关于HTTPS的操作说明.

步骤1: 捕获HTTPS

  1. 打开一个新的浏览器窗口或者tab页.
  2. 开始捕获.
  3. 浏览器导航到https://en.wikiversity.org.
  4. 停止捕获.
  5. 关闭浏览器窗口或者tab页.

步骤2: 确定你要捕获的那个流量通道

  1. 在Wireshark最上面的列表中观察捕获到的链接列表. 为了只观察HTTPS的请求, 在筛选栏中输入ssl, 然后回车.
  2. 选择第一个带有Client Hello标志的TLS包.
  3. 观察IP地址.
  4. 为了观察所有这个链接的tcp请求, 在筛选框中输入ip.addr == <destination> destination是指, 我们的ip地址.

图片11

说两个事:

  • 为什么筛选ssl, 出现大量的tsl? tsl是以建立在sslV3.0的基础上, 两者的加密算法和MAC算法都不一样, 而协议本身差异性不大.
  • 我还是感觉, 命令行, 直接ping域名, 找ip, 比较方便哎~ ping en.wikiversity.org 多么舒服的做法..

步骤3: 分析tcp数据包

  1. 观察数据包列表, 看到最上面的三次握手. 也就是带有(SYN, SYN ACK, ACK)标志位的数据包.图片12
  2. 在中间的数据框中, 观察数据包的详细信息. 这里包含了, 物理层, 网络层, 传输层的详细信息.
  3. 展开 Ethernet II, 查看以太网, 数据链路层的详细信息.
  4. 我们可以看到本机和服务器的MAC地址.你可以使用ipconfig /allarp -a进行确认图片13
  5. 展开Internet Protocol Version 4这一层, 查看网络层的详情.
  6. 你可以看到你的ip地址, 和服务器的ip地址. 图片14
  7. 展开Transmission Control Protocol, 你可以看到传输层的详细信息.
  8. 你可以看到本机提供的端口号, 和服务器的端口号(443).图片15
  9. 注意: 所有的tcp数据包, 都含有匹配的MAC地址, ip地址, 端口号.

步骤4: 分析SSL/TLSClient Hello数据包

  1. 双击打开, 带有Client Hello标识的tsl数据包. 这里还有, 物理层, 链路层, 网络层, 传输层, 安全传输层的信息, 这里和步骤三中的各项数据保持一致.
  2. 展开安全传输层, TLS和握手协议, 去查看SSL/TLS中的详细数据.
  3. 可以观察到客户端支持的各种加密方式.图片16
  4. 观察下一个带有TCP ACK标识的tcp数据包, 那是服务器端对于收到客户端请求的回应.

步骤5: 分析SSL/TLSServer Hello数据包

  1. 双击打开, 带有Server Hello标识的数据包.
  2. 依照我们上面的经验, 应该清楚我们要观察Secure Sockets Layer, 也就数安全数据层.
  3. 这个时候, 服务器端返回了他所支持的加密方式, 是客户端所传递的一个子集. 肯定要两边都行的嘛.图片17

步骤6: 分析SSL/TLS 交换证书的阶段

  1. 双击, 打开带有Certificate, Server Key Exchange, Server Hello Done.标识的数据包.
  2. 展开Secure Sockets Layer, 让我们来仔细观察安全层所携带的数据.
  3. 我们可以看到这一次tcp上面, tsl的数据包含了三块: 分别是: 证书, 非对称加密的公钥(Server Key), 还有一个服务器信息结束标识.
  4. 我们可以看到证书提供的信息.图片18
  5. 我们还可以看到我们的公钥信息!. 图片19
  6. 客户端使用证书来验证公钥和签名. 这些工作浏览器会帮助我们进行处理.

步骤7: 客户端的秘钥交换

  1. 双击打开, 带有Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message标识的tcp数据包.
  2. 这一次的交互中, 客户端使用公钥对将对称加密的秘钥进行加密, 并发送给了服务器.
  3. 从抓包上来看: 具体过程应该是, 客户端的秘钥交换, 然后更改加密规范, 然后对与握手的信息进行了加密.(对于, tls层的操作还需要深入理解, 再次不再深究. 有希望继续学习的小伙伴, 留个言, 我们一起搞起来)
  4. 图片20

步骤8: 开始数据交互

  • 后面就是带有Application Data的数据之间的传递了, 此时的数据都是经过加密的.
  • 留个疑问, 有些交互过程带有New Session Ticket.标识的数据包, 服务器用来确定加密信息, 有些不带有, 还不是很清楚的具体原因. 有待学习, 有待学习.

总结

不会的地方可真多... 文章若有错误的地方, 还望大家能够帮忙指出. 大恩不言谢, 他日以身相许.

转载于:https://www.cnblogs.com/zhangrunhao/p/10428759.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java对象的序列化和反序列化

原文&#xff1a;https://www.cnblogs.com/xdp-gacl/p/3777987.html 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。  把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途&#xff1a; 1&#xff09; 把对象的字节序列永…

安装oracle 11g时,报启动服务出现错误,找不到OracleMTSRecoveryService的解决方法

1、打开注册表看看&#xff1a;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下&#xff0c;找到OracleMTSRecoveryService及OracleRemExecService&#xff0c;查看ImagePath对应路径。 2、修改ImagePath路径为xxxxxxx\dbhome_1\bin\xxxxxxxxx即可【修改为你本地真实路…

django系列5.1--ORM对数据库的操作

Django--—ORM数据库操作(图书管理系统基本实例) 一.基本知识 MVC模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff…

蓝桥杯第七届决赛JAVA真题----路径之谜

路径之谜小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。【如图1.png】所示。按习俗&#xff0c;骑士要从西北角走到东南角。 可以横向或纵向移动&#xff0c;但不能斜着走&…

蓝桥杯第七届决赛JAVA真题----广场舞

广场舞LQ市的市民广场是一个多边形&#xff0c;广场上铺满了大理石的地板砖。 地板砖铺得方方正正&#xff0c;就像坐标轴纸一样。 以某四块砖相接的点为原点&#xff0c;地板砖的两条边为两个正方向&#xff0c;一块砖的边长为横纵坐标的单位长度&#xff0c;则所有横纵坐标都…

oracle的关键字

oracle使用管理员执行下面命令&#xff0c;就能获得oracle的关键字&#xff1a; select * from v$reserved_words order by keyword asc; 以下是oracle 11.2.0.1.0中执行的结果&#xff08;供参考&#xff09;&#xff1a; 转载于:https://www.cnblogs.com/zhaoqian49/p/104490…

poj1279

板子题&#xff0c;求多边形内核面积。 话说jls的板子返回的是边&#xff0c;然后我就在冥思苦想怎么根据割边求面积啊。。 然后发现自己果然是个傻逼&#xff0c;求一下交点存起来就好了。。。 //板子题到此为止了 1 #include <iostream>2 #include <cstdio>3 #in…

回溯法在解决八皇后问题中的应用

回溯法&#xff1a;有这样一类题目&#xff0c;它们要求在相对问题的输入规模按照指数速度增长&#xff08;或者更快&#xff09;的域中&#xff0c;找出一个具有指定特性的元素。例如&#xff1a;在图顶点的所有排列中求一个哈密顿回路&#xff0c;在背包问题的一个实例中求其…

python数据结构与算法之问题求解

懂得计算机的童鞋应该都知道&#xff0c;一条计算机程序由数据结构跟算法两大部分组成。所以&#xff0c;其实不管你使用哪种计算机语言编写程序&#xff0c;最终这两部分才是一个程序设计的核心。所以&#xff0c;一个不懂得数据结构与算法的程序员不是一个好工程师。因此&…

运用tp5上传图片,并生成缩略图

最近想做个相册&#xff0c;需要用到上传图像&#xff0c;并且考虑到性能问题&#xff0c;还要生成缩略图&#xff0c;就学习下。在网上看了很多大神写的文章&#xff0c;经过各种调试总算出来了&#xff0c;分享下。不好之处&#xff0c;多多指教 ​ ​ ps&#xff1a;运用tp5…

求解最长回文子串----Manacher 算法

最长回文子串问题&#xff1a;给定一个字符串&#xff0c;求它的最长回文子串长度。 如果一个字符串正着读和反着读是一样的&#xff0c;那么我们称之为回文串。例如&#xff1a;abba、aaaa、abvcba、123321等 暴力法&#xff1a;遍历字符串的所有子串&#xff0c;对每个字串进…

Peter's smokes -poj 2509

题意&#xff1a;彼得有n支雪茄&#xff0c;每k个烟头可以换一支新雪茄&#xff0c;问彼得最多可以吸多少支雪茄 &#xff1f; 当时自己做时&#xff0c;错在了直接在while循环开始前&#xff0c;便将雪茄的初始数量给加上了&#xff0c;然而应该是先处理后再加上最终剩余的雪茄…

模式匹配算法----KMP算法以及next数组的解法

KMP算法&#xff1a;求字符串匹配&#xff08;也叫模式匹配&#xff09;的算法&#xff0c;即给定一个字符串&#xff0c;求其某一子串在其中出现的位置。 普通模式匹配 例如&#xff1a;给定字符串为abcabaaabaabcac&#xff0c;求其子串abaabcac在其中出现的位置。 结果为…

Spring Boot使用layui的字体图标时无法正常显示 解决办法

在html文件使用字体图标并且预览时正常&#xff0c;但是启动工程后显示不正常&#xff0c;浏览器调试界面显示字体文件无法decode&#xff1a; Failed to decode downloaded font: xxxxx 如图所示&#xff1a; 显示结果&#xff1a; 原因&#xff1a;经过maven的filter&#xf…

蓝桥杯第七届国赛JAVA真题----机器人塔

机器人塔X星球的机器人表演拉拉队有两种服装&#xff0c;A和B。 他们这次表演的是搭机器人塔。 类似&#xff1a;队内的组塔规则是&#xff1a; A 只能站在 AA 或 BB 的肩上。B 只能站在 AB 或 BA 的肩上。你的任务是帮助拉拉队计算一下&#xff0c;在给定A与B的人数时&…

Python divmod() 函数

Python divmod() 函数 Python 内置函数 python divmod() 函数把除数和余数运算结果结合起来&#xff0c;返回一个包含商和余数的元组(a // b, a % b)。 在 python 2.3 版本之前不允许处理复数。 函数语法 divmod(a, b)参数说明&#xff1a; a: 数字b: 数字实例 >>>div…

蓝桥杯第六届省赛JAVA真题----垒骰子

垒骰子 赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。 经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01; 我们先来规范一下骰子&#xff1a;1 …

并发队列、线程池、锁

1、CountDownLatch(计数器) CountDownLatch 类位于java.util.concurrent包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务A&#xff0c;它要等待其他任务执行完毕之后才能执行&#xff0c;此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是…

蓝桥杯第七届省赛JAVA真题----剪邮票

剪邮票 如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来&#xff0c;要求必须是连着的。 &#xff08;仅仅连接一个角不算相连&#xff09; 比如&#xff0c;【图2.jpg】&#xff0c;【图3.jpg】中&#xff0c;粉红色所示部分就是合格的剪取。 请你…

目标检测之YOLO V2 V3

YOLO V2 YOLO V2是在YOLO的基础上&#xff0c;融合了其他一些网络结构的特性&#xff08;比如&#xff1a;Faster R-CNN的Anchor,GooLeNet的\(1\times1\)卷积核等&#xff09;&#xff0c;进行的升级。其目的是弥补YOLO的两个缺陷&#xff1a; YOLO中的大量的定位错误和基于区域…