标签:就会 14. mission version 需要 情况 图解 网络 col
参考文章:
面试被问到有没有用过抓包工具, 还真没有... 弥补一波. 一直以来看http和https的介绍, 都是文章, 然后图片, 理解的也不深入. 借此一个机会, 深入理解下.
入行不久, 写的哪里不对的, 请谅解. 还望各位路过的大佬帮忙指出, 十分感谢.
我刚开始用, 哪里不对的. 望大神们见谅.
在官网中有很舒服的操作原理说明: Wireshark/HTTPS
http://www.cnblogs.com/zhangrunhao/
https
info
是GET /zhangrunhao/ HTTP/1.1
ping <域名>
即可, 例如: ping www.cnblogs.com
)ip.addr == <记录下的ip地址>
具体的tcp协议的讲解, 可以参考TCP协议
tcp协议中的各个字段.
这篇文章中需要用到的三个字段:
sequence number: 序列号
占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400;序号是32bit的无符号数,序号到达2^32-1后从0开始.
Acknowledgment number: 确认码
占4字节, 是期望收到对方下次发送的数据的第一个字节的序号, 也就是期望收到的下一个报文段的首部中的序号. 确认序号应该是上次已成功收到数据字节序号+1. 只有ACK标志为1时, 确认序号才有效.
三次握手的简单建立过程: 所有的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通信过程就全部完成了.
那么问题来了: 为什么是四次挥手, 而不是三次呢?
因为, 在挥手的过程中, 第一次挥手的时候, 客户端发送向了服务器端不需要通信的请求. 服务器端通过第二次挥手确认了收到. 但并不能保证, 服务器端再没有需要给客户端发送的信息了啊. 只是表明了, 客户端没有要发送给服务器的数据了, 服务器知道了. 但是服务器没有需要给客户端的数据, 就需要通过第三次挥手来表示. 客户端回复收到. 至此才算完完全全的完成.
一句话概况: 通过非对称加密的方式来传递对称加密所需要的秘钥.
我懒, 还是贴图好了(原谅我这名盗图狗), 等会我们在抓包的过程中逐步分析.
注意一点: ssl / tls
的交互过程, 是在完成我们上面的三次握手开始的.
此过程完全参考了Wireshark中关于HTTPS的操作说明.
https://en.wikiversity.org
.ssl
, 然后回车.Client Hello
标志的TLS包.ip.addr == <destination>
destination是指, 我们的ip地址.说两个事:
ping en.wikiversity.org
多么舒服的做法..ipconfig /all
和arp -a
进行确认Internet Protocol Version 4
这一层, 查看网络层的详情.Transmission Control Protocol
, 你可以看到传输层的详细信息.SSL/TLS
Client Hello数据包Client Hello
标识的tsl数据包. 这里还有, 物理层, 链路层, 网络层, 传输层, 安全传输层的信息, 这里和步骤三中的各项数据保持一致.TCP ACK
标识的tcp数据包, 那是服务器端对于收到客户端请求的回应.SSL/TLS
Server Hello数据包Server Hello
标识的数据包.Secure Sockets Layer
, 也就数安全数据层.Certificate, Server Key Exchange, Server Hello Done.
标识的数据包.Secure Sockets Layer
, 让我们来仔细观察安全层所携带的数据.Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
标识的tcp数据包.Application Data
的数据之间的传递了, 此时的数据都是经过加密的.New Session Ticket.
标识的数据包, 服务器用来确定加密信息, 有些不带有, 还不是很清楚的具体原因. 有待学习, 有待学习.不会的地方可真多... 文章若有错误的地方, 还望大家能够帮忙指出. 大恩不言谢, 他日以身相许.
标签:就会 14. mission version 需要 情况 图解 网络 col
原文地址:https://www.cnblogs.com/zhangrunhao/p/10428759.html