计算机网络常见面试问题 —— HTTP状态码以及常见的请求字段

HTTP状态码以及常见的请求字段

1、HTTP 概述和特征

HTTP 概述

  • HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World
    Wide Web )服务器传输超文本到本地浏览器的传送协议。
  • HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
  • HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
  • HTTP默认端口号为80,但是你也可以改为8080或者其他端口。

HTTP 概述

HTTP三点注意事项:

  • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

以下图表展示了HTTP协议通信流程:
在这里插入图片描述

1、HTTP状态码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、HTTP常见的请求字段

请求报文

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host: <a href="http://www.google.cn">www.google.cn</a>  
Connection: Keep-Alive  
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r  


POST /search HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host: <a href="http://www.google.cn">www.google.cn</a>  
Connection: Keep-Alive  
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r  

hl=zh-CN&source=hp&q=domety  

响应报文

HTTP/1.1 200 OK
Date: Sat, 01 Jul 2017 14:51:26 GMT
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: JSESSIONID=84C993F5E433C4DE9BFBA57150FFC065.ajp13_worker;path=/;HttpOnly
Content-Language: zh-CN
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 7333
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html;charset=UTF-8

<html>
  <head>
  <title>title of html.</html>
  </head>
  <body>
  <h1>Hello world!</h1>
  </body>
 </html>


1. Accept
定义:可以接收的返回数据类型。服务端会根据该字段,选择其支持的权重最高的内容形式返回。

示例:
(1)可以是多个值,用逗号隔开,如

Accept: application/json, text/plain

(2)也可以增加权重,不设置权重则默认为1,如

Accept: application/json;q=0.5, text/plain

场景实例:

服务器使用了spring的@ResponseBody注解,并且配置了xml、json的converter,如果此时accept为*/*,则服务器会按自己的逻辑选择converter,可能会返回application/xml格式的数据,如果客户端只能处理json数据,则需要声明为application/json,则服务器会返回json格式的数据。

2. Accept-Encoding
定义:支持的内容编码方式。

示例:
(1)可以是多个值,用逗号隔开,也支持使用q表示权重,其中identify表示不压缩

Accept-Encoding: gzip, compress, deflate, identify

(2*表示任意

Accept-Encoding: *

作用:告知服务器支持的编码方式,服务器可根据此对数据进行压缩,减少传输时间。

场景实例:
使用nginx服务器部署静态资源,有时候会发现资源文件太大,传输太慢。其实浏览器发起请求时已经带上了Accept-Encoding: gzip, deflate,只要在nginx中开启gzip则可以实现压缩之后再传输。

3. Cache-Control

定义:控制缓存的工作机制。

示例:

Cache-Control: no-cache
Cache-Control: max-age=0
Cache-Control: public, no-cache, max-age=0

场景实例:

以nginx部署静态资源为背景

(1)对于希望客户端缓存的文件(强制缓存),可以在nginx.conf中配置expires 30s,这样nginx返回的响应头中就会带上Cache-control: max-age=30,浏览器接收到数据后会缓存起来,并在30秒以内直接使用缓存,30s过后再次请求会向服务器请求校验缓存是否合法,服务器可能返回新的数据或者返回304。

(2)对于希望客户端缓存但每次都要校验是否过期的文件(协商缓存),可以在nginx.conf中配置expires 0s,这样nginx返回的相应头中就会带上Cache-control: max-age=0,浏览器接收到数据后会缓存起来,并在下一次请求时向服务器请求校验缓存是否合法,服务器可能返回新的数据或者返回304。

(3)每次通过在浏览器地址栏输入URL访问资源,浏览器都会自动带上Cache-control: no-cache的头部字段,意味着希望重新从目标服务器获取资源,而不从中间的代理服务器中取缓存资源。

4. If-Modified-Since

定义:校验资源是否在指定时间后修改过

示例:

If-Modified-Since: Wed, 10 Oct 2018 08:56:00 GMT

场景实例:

以下两种情况缓存均已过期

(1)上一个响应的头部包含Cache-control: max-age=0时

(2)上一个响应的头部包含Cache-control: max-age=30且30秒已过

需要再发一次请求到服务器校验数据是否被修改,此时请求需要带上If-Modified-Since,值为上一个响应的Last-Modified字段。服务器检查资源是否被修改,如果没有返回304,如果被修改返回新的资源。

5. Connection

定义:
(1)管理持久连接
(2)控制不再给代理的首部字段

示例:

Connection: Keep-Alive
Connection: close

Connection: Upgrade
Upgrade: Websocket

场景实例:

(1)由于打开一个网页一般需要从同一个服务上获取多个资源,请求头会默认带上Connection: Keep-Alive,表示重用TCP连接,当获取最后一个资源时,不再需要该TCP连接时,可以带上Connection: close。

(2)Upgrade: Websocket一般与Connection: Upgrade配合使用,只可作用于临接服务器。如果客户端经过Nginx来请求目标服务器,则到达目标服务的请求会没有Upgrade: Websocket的头部字段,于是需要在nginx中配置为该请求加上这两个请求头部字段,才能实现客户端经过Nginx与目标服务器进行websocket通讯。

6. Upgrade

定义:升级为其它协议

示例:

Connection: Upgrade
Upgrade: Websocket

场景实例:
(1)客户端发起websocket连接时,会先发起一个HTTP请求,Upgrade字段为websocket,服务器判断支持websocket后返回101,接下来使用websocket协议通讯。

(2)浏览器发起mqtt over websocket连接时,会先发起一个HTTP请求,Upgrade字段为mqttv3.1,服务器判断是否支持该版本的mqtt协议决定是否继续通讯。

7. Content-Length

定义:实体主体的长度,单位为byte。

示例:

Content-Length: 1500

场景实例:
由于TCP会产生粘包,无法分割多个HTTP报文,就需要使用头部的Content-Length字段来判断该HTTP请求到哪里结束。当使用分片传输,或者报文经过压缩时,没有此字段。

8. Host

定义:请求的域名

示例:

Host: www.baidu.com

场景实例:

通常情况下,一个物理机器会部署了多个服务,我们通过Nginx监听80端口,将不同域名的请求转发到对应服务。当浏览器发送一个HTTP请求时,会向DNS查询IP地址,并把请求发送到该IP地址的指定端口,此时会带上Host字段表明是哪个域名发起的请求,服务器通过请求头中的Host字段来判断应该转发到哪个服务。

9. Origin

定义:请求的来源

示例:

Origin: http://localhost

场景实例:

当网页需要提交一个跨域POST请求(Content-Type为application/json),会先发送一个OPTION请求,并且带上头部字段Origin,服务器会检查是否允许该源头提交跨域请求,如果允许,返回200,否则返回403 Forbidden。

10. Referer

定义:请求是从哪个网页发起的

示例:

Referer: https://www.baidu.com/

场景实例:

(1)服务器可以通过此字段来统计发起请求的来源

(2)可以通过该字段来判断是否跨站请求,如果是则禁止访问来防止跨站请求伪造,但是由于该字段可能会被篡改,所以不是特别可靠。

11. User-Agent

定义:提供浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。

示例:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36

场景实例:

(1)当我们通过手机端访问网页和通过电脑访问网页,服务器会根据UA来返回不一样的结果来适配不同的客户端/浏览器。

(2)服务器可以根据UA来统计用户使用的客户端/浏览器信息,从而更加注重该类型客户端/浏览器的体验。

(3)服务器可以根据UA来判断请求是否由网络爬虫发出,如果UA的值不是普通的浏览器,则禁止访问。但是,网络爬虫也可以直接伪造UA的值来破解。

参考

1、https://tool.oschina.net/commons?type=5
2、https://blog.csdn.net/lblblblblzdx/article/details/83144945

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值