http协议

一、http协议简介

http协议是一个基于TCP的应用层协议,http全程是hypertext transfer protocol(超文本传输协议),说它是超文本,是因为它不仅传输文本数据,还传输包括图片,音频,视频等数据。

应用层协议就是组织数据信息的格式,所以学习http就是学习http的格式,http的格式组织的数据,就可以直接作为参数交给TCP协议的socket传输。

http也是一个行文本协议,也就是说http每一行都有特定的含义,并且以文本的形式组织。

二、http的分类

http分为http请求和http响应,也就是客户端发送请求的数据组织格式,和服务器返回响应的信息组织格式。

1、http请求

http请求的结构大概分为4个部分,首行+header+空行+body。

下面是向搜狗服务器请求搜狗搜索引擎页面的http请求的完整格式

http协议_第1张图片

这个请求是通过fiddler抓包获取的,如果不知道如何使用fiddler抓包可以看我这个博客

如何使用Fiddler进行抓包

根据上面这张图对http各个部分进行介绍。

(一)、首行

首行由三个部分组成 http方法名+url+http版本号,这三个部分以空格分隔开。

 GET https://www.sogou.com/ HTTP/1.1

上面的这个首行就代表,http方法为get,url为https://www.sogou.com/,版本号为HTTP/1.1

(1)http方法

http的方法有如下几种

http协议_第2张图片

但是最常见的也就是get和post两种,占了80%的http包的方法,get和post分别用来向服务器请求数据和上传数据。

(2)url

url就是网址,也叫做唯一资源标识符,在http首行出现的url描述了本次http请求访问目的地址

它的格式为:

协议名://域名:端口号/资源路径?查询参数 

如:

http://www.example.com/search?q=keyword&page=1

 协议名就只有http和https两个,http和https基本相差不大,https是http的升级版,引入了加密的功能。

协议名后用://

端口号可以省略,省略的端口号就是使用默认值, http 协议默认使用 80 端口, https 协议默认使用 443 端口.端口号以:与ur分割

资源路径就是要获取的资源在服务器的路径

查询参数是一堆键值对,键值对之间以&分割,键和值之间用=分割,查询参数在路径之后,用?开头。

 (3)协议版本号

协议版本号就是描述现在使用的http协议的版本,一般都是1.1

 (二)header

header位于首行之后,header是由多行键值对组成的,每一行键值对代表不同类型的信息。

下面列举几个常见的键值对

(1)host

http请求真正要访问的地址,在之前的HTTP/1.0协议中,主机地址host是在url中出现的,但是为了,虚拟服务器和代理服务器的需要,在HTTP/1.1中引入了host,这个host是本次http请求真实要访问的ip地址。

host大多数情况下是和url中的域名相同的,只有在使用代理服务器和虚拟服务器的时候,host可能会不同。

(2)content-type和content-length

type和length分别代表了http请求body结构组织数据的格式类型和body的长度。

在有body的http包中必须存在。

content-type在设置了body数据格式后,后面可以跟着设置charset,用来向接收到http数据的程序表示以那种字符集解析数据。

如:Content-Type: application/x-www-form-urlencoded; charset=UTF-8

因为http是行文本机构的,也就是每一行的键值对都服务于一个功能,所以一般一行只有一个键值对,但是这一行Content-type和charset共同描述了文本的格式和字符集,他们的功能就是向接收端说明如何正确解析数据。

Content-Type和Content-Length非常重要,直接关系到接收端能否正常的解析数据。

(3)cookie

cookie是浏览器专门给网站准备的缓存空间,在浏览器设计之初,浏览器是不能访问本地机的空间的,因为可能有些攻击网页会篡改本地电脑数据,造成安全风险,但是随着时代发展,浏览器的确存在存一些网页数据的需求,cookie也就应运而生了。

cookie是浏览器专门给网页开辟的地址空间,用来存储页面缓存。

cookie的内容都是自定义的,只有编写它的程序员知道是什么意思。

cookie的内容室友保存日期的,保存日期一过就会自动删除http协议_第3张图片

可以通过点击浏览器上的网址栏前面的锁型按钮,查看cookie的内容

http协议_第4张图片

 (4)referer

refer表示当前这个http请求时根据哪个页面得到的。

http协议_第5张图片

 如果是直接在网址栏输入网址,或者点击收藏夹里面的网址,这个referer是没有的,其他的都有。

(5)UA(user-agent)

UA是描述操作系统和浏览器版本的键值对

http协议_第6张图片

 起初,老版本的浏览器,只能查看文本内容,后面慢慢能查看图片,视频等,这些浏览器访问一个网页时,显示完全不同,为了能正确显示,程序员直接针对各版浏览器,每个版本都做一个网站,此时UA就是服务器用来判断用户客户端需要哪个版本的网页参数。

现在浏览器不存在这个问题,UA又用辨别是移动端还是PC端在访问这个页面的根据。

(3)body(正文)

body是http传递信息的地方,body的格式是header中的content-type配置的,主要有三种

  1. application/x-www-form-urlencoded:这是最常见的HTTP Body格式,通常用于HTML表单提交。在这种格式下,参数和值会按照键值对的形式进行编码,然后用&符号连接起来。例如:key1=value1&key2=value2。在请求头的Content-Type字段中,需要设置为application/x-www-form-urlencoded

  2. multipart/form-data:这种格式也用于HTML表单提交,特别适用于上传文件或二进制数据。它将请求体分割为多个部分,并为每个部分指定了Content-Disposition头字段,表示各个部分的不同内容。每个部分都有自己的Content-Type和内容,可以包含文件数据或其他的表单字段。在请求头的Content-Type字段中,需要设置为multipart/form-data

  3. application/json:这是一种基于JSON(JavaScript Object Notation)的HTTP Body格式,用于传输结构化的数据。JSON格式的数据以键值对的形式表示,使用大括号{}包围整体。例如:{"key1": "value1", "key2": "value2"}。在请求头的Content-Type字段中,需要设置为application/json

2.http响应

响应只有首行和请求不同,这里只介绍首行

响应的首行由协议版本号+状态码+状态描述符完成

 常见的状态码

(1) 200 ok,表示请求正常被接受到,并返回了响应

(2)302 FOUND,重定向,表示这个网页已经搬到另一个地方了,并返回一个location,作为禁地址

http协议_第7张图片

 (3)404 NOT FOUND

表示服务器一番搜索之后,并没有找到你要访问的地址

(4)500

服务器异常

二、构造出http请求

(一)使用form构造http请求

Form标签要求提交的数据通过键值对的形式来组织

构造get请求

 写出的界面是这样的

http协议_第8张图片

form表单的action属性就是http的url,method就是首行的方法

使用input标签,name属性就是键值对的键,在对应name的input标签中输入的值,就是键对应的值。

使用submit的input标签,可以点击submit按钮,提交http请求,

传输的数据就是在有name属性的input标签中输入的值,因为使用的是get方法,传输的数据键值对会议query string的方式作为url的查询参数传输。

在方框中写上java再点提交

http协议_第9张图片

构造出的http请求就会是这样

http协议_第10张图片

 haha=java这个键值对出现在url里面。

构造post请求

要构造post请求,直接将form标签的method属性赋值为post就可以了

此时再将java最为值提交

http协议_第11张图片

 构造出来的post请求长这样

http协议_第12张图片

 post方法就是将添加在url后面的键值对放在了body部分。

 post和get的区别

(1)语义上,get用来获取信息,post用来上传信息

(2)get通过url的query string部分来传递消息,post通过body部分来传递消息

(3)get习惯上被设计成幂等的,post被设计成不幂等的(幂等就是传递的参数和获得的响应内容是一一对应的)

(4)因为get是幂等的,get获取的内容是有可以缓存在本地的,不用每次都去get服务器上的源文件。

(二)使用ajax构造http请求

ajax需要jquery库,在使用ajax时候,需要先在html里面引入jquery文件

引入之后,在script的标签中用$调用ajax函数,ajax函数的参数是一个js对象(用大括号保住,里面的值都是键值对,用,作为键值对之间的分割)。


    

type属性作为方法名,url作为首行的url。

三、https协议

https协议就是http协议引入了加密模块SSL/TSL

https就可以看做http+SSL/TSL

下面回介绍加密模块的工作原理。

        介绍加密模块之前,我们得知道,为什么需要加密,http协议已经能正常的传输数据了,为什么还要整个https?

我们都知道数据在网络上传播需要经过一个一个节点转发和接收,最后才能到底目的地。这些中间节点都需要能获取到我们发送和接收的数据才能转发,使用http协议进行传输,就相当于在中间节点道路上进行裸奔,任何一个中间节点都能根据获取到的http包知道我们在传递什么数据。并且,如果有些恶意中间节点甚至回篡改我们的数据,这是非常可怕的。所以https就出现了。

https通过将http包进行加密,此时中间节点虽然也能获取到我们传输的数据,但是这都是被加密后的数据,中间节点无法得知http数据的结构和内容。这样就保障了数据的安全性。

(1)对称加密

最简单的加密方法就是对称加密,也就是客户端生成一个密钥,使用这个密钥对传递的数据进行加密,加密后的数据也能使用这个密钥进行解密。

最简单的对称加密就异或。

困境:

有了对称加密之后就能对传输的数据进行加密,中间节点不知道密钥也就无法得知数据的内容。

但是,客户端对数据加密后,和客户端进行连接的服务器也需要对数据解密才能知道客户端传输的数据内容,所以在首次传输数据之前,还必须要将密钥也发送给服务器。如果此时直接使用http协议传输,之后的加密传输就没有意义,黑客只要知道客户端首次传输的密钥,客户端之后的所有加密都形同虚设。

(2)公钥私钥加密

解决上面的困境就是要在首次传输密钥时,也进行加密,此时就可以使用公钥和私钥进行加密,公钥私钥时一对密钥,数据使用公钥加密,使用私钥解密(数学上可以证明这样的一对公钥私钥时存在的)。一般由服务器产生一对公钥私钥,公钥可以公开,私钥只有服务器自己掌握,客户端和服务器首次传输数据之前,客户端先请求服务器公钥,得到公钥之后,客户端对自己产生的密钥使用公钥进行加密,加密之后传输给服务器,服务器再用私钥解密。

这样就加密传输了密钥。

(3)中间人攻击

但是聪明的黑客又研制出一种破解方式,黑客充当中间人,对客户端假冒服务器,客户端首次请求公钥时,中间人就返回自己生成的公钥A,并且此时中间人向真正的服务器请求公钥B,客户端将假公钥A加密的密钥发来之后,中间人用自己的私钥解密就获得密钥,然后再将密钥用公钥B加密后传给真实的服务器,这样中间人就获得客户端之后的密钥。

(4)证书

中间人攻击能成立的条件是客户端无法分辨发来的公钥是否是真正的服务器的公钥,此时证书的作用就体现出来了,每一个服务器上线之前都必须通过第三方认证机构签发证书,认证机构在获得了申请人的各种信息之后,会生成一个证书,证书上会有服务器的各种信息字段(包括公钥)和一个签名字段,这个签名字段,签名是这样得来的:

        (1)认证机构对服务器的各种信息字段进行哈希运算得出的一个哈希值,

        (2)将这个哈希值用认证机构的私钥进行加密得到这个签名字段

此时,客户端和服务器首次连接不再请求公钥,直接请求证书。客户端获取证书之后,再向认证机构获取公钥,然后对签名解密获取到hash值A。再将证书上的其他字段按特定规则计算出hash值B,如果A和B相等,则证明证书是真的,客户端确认连接上了真的服务器。

你可能感兴趣的:(http,网络协议,网络)