前言
HTTP的全称是超文本传输协议,可以说是网络中使用的最多的协议了,无论是浏览网页或是下载文件,都离不开http。本篇文章将介绍HTTP协议的实现过程,如果你是前端或者服务器开发人员,本篇文章将会使你更深刻地了解网页的加载过程,如果你是嵌入式网络开发人员,本篇文章可以指导你如何通过C语言实现一个HTTP服务器或客户机。
预备知识
要想理解HTTP协议,需要先具备以下基础知识,包括 :IP、域名、DNS、TCP、UDP。
HTTP协议
在浏览器的地址栏里输入一个网址并按下回车键后,浏览器会先向DNS服务器查找网址中域名对应的IP,找到IP地址后,与该IP的相关端口(默认80)建立TCP连接,然后按照HTTP协议进行数据交互。具体的交互过程可分为浏览器发起请求,服务器响应请求。
本文章重在讨论HTTP协议,关于浏览器如何通过DNS服务器查找域名对应的IP,有兴趣的同学可以参考DNS协议。
下面将通过网络调试工具模拟HTTP,需要使用到的工具有浏览器和网络调试工具
(下载地址:http://mdocs.oss-cn-shenzhen.aliyuncs.com/http/NetAssist.exe)
补充一个特殊的IP地址:127.0.0.1,这个IP地址指向正在使用的电脑本身,也就是自己用来访问自己的地址,常常用于在一台机器上调试某个网络应用程序。接下来的介绍中将会频繁使用到这个地址。
查看浏览器发起的HTTP请求
本实验使用网络调试工具模拟HTTP服务器,查看浏览器发来的请求内容。
如下图所示,打开网络调试助手。
协议类型选择TCP Server
本地主机地址选择 127.0.0.1
本地主机端口输入 80
然后点击链接按钮:
打开浏览器,在地址栏中输入127.0.0.1,按下回车键,网络调试助手中将会收到类似(不同的浏览器略有不同)下图的数据:
收到的数据便是HTTP的请求头,下面我们将详细分析下HTTP请求头:
GET / HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
(空行)
(空行)
首先我们来看第一行,前三个字母GET表示HTTP的请求类型为GET请求,空格后面的/表示请求路径为根目录,再一个空格后面的HTTP