关于HTTP不能不说的秘密

基础第一篇:关于HTTP不能不说的秘密

HTTP

超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最为广泛的一种网络协议。所有WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

1

技术框架

HTTP是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器端是网站。

通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。

应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。

用户代理和源服务器中间可能存在http和其他几种网络协议多个中间层,比如代理,网关,或者隧道(tunnels)。

尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

这么说的话,你可能听不懂我在表达什么,好吧,我摔图片给你看看。。。

当我们点击一个链接或者输入一个链接的时候,整个HTTP的请求过程就开始了,然后经过上面6个步骤得到最后的信息。为了更好地帮助大家理解这个过程,这里我简单介绍一下前四个步骤。

2

过程分析

(1) 域名解析

首先会搜索各种本地DNS缓存,如果没有就会向DNS服务器(互联网提供商)发起域名解析,以获取IP地址。

(2) 建立TCP连接

当获取IP后,将创建套接字socket连接,也就是TCP的3次握手连接,默认端口号80。(关于这部分我有一篇文章专门介绍过,不懂的可以移步去了解一下。)

(3) HTTP请求

一旦TCP连接成功后,浏览器/爬虫就可以向服务器发起HTTP请求报文了,报文内容包含请求行、请求头部、请求主体。

(4) 服务器响应

服务器响应,并返回一个HTTP响应包(如果成功会返回状态码200)和请求的HTML代码。

关于(3)(4)这是我接下来要详细说明的内容,往下看。

3

状态码

其中,响应HTTP请求会返回响应状态码,根据状态码可以知道返回信息的状态。状态码规定如下:

1xx消息——请求已被服务器接收,继续处理

2xx成功——请求已成功被服务器接收、理解、并接受

3xx重定向——需要后续操作才能完成这一请求

4xx请求错误——请求含有词法错误或者无法被执行

5xx服务器错误——服务器在处理某个正确请求时发生错误

4

请求头

HTTP的包括通用头、请求头、响应头和实体头四部分。一般在爬虫过程中,我们会提交headers的请求头信息用于伪装自己使浏览器错误的以为这是一次正常的访问,因此我这里对请求头着重介绍一下。

Accept:表示请求的资源类型;

Cookie:为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据;

User-Agent:表示浏览器标识;

Accept-Language:表示浏览器所支持的语言类型;

Accept-Charset:告诉 Web 服务器,浏览器可以接受哪些字符编码;

Accept:表示浏览器支持的 MIME 类型;

Accept-Encoding:表示浏览器有能力解码的编码类型;

Connection:表示客户端与服务连接类型;

5

总结

本篇文章介绍了HTTP的基本概念,主要包含了以下几点:

(1)HTTP的概念

(2)HTTP实现的技术框架

(3)网页请求过程分析

(4)状态码,请求头的介绍

那么好了,基本的HTTP介绍就结束了,如果需要更加详细的HTTP知识,推荐一本HTTP入门书《图解HTTP》

原文发布于微信公众号 - 啃饼思录(kbthinking)

原文发表时间:2018-06-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术栈

MySQL到底有多少种日志类型需要我们记住的!

MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询...

801
来自专栏JAVA同学会

ZooKeeper简介

ZooKeeper是一个分布式的开源协调服务,用于分布式应用程序。它公开了一组简单的原子操作,分布式应用程序可以构建这些原子操作,以实现更高级别的服务,以实现同...

1372
来自专栏喵了个咪的博客空间

[喵咪MQ(3)]RabbitMQ集群安装配置

[喵咪MQ(3)]RabbitMQ集群安装配置 ? 在各项生产环境使用中,容灾总是一个很重要的话题,如果单点故障会导致整个系统奔溃或者是丢失数据是不是好气好气的...

3736
来自专栏JAVA同学会

单点登录(SSO)详解

在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。 但随着企业的发展,用到的系统随之增多,...

4.2K5
来自专栏沈唁志

各种IE(IE6-IE10)兼容问题一行代码搞定

2083
来自专栏程序你好

MySQL到底有多少种日志类型需要我们记住的!

771
来自专栏xingoo, 一个梦想做发明家的程序员

Maven那点事儿(Eclipse版)

前言: 由于最近工作学习,总是能碰到Maven的源码。虽然平时工作并不使用Maven,但是为了学习一些源码,还是必须要了解下。这篇文章不是一个全面的Mav...

2209
来自专栏Python爬虫与数据挖掘

如何给Centos系统的虚拟机更改主机名

有的小伙伴们发现Centos系统中主机名很长,想着更改主机名,换个简单的主机名,但是又不知道怎么做。其实这个问题的解决方案很简单的,默认情况下,虚拟机的...

1113
来自专栏小夜博客

Crontab自动记录服务器负载

3769
来自专栏运维一切

关于容器的REMOTE SHELL 转

出于各种各样的需要,你可能不得不给出一个可以进入到容器内部的remote shell,方便调试,临时配置,处理应急等事情。

1181

扫码关注云+社区

领取腾讯云代金券