爬虫核心原理:一次 HTTP 请求到底是如何完成的?_爬虫每爬取一次就得请求(1)

从上图我们已经看到成功抓包到一次HTTP请求和响应了,但是我们看到却有很多TCP请求,接下来我们来分析下这些TCP请求是做什么的?

抓包分析

A) 三次握手

最开始是本地发送了2次请求到服务器,这里为什么会有两次请求,稍后再说,我们先主要看 HTTP 对应的端口请求,如下:

192.168.2.135:60738---->45.76.105.92:8081

看上面的截图我们知道这是TCP协议的第一次握手,熟悉TCP协议的同学肯定知道TCP建立连接有三次握手,断开连接有四次挥手。

我们先看第一次请求:

60738 -> 8081 SYN Seq=0 Win=64240 Len=0 Mss=1460 Ws=256 SACK_PERM=1

我们来解析下这段包请求信息:

60783->8081端口号:源端口—>目标端口

Seq: 消息编号

Win: TCP 窗口大小

Len: 消息长度

Mss: 最大报文段长度

Ws: 窗口缩放调整因子

SACK_PERM: SACK选项,这里等于1表示开启 SACK。

对于上面的概念,这里简单解释下,再介绍之前我们先看TCPHeader的数据结构图,对TCP头部数据结构有个直观的了解

1. Win: TCP 窗口大小,是指TCP传输能接受的最大字节数,这个可以进行动态调节,也就是TCP的滑动窗口,通过动态调整窗口大小,来控制发送数据的速率。上图中占用2个字节,也就是16位,那么可以支持的最大数就是2^16=65536,所以默认情况下TCP头部标记能支持的最大窗口数是65536字节,也就是64KB。

2. Len: 消息长度就是指数据报文段,因为整个TCP报文=Header+packSize,所以这个消息长度就是指要传送的数据包总共长度,在本次分析中也就是HTTP报文的大小。

3. Mss: 最大报文段长度:这个就是规定最大的能传输报文的长度,为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以一般MSS值1460,这也和我们抓包图中的值一致。

4. Ws: 窗口缩放调整因子:在前面说TCP窗口大小中我们说到,默认情况下,TCP窗口大小最大只能支持64KB的缓冲数据,在今天这个高速上网时代,这个大小肯定不满足条件了,所以,为了能够支持更多的缓冲数据 RFC 1323中就规定了TCP的扩展选项,其中窗口缩放调整因子就是其中之一,这个是如何起作用的呢?首先说明,这个参数是在SYN同步阶段进行协商的,我们结合上面抓包数据分析下。我们看到第一次请求协商的结果是WS=256,然后再ACK阶段扩展因子生效,调整了窗口大小。生效的抓包如下:

60738 ->8081  [ACK] Seq=1 ACK=1 Win=66560 Len=0

我们发现这个窗口变成了66560,比默认的窗口要大,我们查看报文详情:

我们发现,实际请求声明的窗口是260,WS扩展因子是256,最终计算的窗口大小是66560,所以我们知道了,这个扩展因子的作用就是,用原窗口大小乘以扩展因子,得到最终的窗口大小,也就是260*256=66560.

5. SACK_PERM:SACK选项,我们知道TCP传输有包的确认机制,默认情况下,接受端接受到一个包后,发送ACK确认,但是,默认只支持顺序的确认,也就是说,发送A,B,C个包,如果我收到了A,C的包,B没有收到,那么对于C,这个包我是不会确认的,需要等B这个包收到后再确认,那么TCP有超时重传机制,如果一个包很久没有确认,就会当它丢失了,进行重传,这样会造成很多多余的包重传,浪费传输空间。为了解决这个问题,SACK就提出了选择性确认机制,启用SACK后,接受端会确认所有收到的包,这样发送端就只用重传真正丢失的包了。

简单介绍了上面的基础概念后,我们来根据抓包梳理下HTTP请求的过程,根据HTTP请求本地端口是60378,梳理的流程如下:

我们根据上面的流程梳理,可以知道,序号1-序号3是明显的三次握手,然后序号4进行了一次HTTP请求,接着序号5是对HTTP请求的一次接收确认,序号6是响应HTTP请求,序号7是对响应请求的确认。

B) 四次挥手

上述序号8,9,10是我关闭浏览器后抓到的包,既然是关闭浏览器,我们肯定知道就是TCP连接的断开了。这里有同学应该已经发现了问题了,我们的断开是4次挥手,你这抓的包只有三条记录,是你写错了吧?我要告诉你的是,我没有写错,这是真实的抓包抓的,至于为什么是三次,我们来分析一下:

正常情况下,连接断开是4次挥手的,4次挥手过程如下图:

我们分析这图,挥手流程是这样的:

我们发现上面的流程2和流程3都是由服务端发起的,那么有没有可能合并这两个请求,一次发送给客户端?答案是可以。在 RFC 2581中的4.2节有提到,ack可以延迟确认,只要求保证在500ms之内保证确认包到达即可。在这样的标准下,TCP确认是有可能进行合并延迟确认的,所以,根据这一点,我们推断下面这个包:

  1. 8081 -> 60738  [FIN ACK] Seq=120 Ack=397 Win=30336 Len=0

合并了对客户端的ack确认以及服务端发送的FIN断开信号包。我们点击该包详情如下: 这里红框中体现了,这个9号包是对Frame500的ACK确认,我们根据最开始的截图可以知道,这个包就是8号包

  1. 60738 -> 8081 [FIN ACK] Seq=396 Ack=120 Win=66560 Len=0

并且9号包本身自己是发送的FIN信号包,所以,我们可以认为9号包合并了ACK和FIN的内容,所以通常的4次挥手,经过合并后变成了3次挥手。

以上就是一个HTTP完整的请求,整个流程用图表示如下:

C) Keep-Alive

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值