HTTP协议详解


emm,说一下国庆这几天的学习历程:
本来是想抽出几天时间把Python爬虫入个门的,然后也通过各种途径扒出了许多教程。都说Python的ruquests模块好用,好用那就学学呗,然后学了没一会儿,,,似乎有点吃力,原因应该是requests模块是基于urllib模块的,因此许多讲解requests模块的文章就缩略了很多内容,于是回过头来学urllib,urllib又学了一段时间,似乎还有点吃力,原因应该是HTTP协议还没掌握,于是又去学HTTP协议,HTTP协议学了一会儿,发现HTTP协议的基础,TCP/IP协议又快忘掉了,于是又赶紧回顾了一下TCP/IP的基础。
我觉得大部分自学的人都会遇到类似的问题吧,太折磨了可以说。

好了,言归正传。


什么是URL

在正式介绍HTTP协议之前,有必要先了解一下URL。

URL,英文全称是Uniform Resource Locator,即统一资源定位符,通俗点说也就是网址。

因特网上的每一个网页都具有一个唯一的名称标识,通常称为URL地址,这种地址可以是本地磁盘,可以是局域网上的某一台计算机,更多的则是因特网上的站点。这些地址统称为Web地址,即网址。


URL语法格式

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
也可以认为由四部分组成:协议、主机、端口、路径。
它的一般语法格式是:

protocol://hostname[:port]/path/[:parameters][?query]#fragment

#1 protocol(协议)

protocol指定使用的传输协议,其中最常用的是HTTP协议,其它有效的protocol属性有:

  • file:/// 支持访问本地资源
  • FTP:// 支持通过FTP协议访问资源
  • HTTPS:// 支持通过安全的HTTPS访问资源
  • mailto: 电子邮件地址,通过SMTP访问
  • MMS:// 支持MMS(流媒体)协议访问资源
  • ed2k:// 支持通过ed2k(专用下载链接)协议的P2P软件访问资源
  • Flashget:// 支持通过Flashget(专用下载链接)协议的P2P软件访问资源
  • thunder:// 支持通过thunder(专用下载链接)协议的P2P软件访问资源

<注意> 什么是P2P软件?

P2P指的是数据的传输不再通过服务器,而是网络用户之间直接传递数据,即Pointer-to-Pointer,PC-to-PC等含义。而能够实现这种功能的软件就被称为P2P软件。


#2 hostname(主机名)

hostname属性存放资源服务器的域名系统(DNS)主机名或IP地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码,格式为:username:password@hostname

<注意> 什么是域名和DNS?

IP地址是很长的一串数字,IPv4使用32位地址,也就是4个字节,每个字节的数值以十进制表示,得到形如192.168.0.1的IPv4地址标准表示法。

而Ipv6将Ipv4的32位地址拓展到了128位,也就是16个字节,将这16个字节写成8个16位的无符号整数,每个整数用四个十六进制位表示,每个数之间用冒号分隔,得到形如3ffe:3201:1401:1280:c8ff:fe4d:db39:1984的IPv6地址标准表示法。

可以预想到,让人记下一串串的数字是非常困难的,在实际应用中也很不方便,因此更多时候采用的是用域名来映射IP地址的方式。

域名(Domain name)和IP地址是相互映射的关系,如www.cnblogs.com就是一个域名。域名分为国内域名和国际域名,一些常见的域名后缀有.com、.net、.cn、.edu等等。域名具有独一无二、不可重复的特点,且遵循先注册先得的原则。

完成域名与之相对应的IP地址转换的服务器就是域名服务器DNS,全称为Domain Name Sever。DNS保存有一个将域名与IP地址相互映射的分布式数据库,用于解析消息的域名。

DNS使用TCP和UDP端口号53。

#3 port(端口号)

port属性是可选的,在省略时使用方案的默认端口。各种传输协议都有默认的端口号,如http的默认端口为80。

有时出于安全的考虑,也可对端口号重新定义,采用非标准端口号,但此时URL中的端口号就不能省略。


#4 path(路径)

由零个或多个反斜杠符号(/)隔开的字符串,一般用来表示主机上的一个目录或文件地址。


#5 parameters(参数)

用于指定特殊参数的可选项。


#6 query(查询)

用于给动态网页传递参数的可选项。当传递多个参数时,每对参数间用&隔开,每对参数采用字典表示法。


#7 fragmen(信息片段)

字符串,用于指定网络资源中的片段。



TCP/IP协议

HTTP协议是构建在TCP/IP协议上的,因此在介绍HTTP协议之前对TCP/IP协议进行简单的回顾是很有必要的。

首先要指出的一点是,TCP/IP协议并不是说只有TCP协议和IP协议,TCP/IP协议是一个由FTP、SMTP、TCP、UDP、IP、HTTP等协议构成的协议簇,只是因为在这个协议簇中TCP协议和IP协议最具代表性,因此被称为TCP/IP协议。

1.TCP/IP协议簇分层

TCP/IP协议簇是由一个四层协议组成的系统,这四层分别为:应用层、传输层、网络层、数据链路层。
在这里插入图片描述

#1 应用层

应用层一般是用户应用进程,其决定了向用户提供应用服务时通信的活动。

#2 传输层

传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。

#3 网络层

网络层用来处理在网络中流动的数据包,数据包是网络传输的最小数据单位。该层规定了传输路径。

#4 数据链路层

该层用来处理连接网络的硬件部分,不再多说。

2.数据包封装

用户实际上只能接触到应用层,那么上层的数据是如何转变为下层数据的呢?这通过封装来实现。

以TCP传输数据为例,当应用程序用TCP传输数据时,数据会被送入协议栈中,这些数据在发送到物理网络之前,会沿着协议栈从上往下传递。每层协议都将在上层协议的基础上加上自己的头部信息(链路层还会加上自己的尾部信息),该过程如下图所示:
在这里插入图片描述

TCP传给IP的数据单元称作TCP段(TCP segment),UDP数据与TCP数据基本一致,只不过UDP传给IP的数据单元被称作UDP数据报(UDP datagram)。之后由IP接手,进而传给链路层的数据单元称作IP数据包(IP packet)。最后,通过以太网传输的比特流称作帧(Frame)。

区分数据报、数据包和数据帧,可以参考下面的博客:

https://blog.csdn.net/qq_25606103/article/details/51295965
https://blog.csdn.net/weixin_41055137/article/details/80101297

发送端发送数据时,数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。而接受端在接收数据时,数据会从下层传输到上层,传输前会把下层的头部信息删除。流程图如下:
在这里插入图片描述

由于下层协议的头部信息对上层协议来说没有实际的用途,所以在下层协议传输给上层协议的时候会把该层的头部信息去掉,这个封装过程对于上层协议来说是完全透明的。这样做的好处在于应用层只需要关心应用服务的实现,而不用管底层的实现。

那么最终头部信息是都会被删除的,你可能会疑惑那它们还有什么用,为什么要加头部信息呢?这么给你说吧,快递公司给你发一件快递,它肯定要事先知道你的收获地址,把这个地址和快递封装在一起,就是传输层发送出去的数据包,称为segment/datagram,其中TCP segment保证送货到家,丢货补发,而UDP datagram只管发货,至于货有没有送到则无法保证。

传输层数据包的头部信息即存储了这样的地址,因此数据段和数据报的出发点在发送端传输层,终点在接受端传输层,如果不加这个头部信息,接受端的网络层就不知道该把这个数据包送到哪个传输层去。

同样,网络层发出的数据包为IP packet,它的头部存储了网络层的地址,如IP地址;
链路层发出的数据包为Frame,它的头部存储的地址为链路层的地址,如mac地址。


3.TCP三次握手

TCP协议提供面向连接的、字节流的、可靠的传输。

使用TCP协议进行通信的双方必须先建立连接,之后才能通信。TCP连接是全双工的,这也就是说双方的数据读写可以通过一个连接进行。为了确保连接的可靠性,在双方建立连接时,TCP协议采用三次握手策略。

第一次握手:客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SEND状态,等待服务器的确认。

第二次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入SYN_RECV状态。

第三次握手:客户端接收到服务端的SYN+ACK报文段后,会向服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。



HTTP协议

辅助性知识铺垫的差不多了,接下来先大致描述一下HTTP服务的工作流程。

我们都知道在浏览器中输入一个网址,在网址不出错的情况下,浏览器就会正确的打开该网址供我们浏览。这里的网址是形如 https://www.baidu.com/index.html 的字符串,更准确的说它是一个URL字符串,浏览器会根据URL上面的域名,首先通过DNS服务器查询出该域名映射的IP地址,然后生成HTTP请求报文,并通过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,最后再通过TCP/IP协议返回给客户端。

这是一个标准的客户端-服务器模型,HTTP协议最主要的功能也就是用于客户端和服务端的通信,这种通信由简单的请求和响应来构成,正因如此,HTTP协议非常简单,这使得HTTP服务器的程序规模小,因而通信速度很快。

1.HTTP的特点

#1 超文本传输协议

HTTP(Hyper Text Transfer Protocol)也叫超文本传输协议,它是一种用于从万维网传输超文本到本地浏览器的传输协议,且位于TCP/IP协议分层模型的应用层。

#2 支持客户端/服务端架构

HTTP协议工作在客户端/服务端架构之上。浏览器作为HTTP客户端通过URL向HTTP服务端即Web服务器发送所有请求。

#3 媒体独立,可传送任意类型的数据

HTTP协议是媒体独立的,它允许客户端与服务端之间传输任意类型的数据对象。这里介绍两个概念:Mime-Type 和 Content-Type。

当Web服务器收到来自客户端的资源文件请求时,它会依据请求文件的后缀名在服务器的MIME配置文件中找到对应的Mime-Type,再根据Mime-Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。

再通俗点说,我们平时在浏览器中看到的内容各种格式的都有,比方说HTML、XML、JPG、GIF、Flash等等,那么浏览器是怎么区分它们并正确的显示出来的呢?答案就是Mime-Type。更准确的说,Web服务器是通过Content-Type来告诉浏览器该怎么显示一个媒体类型的。而Content-Type属性的值由Mime-Type来确定。

比方说:

Content-Type:text/html;charset:utf-8;

这条语句表示浏览器应该以text/html类型,也就是超文本文件的格式来显示媒体内容,同时编码类型设置为utf-8。

常见的媒体格式类型如下:

  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • List item
  • image/jpeg :jpg图片格式
  • image/png:png图片格式

以application开头的媒体格式类型:

  • application/xhtml+xml :XHTML格式
  • application/xml : XML数据格式
  • application/atom+xml :Atom XML聚合格式
  • application/json : JSON数据格式
  • application/pdf :pdf格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

有关Content-Type的更多内容可参考下面的博客:

Content-Type详解

Mime-Type介绍

Content-Type介绍

Content-Type的理解


#4 无连接

HTTP是无连接的。无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
这样做是考虑到Web服务器面向的是成千上万的用户,且在服务器只能提供有限个连接的情况下,一个连接不可能在没有请求的情况下一直等待下去。因此,连接一次,处理一个事务后就断开连接,可以大大提高服务器的执行效率。

<注意>

从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性。开启了Keep-ALive后,即使一个事务被完成,但客户端与服务端的连接不会被关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。


#5 无状态

HTTP协议是无状态协议。无状态协议是指协议对于事务处理没有记忆能力。这样的一个坏处就是,如果后续处理需要前面的信息,则它必须重新传送,这就会导致每次连接传送的数据量增大。
另一方面,在服务器不需要先前信息时,服务器的响应又会比较快。

为了解决HTTP的无状态特性,出现了Cookie和Session技术。

<注意> 什么是事务?

在客户端/服务端架构中,我们把客户端发出请求开始,直到服务端给出响应的过程称为事务。
当一个事务结束后还会在服务端添加一条日志条目。

2.工作原理

首先,客户端与服务器建立连接。建立连接的过程从用户单击某个超链接开始。

建立连接后,客户端向服务器发送一个请求,请求的格式为:统一资源标识符(URL)、协议版本号,然后是MIME信息(包括请求修饰符、客户机信息和可能的内容)。

服务端收到请求后,作出响应并返回响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,然后是MIME信息(包括服务器信息、实体信息和可能的内容)。

客户端接收服务器所返回的信息并在浏览器上显示处理,之后客户端与服务端断开连接。

3.HTTP请求

HTTP请求是指:客户端通过发送HTTP请求向服务端申请对资源的访问。它向服务器传递了一个请求信息,HTTP请求由三部分组成:状态行(请求行)、请求头和请求正文。
如下图所示:
在这里插入图片描述

请求行 :包括请求方法Method、资源路径URL、协议版本Version。
请求头 :包括要访问的域名、用户代理、Cookie等若干属性信息。格式为 属性名:属性值 的字典格式,服务器以此获取客户端的信息。
请求正文 :HTTP请求的数据。

给出一个HTTP请求的示例:
在这里插入图片描述


#1.请求方法

HTTP协议共规范了8种请求方法,包括GET、POST、HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE。但大多数浏览器只支持GET和POST。

接下来重点介绍一下其中的GET、POST和HEAD。

  • GET

GET方法用于获取由Request-URI所标志的资源的信息,常见的形式是:
GET Request-URI HTTP/1.1

GET方法是默认的HTTP请求方法,比如当我们点开某个链接,或者是通过浏览器上输入网址来浏览网页的时候,使用的都是GET方法。

GET方法的请求参数和对应的值附加在URL后面,在URL里,用一个?表示URL的结尾,之后可以添加GET的附加参数,参数对用key=value的形式表示,参数对之间用&隔开。

由于GET方法会把一些参数也附加到URL的后面,因此浏览器一般都会对URL的长度有限制。

另外还由于参数就包含在URL里,因此很容易会被看出请求数据的内容,因此不太适合传递私密的数据。

<注意> 简单区分URI与URL

URL:(Uniform/Universal Resource Locator 的缩写,统一资源定位符)。
URI:(Uniform Resource Identifier 的缩写,统一资源标识符)

关系:
URI 是属于 URL 更高层次的抽象,可以这么理解,URI 属于父类,而 URL 属于 URI 的子类。URL 是 URI 的一个子集。
二者的区别在于,URI 表示请求服务器的路径。而 URL 同时说明要如何访问这个资源(http://)。

  • POST

POST方法是GET方法的一个替代方法,它主要被用来向Web服务器提交表单数据,尤其是大批量的数据。

通过POST方法提交表单数据时,POST方法将请求的参数封装在了HTTP请求的请求体中,以名称/值的形式出现.这样,数据就不再作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。

  • GET和POST的区别

GET和POST的底层实现均是基于TCP/IP,因此在本质上两者并无差别,上面在分别介绍GET和POST时,其实已经提到几点一些应用上的差别,接下来再总结一下:

1)POST比GET更安全,因为GET的参数直接暴露在URL上,而POST的参数在Request Body内。
2)GET请求在URL中传送的参数是有长度限制的,而POST理论上没有。但浏览器一般有会规定一个界限。
3)对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
4)GET请求只能进行URL编码,而POST支持多种编码方式。
5)GET请求会被浏览器主动cache,而POST不会,除非主动设置。

但其实如果你非要给GET请求加上Request Body,或者给POST请求的URL加上参数,在技术上是完全可行的。

  • HEAD

HEAD方法与GET方法几乎是相同的,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容.当我们需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了响应内容部分。

<注意>

在HTML文档中,书写get和post时大小写均可,但在HTTP协议中的GET和POST只能是大写。


#2 请求头

请求头里有若干个属性键值对,每个键值对可称为一个头域。
每个头域由一个域名,冒号(:)和域值三部分组成,域值前可添加任意数量的空格符。头域可被拓展为多行,在每行开始处,使用至少一个空格或制表符。

HTTP最常见的请求头如下:

Transport 头域

Connection:


如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;
例如: Connection: keep-alive


当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
例如: Connection: close
代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。

Host(发送请求时,该报头域是必需的):


Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从URL中提取出来。
浏览器发送的请求消息中,就会包含Host请求报头域,
如下: Host:localhost
此处使用缺省端口号80,若指定了端口号8080,则变成:Host:localhost:8080


Client 头域

Accept:


作用:浏览器可以接受的媒体类型(MIME类型)。
例如: Accept:text/html
代表浏览器可以接受服务器回发的类型为 text/html,也就是我们常说的html文档,
如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。

通配符 * 代表任意类型。例如: Accept: / 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)

Accept-Encoding:


作用:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。
(注意:这不是只字符编码)
例如: Accept-Encoding: gzip, deflate
Server能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。许多情形下这可以减少5到10倍的下载时间,也节省带宽。

Accept-Language:


作用: 浏览器申明自己接收的语言。
语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;
例如:Accept-Language:zh-cn
如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

User-Agent:


作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器就是从User-Agent这个请求报头域中获取到这些信息的。
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
例如:
User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

Accept-Charset:


作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8
(通常我们说Charset包括了相应的字符编码方案)
例如: Accept-Charset:iso-8859-1,gb2312
如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

Authorization:


授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。


Cookie/Login 头域

Cookie:


作用: 最重要的header, 将cookie的值发送给HTTP 服务器


Entity头域

Content-Length :


作用:发送给HTTP服务器数据的长度。即请求消息正文的长度;
例如: Content-Length: 38

Content-Type:
例如:Content-Type: application/x-www-form-urlencoded


Miscellaneous 头域

Referer:


作用:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
例如:Referer:http://translate.google.cn/?hl=zh-cn&tab=wT


Cache 头域

If-Modified-Since:


作用:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
例如: If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

If-None-Match:


作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。
当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag。
使用这样的机制将提高网站的性能。
例如: If-None-Match: “03f2b33c0bfcc1:0”

Pragma:


作用:防止页面被缓存,在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样
Pargma只有一个用法,
例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

Cache-Control:


作用: 这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。
各个指令含义如下:
Cache-Control:Public 可以被任何缓存所缓存
Cache-Control:Private 内容只缓存到私有缓存中
Cache-Control:no-cache 所有内容都不会被缓存


#3 HTTP各版本差异

肝不动,肝不动,以后确实要用到这一块儿再来看大佬写的博客算了。

标记传送门:
https://www.cnblogs.com/wangkeqin/p/9265593.html
https://blog.csdn.net/qq_22238021/article/details/81197157



4.HTTP响应

服务器在接收并解释请求后会返回一个HTTP响应消息。HTTP响应也由三部分组成,分别是状态行、消息报头、响应正文。

如下图所示:
在这里插入图片描述

#1 状态行

状态行由HTTP协议版本、数字形式的状态代码以及相应的状态描述组成,结尾需回车换行。

类似如下形式:

HTTP/1.1 200 OK 

状态代码与状态描述

状态代码由3位数字组成,表示请求是否被理解或被满足,状态描述给出了关于状态码的简短文字描述。

状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。其中第一个数字有5种取值,详细参见下图:
在这里插入图片描述


#2 响应正文

响应正文是服务器返回的资源的内容,响应头与正文之间必须用空行分隔。

#3 响应消息报头

HTTP常见的响应头如下:

Cache头域

Date:


作用:生成消息的具体时间和日期,即当前的GMT时间。
例如:Date: Sun, 17 Mar 2013 08:12:54 GMT

Expires:


作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。
例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT

Vary:
例如: Vary: Accept-Encoding


Cookie/Login 头域

P3P:


作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题。
例如: P3P: CP=CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOIDSP COR

Set-Cookie:


作用:非常重要的header, 用于把cookie 发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie。
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/


Entity实体头域:
实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。

ETag:
作用 : 和If-None-Match配合使用。
例如: ETag: “03f2b33c0bfcc1:0”
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

Content-Type:


作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集。
例如: Content-Type: text/html; charset=utf-8 Content-Type:text/html;charset=GB2312 Content-Type: image/jpeg

Content-Length:


指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。
例如: Content-Length: 19847

Content-Encoding:


作用:文档的编码(Encode)方法。一般是压缩方式。
WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
例如: Content-Encoding:gzip

Content-Language:
作用: WEB服务器告诉浏览器自己响应的对象的语言者
例如: Content-Language:da


Miscellaneous 头域

Server:
作用:指明HTTP服务器的软件信息
例如: Apache/2.2.8 (Win32) PHP/5.2.5

X-Powered-By:
作用:表示网站是用什么技术开发的
例如: X-Powered-By: PHP/5.2.5


Transport头域

Connection:


例如: Connection: keep-alive
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,
当客户端再次发送Request,需要重新建立TCP连接。


Location头域

Location:
作用: 用于重定向一个新的位置,包含新的URL地址


5.浏览器缓存技术

补。

6.Cookie与Session技术

补。

7.总结,一次完整的HTTP请求过程

#1 域名解析
#2 发起TCP的3次握手
#3 建立TCP连接后发起http请求
#4 服务器响应http请求,浏览器得到html代码
#5 浏览器解析html代码,并请求html代码中的资源
#6 浏览器对页面进行渲染最终呈现给用户


本文大部分内容和图片参考自下面的博客:
https://www.cnblogs.com/duanwandao/p/9941411.html
https://blog.csdn.net/aliujiujiang/article/details/81088317
https://www.jianshu.com/p/7c8b4576e4bb
https://baijiahao.baidu.com/s?id=1626624353683941193&wfr=spider&for=pc
https://www.cnblogs.com/phpper/p/9127553.html
https://www.cnblogs.com/yumo1627129/p/7941220.html

ps:因为很多东西都来自网上,再加上我是个小白,因此上面所有内容的正确性和有效性我不敢保证,本文只作个人学习整理回顾之用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值