HTTP相关面试题
TCP/IP四层协议体系结构?
由上至下顺序为:
(1)应用层(FTP、Telnet、SMTP、RIP、NFS、DNS)
(2)运输层(TCP、UDP)
(3)网际层(IP、ICMP、ARP、RARP)
(4)网络接口层
五层协议体系结构?
(1)应用层
(2)运输层
(3)网络层
(4)数据链路层
(5)物理层
OSI的七层体系结构?
(1)应用层
(2)表示层
(3)会话层
(4)运输层
(5)网络层
(6)数据链路层
(7)物理层
巧记:P Please Physical
D Do Data Link
N Not Network
T Tell Transport
S Stupid Session
P People Presentation
A Anything Application
HTTP请求的类型有哪些
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
序号 | 方法 | 描述 |
1 | GET | 请求指定的页面信息 |
2 | POST | 向指定资源提交数据进行处理请求(如提交表单和上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改 |
3 | HEAD | 类似于get请求,但是返回的响应中没有具体的内容,用于获取报头 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
5 | DELETE | 请求服务器删除指定的页面 |
6 | CONNECT | |
7 | OPTIONS | 允许客户端查看服务器的性能 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
HTTP报文组成部分
http的请求报文由:请求行、首部(请求头)、空行、主体(请求书数据)四个部分组成。
1.请求行
其中请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /data/info.html HTTP/1.1。
方法字段就是HTTP使用的请求方法,比如常见的GET/POST,其中HTTP协议版本有两种:HTTP1.0/HTTP1.1,可以这样区别:HTTP1.0对于每个连接都只能传送一个请求和响应,请求就会关闭,HTTP1.0没有Host字段;而HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段。
2.请求头部
Accept: 可接受的MIME类型。Accept-Charset:可接受的字符集。Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。Content-Length:表示请求消息正文的长度,对于POST请求来说 Content-Length必须出现。Host: 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域Host,否则系统会以400状态码返回。
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。Connection:处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点.Range:Range头域可以请求实体的一个或者多个子范围。
3.空行
通过一个空行,告诉服务器请求头部到此为止。
4.请求数据
若方法字段是GET,则此项为空,没有数据。若方法字段是POST,则通常来说此处放置的就是要提交的数据
比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。
HTTP和HTTPS的区别
(1)http和https的基本概念
http:超文本传输协议(HTTP,HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP,Transmission Control Protocol),用于从WWW服务器传输超文本到本地浏览器。
特点:无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
支持客户/服务器模式。(C/S模式)。
https:HTTPS(HyperText Transfer Protocol Secure)协议是由SSL(Secure Socket Layer,安全 套阶 层)+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。
https协议的主要作用是:建立一个信息安全通道,来确保数据的传输,确保网站的真实性
(2)http和https的区别
1、https协议需要到证书颁发机构(Certificate Authority,简称CA)申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的。
5、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
(3)为什么要使用https
1、http协议的报文传输时不加密的,有些隐私信息存在被窃听的风险。
2、http协议通信时无法验证通信方身份,可能存在伪装者(客户端、服务器)
3、http协议无法判断通信报文的完整性,通信报文在TCP/IP协议通信中可能会被篡改
(4)SSL
SSL 技术最初是由浏览器开发商网景通信公司率先倡导的,开发 过 SSL3.0 之前的版本。目前主导权已转移到 IETF(Internet Engineering Task Force,Internet 工程任务组)的手中
SSL这层协议存在于应用层(http层)到TCP层之间
传输层安全协议TLS(Transport Layer Security,TLS)是SSL的标准化后的产物
TCP连接的三次握手和四次挥手
三次握手:
SYN置1表示这是一个连接请求或连接接受报文
TCP规定,只有当ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
第一次握手:客户端向服务器发送请求报文请求建立连接。SYN=1,ACK=0表示这是一个连接请求报文,序号seq=x。发送完请求报文后,客户端进入SYN_SENT状态
第二次握手:服务器在接收了客户端的报文后结束LISTEN状态,并返回一段TCP报文,其中SYN=1,ACK=1,表示确认了序号seq有效,同意建立连接;将seq=y,ack=x+1也一同返回给客户端--确认号为ack=x+1,表示收到客户端的序号seq=x并将其值加1作为自己确认号Ack的值;返回报文后服务器进入SYN_RCVD状态
第三次握手:客户端收到服务器的响应后,结束SYN_SENT状态,并向服务器发送最后一段报文。ACK=1,表示确认收到了响应。序号为Seq=x+1,表示收到服务器端的确认号ack,并将其值作为自己的序号值;确认号为ack=y+1,表示收到服务器端序号seq=y,并将其值加1作为自己的确认号ack的值;随后客户端进入ESTABLISHED阶段。
服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。
在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。
此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。
四次挥手:
HTTP状态码
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
常见状态码
200 请求成功
请求已成功,请求所希望的响应头或数据体将随此响应返回。
301 永久重定向
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。
302 临时重定向
请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
403 禁止访问
403错误类似于401错误,不同之处在于401错误是未经授权,而403错误是禁止访问。 任何登录对403错误都不起作用。 尝试访问(被禁止的)网站目录时,就会发生403错误。
404 文件未找到
大多数人都知道这个错误。 当用户试图访问Web服务器(通常是一个网页)上某个实际不存在的资源时,就会发生404错误。404错误可能是由无效的链接引起,也可能是URL拼写错误,还可能是因为虚拟主机将所请求页面移到其他地方(或删除所请求页面)。 一些网站设置了自定义页面以防止坏链接所产生的不良影响。
502 无效网关
作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
# | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
应用场合 | 少量数据 | 传输大量数据 |
速度 | 慢 | 快 |
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
post和get区别:
- get参数通过url传递,post参数放在request body中。
- get请求在url中传递的参数是有长度限制的,而post没有。
- get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
- get请求只能进行url编码,而post支持多种编码方式
- get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
- GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
浏览器缓存
缓存分为两种:强缓存和协商缓存,根据响应的header内容来决定。
- 强缓存是利用http头中的Expires和cache-Control两个字段来控制的,用来表示资源的缓存时间。强缓存中,普通刷新会忽略它,但不会清除它,需要强制刷新。浏览器强制刷新,请求会带上cache-Control :no-cache和pragma: no-cache
- 协商缓存就是由服务器来确定缓存资源是否可用,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问。
- 普通刷新会启用弱缓存,忽略强缓存。只有在地址栏或收藏夹输入网址、通过链接引用资源等情况下,浏览器才会启用强缓存,这也是为什么有时候我们更新一张图片、一个js文件,页面内容依然是旧的,但是直接浏览器访问那个图片或文件,看到的内容却是新的。这个主要涉及到两组协商缓存相关的header字段:Etag和If-None-Match、Last-Modified和If-Modified-Since。
浏览器的缓存过程:
浏览器请求某一资源时,会先获取该资源缓存的header信息,然后根据header中的cache-Control和Expires来判断是否过期。
- 若没过期则直接从缓存中获取资源信息,包括缓存的header的信息,所以此次请求不会与服务器进行通信。这里判断是否过期,则是强缓存相关。
- 如果显示已过期,浏览器会向服务器端发送请求,这个请求会携带第一次请求返回的有关缓存的header字段信息。
比如客户端会通过If-None-Match头将先前服务器端发送过来的Etag发送给服务器,服务会对比这个客户端发过来的Etag是否与服务器的相同, 若相同,就将If-None-Match的值设为false,返回状态304,客户端继续使用本地缓存,不解析服务器端发回来的数据,若不相同就将If-None-Match的值设为true,返回状态为200,客户端重新机械服务器端返回的数据;客户端还会通过If-Modified-since头将先前服务器端发过来的最后修改时间戳发送给服务器,服务器端通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回最新的内容,如果是最新的,则返回304,客户端继续使用本地缓存。
如何解决前端开发中的缓存问题
- 对开发者来说,只要关闭浏览器缓存就可以了,找到network,Disable cache选项,打钩即可取消缓存。
- 开发者可以关闭缓存,但是不能要求所有用户都进行此类操作,此时可以在引用的文件之后拼接随机数或者日期都可以,如css/index.css?v=0.0001,浏览器就会认为是新的请求,而不会使用缓存中的文件。由于每次资源的修改都要更新引用的位置,同时修改参数的值,所以操作起来不是很方便,除非是在动态页面比如jsp中用服务器变量(v=${sysRnd})
- 如果缓存问题出现在ajax请求中,则在ajax请求的地址追加随机数
- 直接ctrl+f5,这个办法能解决页面直接引用的资源更新的问题
- 使用浏览器的隐私模式开发;
- 如果资源引用的页面,被嵌入到了一个iframe里面,可以在iframe的区域右键单击重新加载该页面
post和get区别:https://juejin.cn/post/6876623829574090760