从wireshake分析http和https的通信过程
参考文章:
前言
面试被问到有没有用过抓包工具, 还真没有... 弥补一波. 一直以来看http和https的介绍, 都是文章, 然后图片, 理解的也不深入. 借此一个机会, 深入理解下.
入行不久, 写的哪里不对的, 请谅解. 还望各位路过的大佬帮忙指出, 十分感谢.
软件使用
软件使用分析
我刚开始用, 哪里不对的. 望大神们见谅.
操作步骤
在官网中有很舒服的操作原理说明: Wireshark/HTTPS
- 安装Wireshark
- 装个浏览器就行了
- 点击开始捕获, 右上角, 鲨鱼标志
- 在浏览器中输入
http://www.cnblogs.com/zhangrunhao/
- 或者是
https
- 页面渲染完成后, 点击停止捕获
- 在筛选栏中输入http, 看到一个
info
是GET /zhangrunhao/ HTTP/1.1
- 记录下请求的ip. (注: 当你找不到ip的时候, 不要慌, 尝试
ping <域名>
即可, 例如:ping www.cnblogs.com
) - 筛选栏中改为
ip.addr == <记录下的ip地址>
- 大概你就可以看到你想要的了.
大概了解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:发端完成发送任务。
HTTP协议中TCP握手过程
三次握手的简单建立过程: 所有的TCP
链接都是通过三次握手开始的, 也就是客户端和服务器在发送应用数据之前, 发送一系列的数据包.
一次完整的三次握手的过程就完成了, 客户端和服务器端的数据就可以开始传输了. 需要注意的是, 客户端一旦发送完最后一个ACK
数据包, 就立即开始发送应用数据, 但是服务器端需要等到最后一个ACK
包接受完成才会去响应请求.
抓包看三次握手
第一次握手:
客户端向服务器发出请求建立的链接, 标志为是SYN
, 这个时候报文中的同部位SYN=1
, 然后我们的序列号也回生成好,seq=x
. 这个时候, 三次握手也就开始了.第二次握手:
服务器收到请求, 并发送给客户端确认报文. 在确认的报文中, 标志位应该为ACK SYN
, 因为此时还没有携带数据, 所以这个时候,ack = seq(x, 客户端发送过来的那个) + 1
, 并在这条报文中初始化序列号,seq = y
. 发送给客户端, 让客户端用来确认, 我们第二次握手的请求建立过程. 询问下客户端是否准备完成了.第三次握手:
客户端收到服务器发送过来的第二次握手的tcp请求, 再次向服务器发送确认. 只是确认的时候, 标志为只需要是ACK
, 同时生成确认序号:ack = y(这里的y, 是服务器第二次握手发送过来的seq) + 1
. 这里表示客户端, 已经准备好了.题外话: 为什么是三次握手, 而不是两次?
因为在我们第一次客户端发送握手请求的时候, 会出现网络情况不好, 发了很久才给服务器. 服务器收到请求后, 就会发送确认收到. 后面就会一直傻傻等待客户端传数据过来, 其实不知道, 这条请求链接在客户端那边已经作废了. 从而造成资源的浪费.
抓包看四次挥手
在实际的捕获中, 只抓到三个tcp的数据包, 有资料讲解, 服务器给客户端确认关闭, 并向客户端发起关闭请求的的链接合并成了一个. 也就是第二和第三次挥手, 都是由服务器端发送给客户端的, 这个时候合并成了一个请求.
第一次挥手:
第一次挥手的过程, 是客户端向服务器端发起请求. 发送一个带有
FIN ACK
标志位tcp包. 我们可以看到这个时候seq = 1; ack = 1
. 表示, 凡是带有FIN标志位的tcp包, 都是为了告诉另一端, 我再没有数据需要传递给你了.第二次挥手和第三次挥手:
本来, 第二次挥手是, 服务器用来确认客户端发送过来的请求的.然后再告诉客户端, 服务器也没什么好给你的东西了. 我理解的, 这应该是一种资源的优化, 既然都是服务器发送给客户端, 如果再服务器确认之后, 确实也没有要发送的了, 就直接一起发送过去了.变成了
seq=1, ack=2
. 标志位是FIN ACK
, 其中ack = 2
表示确认第一次挥手.第四次挥手:
这是我们的最后一次挥手过程, 由客户端向服务器发送确认过程. 标志位
ACK
, 表示, 这是一个用于确认的tcp包. 发送ack(确认二三次挥手seq + 1) = 2
. 至此一次完整的http通信过程就全部完成了.那么问题来了: 为什么是四次挥手, 而不是三次呢?
因为, 在挥手的过程中, 第一次挥手的时候, 客户端发送向了服务器端不需要通信的请求. 服务器端通过第二次挥手确认了收到. 但并不能保证, 服务器端再没有需要给客户端发送的信息了啊. 只是表明了, 客户端没有要发送给服务器的数据了, 服务器知道了. 但是服务器没有需要给客户端的数据, 就需要通过第三次挥手来表示. 客户端回复收到. 至此才算完完全全的完成.
HTTPS中的TCP交互过程
一句话概况: 通过非对称加密的方式来传递对称加密所需要的秘钥.
我懒, 还是贴图好了(原谅我这名盗图狗), 等会我们在抓包的过程中逐步分析.
注意一点: ssl / tls
的交互过程, 是在完成我们上面的三次握手开始的.
具体的抓包分析
此过程完全参考了Wireshark中关于HTTPS的操作说明.
步骤1: 捕获HTTPS
- 打开一个新的浏览器窗口或者tab页.
- 开始捕获.
- 浏览器导航到
https://en.wikiversity.org
. - 停止捕获.
- 关闭浏览器窗口或者tab页.
步骤2: 确定你要捕获的那个流量通道
- 在Wireshark最上面的列表中观察捕获到的链接列表. 为了只观察HTTPS的请求, 在筛选栏中输入
ssl
, 然后回车. - 选择第一个带有
Client Hello
标志的TLS包. - 观察IP地址.
- 为了观察所有这个链接的tcp请求, 在筛选框中输入
ip.addr == <destination>
destination是指, 我们的ip地址.
说两个事:
- 为什么筛选ssl, 出现大量的tsl? tsl是以建立在sslV3.0的基础上, 两者的加密算法和MAC算法都不一样, 而协议本身差异性不大.
- 我还是感觉, 命令行, 直接ping域名, 找ip, 比较方便哎~
ping en.wikiversity.org
多么舒服的做法..
步骤3: 分析tcp数据包
- 观察数据包列表, 看到最上面的三次握手. 也就是带有(SYN, SYN ACK, ACK)标志位的数据包.
- 在中间的数据框中, 观察数据包的详细信息. 这里包含了, 物理层, 网络层, 传输层的详细信息.
- 展开 Ethernet II, 查看以太网, 数据链路层的详细信息.
- 我们可以看到本机和服务器的MAC地址.你可以使用
ipconfig /all
和arp -a
进行确认 - 展开
Internet Protocol Version 4
这一层, 查看网络层的详情. - 你可以看到你的ip地址, 和服务器的ip地址.
- 展开
Transmission Control Protocol
, 你可以看到传输层的详细信息. - 你可以看到本机提供的端口号, 和服务器的端口号(443).
- 注意: 所有的tcp数据包, 都含有匹配的MAC地址, ip地址, 端口号.
步骤4: 分析SSL/TLS
Client Hello数据包
- 双击打开, 带有
Client Hello
标识的tsl数据包. 这里还有, 物理层, 链路层, 网络层, 传输层, 安全传输层的信息, 这里和步骤三中的各项数据保持一致. - 展开安全传输层, TLS和握手协议, 去查看SSL/TLS中的详细数据.
- 可以观察到客户端支持的各种加密方式.
- 观察下一个带有
TCP ACK
标识的tcp数据包, 那是服务器端对于收到客户端请求的回应.
步骤5: 分析SSL/TLS
Server Hello数据包
- 双击打开, 带有
Server Hello
标识的数据包. - 依照我们上面的经验, 应该清楚我们要观察
Secure Sockets Layer
, 也就数安全数据层. - 这个时候, 服务器端返回了他所支持的加密方式, 是客户端所传递的一个子集. 肯定要两边都行的嘛.
步骤6: 分析SSL/TLS 交换证书的阶段
- 双击, 打开带有
Certificate, Server Key Exchange, Server Hello Done.
标识的数据包. - 展开
Secure Sockets Layer
, 让我们来仔细观察安全层所携带的数据. - 我们可以看到这一次tcp上面, tsl的数据包含了三块: 分别是: 证书, 非对称加密的公钥(Server Key), 还有一个服务器信息结束标识.
- 我们可以看到证书提供的信息.
- 我们还可以看到我们的公钥信息!.
- 客户端使用证书来验证公钥和签名. 这些工作浏览器会帮助我们进行处理.
步骤7: 客户端的秘钥交换
- 双击打开, 带有
Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
标识的tcp数据包. - 这一次的交互中, 客户端使用公钥对将对称加密的秘钥进行加密, 并发送给了服务器.
- 从抓包上来看: 具体过程应该是, 客户端的秘钥交换, 然后更改加密规范, 然后对与握手的信息进行了加密.(对于, tls层的操作还需要深入理解, 再次不再深究. 有希望继续学习的小伙伴, 留个言, 我们一起搞起来)
步骤8: 开始数据交互
- 后面就是带有
Application Data
的数据之间的传递了, 此时的数据都是经过加密的. - 留个疑问, 有些交互过程带有
New Session Ticket.
标识的数据包, 服务器用来确定加密信息, 有些不带有, 还不是很清楚的具体原因. 有待学习, 有待学习.
总结
不会的地方可真多... 文章若有错误的地方, 还望大家能够帮忙指出. 大恩不言谢, 他日以身相许.
从wireshake分析http和https的通信过程的更多相关文章
- https协议通信过程
https协议通信过程 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组 ...
- 数字证书签发,授权等相关以及https建立通信过程
一直以来都对数字证书的签发,以及信任等事情一知半解.总算有个闲适的周末来总结和深入一下相关的知识. CA: CA(Certificate Authority)是证书的签发机构,它是负责管理和签发证书的 ...
- https的通信过程
https的特点 1. https有 握手阶段 和 请求阶段2. 握手阶段 使用 非对称加密算法 请求阶段 使用 对称加密算法3. 保证数据的完整性使用数字签名4. 握手阶段有两组非对称加密,数字证书 ...
- SSL、TLS协议格式、HTTPS通信过程、RDP SSL通信过程
相关学习资料 http://www.360doc.com/content/10/0602/08/1466362_30787868.shtml http://www.gxu.edu.cn/college ...
- SSL、TLS协议格式、HTTPS通信过程、RDP SSL通信过程(缺heartbeat)
SSL.TLS协议格式.HTTPS通信过程.RDP SSL通信过程 相关学习资料 http://www.360doc.com/content/10/0602/08/1466362_30787868 ...
- 性能测试基础 ---TCP通信过程的状态码与过程,以及出现错误码的分析(TIME_WAIT,CLOSE_WAIT)
TCP通信过程 如下图所示,TCP通信过程包括三个步骤:建立TCP连接通道(三次握手).数据传输.断开TCP连接通道(四次挥手). 这里进一步探究TCP三路握手和四次挥手过程中的状态变迁以及数据传输过 ...
- 案例分析——BAT业务https化经历
一.前言 通常的http访问会遭到中间人攻击.网络嗅探等普通用户感知不到的恶意行为,这些行为会篡改用户浏览页面引导用户访问非法网站.抓取用户的上网行为以及个人信息.严重的会造成用户 ...
- Netlink 内核实现分析(二):通信
在前一篇博文<Netlink 内核实现分析(一):创建>中已经较为具体的分析了Linux内核netlink子系统的初始化流程.内核netlink套接字的创建.应用层netlink套接字的创 ...
- HTTPS加密通信原理及数字证书系统
https加密通信原理: 公钥私钥成对,公钥公之于众,私钥只有自己知道. 用公钥加密的信息只能由与之相对应的私钥解密. 甲给乙发送数据时,甲先用乙的公钥加密这段数据,再用自己的私钥对这段数据的特征数据 ...
随机推荐
- PHP之面向对象PHP之面向对象(面向对象是什么)
PHP之面向对象(面向对象是什么) 一.总结 一句话总结: 面向对象就是类:类都要 属性 和 方法 比如人:属性比如身高体重,方法比如吃饭喝水 面向对象中 ,方法即是函数 : 属性即是变量 ,只是面相 ...
- codeforces 706D D. Vasiliy's Multiset(trie树)
题目链接: D. Vasiliy's Multiset time limit per test 4 seconds memory limit per test 256 megabytes input ...
- linux 进程学习笔记-进程pipe管道
所谓“进程间通信(IPC,inter-process communication)”,按照其目的讲就是让进程之间能够“共享数据”,“传输数据”,“事件通知”等,我所知道的一共有“管道” “信号” “消 ...
- zero to one (3)
工具使用 AWVS Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞. 功能及特 ...
- XAML 编码规范 (思考)
1.尽量和Blend统一 2.兄弟元素之间需要空行 4.父子元素之间不需要空格 3.每行尽量单个属性 5.Grid的Row和Column定义不需要空行 6.Style里的Setter中不需要单行一个属 ...
- Python3解leetcode Same TreeBinary Tree Level Order Traversal II
问题描述: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, fro ...
- 开源LTE代码分析
跟踪了一个在将开源组织-OpenLTE(将4G通信网络LTE开源),现将自己梳理整理的一些文档Post出来,请有相同兴趣的朋友指点: 一,系统介绍 OpenLTE是一位Mot的工程师在12年发起的一个 ...
- React库protypes属性
Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (validator) 来验证传入数据的有效性.当向 ...
- IIS PHP的Loaded Configuration File为空解决[转]
在Windows Server 2003上,IIS配置支持PHP,发现PHP扩展未加载,phpinfo()查看,显示 Configuration File (php.ini) Path (none) ...
- day1 java基础回顾-集合
1.集合 1.1 集合的类型与各自的特性 ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快, 增删慢 由于是数组实现 ...