整理了一些面试的时候常用的关于HTTP的问题。
-
http协议
简介:
- HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
- HTTP是一个属于应用层的面向对象的协议,基于TCP/IP通信协议来传递数据。它工作于客户端-服务端架构为上。
- 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
- 默认端口号是80
主要特点:
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
- 支持B/S及C/S模式。
工作原理:
- 客户端连接到Web服务器
- 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接
- 发送HTTP请求
- 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
- 服务器接受请求并返回HTTP响应
- Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
- 释放连接TCP连接
- 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
- 客户端浏览器解析HTML内容
- 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
http请求:
http请求 一个具体的HTTP请求
图是网上找的,具体是从哪里来的忘记了,侵删。
- 请求方法:8个,具体看第2个问题
- 请求头
- Accept:请求报文可通过一个“Accept”报文头属性告诉服务端客户端接受什么类型的响应。
- Cookie:客户端的Cookie就是通过这个报文头属性传给服务端的
- Refer:表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。
- Cache-Control:对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的
- Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
- Host:初始URL中的主机和端口。
-
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
............
http响应:
分为状态行、响应头、空行和响应体
- 状态码:1xx,2xx,3xx,4xx,5xx,具体看第5个问题
- 响应头
- Content-Encoding:文档的编码方法
- Content-Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
- Date:当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
- Expires:应该在什么时候认为文档已经过期,从而不再缓存它?
- Cache-Control:响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。
- ETag:一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应
- Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
- Location:表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
-
Set-Cookie:服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的:
......
-
常见的method有哪些?都是什么作用?
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- GET:GET是最常用的方法,通常用于请求服务器发送某个资源。
-
HEAD:与GET类似,但服务器在响应中只返回首部,不返回实体的主体部分。此方法被用来获取请求实体的元信息而不需要传输实体主体(entity-body)。
此方法经常被用来测试超文本链接的有效性 ,可访问性,和最近的改变。 - PUT:让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者,如果那个URL已经存在的话,就用这个主体替代它
- POST:起初是用来向服务器输入数据的。实际上,通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到要去的地方。
- TRACE:会在目的服务器端发起一个环回诊断,最后一站的服务器会弹回一个TRACE响应并在响应主体中携带它收到的原始请求报文。TRACE方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链。
- OPTIONS:请求web服务器告知其支持的各种功能。可以查询服务器支持哪些方法或者对某些特殊资源支持哪些方法。
- DELETE:请求服务器删除请求URL指定的资源
-
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
............
-
PUT和POST的区别
对于单个输入或者无输入的运算方法,如果每次都是同样的结果,则称其是幂等的
在计算机中,可以这么理解,一个幂等操作的特点就是其任意多次执行所产生的影响均与依次一次执行的影响相同。- POST:
- 用于提交请求,可以更新或者创建资源,是非幂等的
- 举个例子,在我们的支付系统中,一个api的功能是创建收款金额二维码,它和金额相关,每个用户可以有多个二维码,如果连续调用则会创建新的二维码,这个时候就用POST
- PUT
- 用于向指定的URI传送更新资源,是幂等的
- 还是那个例子,用户的账户二维码只和用户关联,而且是一一对应的关系,此时这个api就可以用PUT,因为每次调用它,都将刷新用户账户二维码
- POST:
-
GET和POST的区别
以下仅是浏览器内的表现:
GET POST 含义 从服务器获取数据 向服务器传递数据 数据提交 放在URL之后 请求体 大小 2kb左右 无限制 安全性 表单数据直接暴露在url上 相对安全 缓存 能缓存 不能被缓存 书签 以GET请求的URL能够保存为浏览器书签 以POST请求的URL无法保存为浏览器书签 HTTP没有规定GET的数据要附加在url后,POST的数据要放在请求体内。这一规定是HTML标准规定的。
HTTP对GET和POST大小都是无限制的。GET比较小的原因是浏览器的URL是有长度限制的。而POST也受服务器处理的影响。
至于安全性,实际上两者的数据都可以被截取,只是get直接就在url就可截取,post麻烦一些而已
-
常见的http状态码都有哪些?
- 1xx:信息状态码
- 100 Continue:客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完前向客户端发送一个最终响应
- 101 Switching Protocols:服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到Upgrade消息头中定义的那些协议。
- 2xx:成功状态码
- 200 OK:请求成功,请求所希望的响应头或数据体将随此响应返回
- 201 Created:请求成功并且服务器创建了新的资源
- 202 Accepted:服务器已接受请求,但尚未处理
- 203 Non-Authoritative Information:
- 204 No Content:
- 205 Reset Content:
- 206 Partial Content:
- 3xx:重定向
- 301 Moved Permanently:请求的网页已永久移动到新位置。
- 302 Found:临时性重定向。
- 303 See Other:临时性重定向,且总是使用 GET 请求新的 URI。
- 304 Not Modified:自从上次请求后,请求的网页未修改过。
- 4xx:客户端错误
- 400 Bad Request:服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
- 401 Unauthorized:请求未授权。
- 403 Forbidden:禁止访问。
- 404 Not Found:找不到如何与 URI 相匹配的资源。
- 5xx:服务器问题
- 500 Internal Server Error:最常见的服务器端错误。
- 503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。
- 1xx:信息状态码
-
301和302的区别是什么?
301 Moved Permanently:请求的网页已永久移动到新位置。
302 Found:临时性重定向。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;
302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。302可能有网址劫持的问题
-
http请求头的connection:keep-alive是什么作用?与TCP的keep-alive的区别?
- HTTP的connection:keep-alive:要让一个TCP连接活久点。
- 普通情况下,HTTP协议采用“请求-应答”模式,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);
- 当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
- TCP的keep-alive:检查当前TCP连接是否活着。 当一个连接“一段时间”没有数据通讯时,一方会发出一个心跳包(Keep Alive包),如果对方有回包则表明当前连接有效,继续监控。
- HTTP的connection:keep-alive:要让一个TCP连接活久点。
-
tcp/ip 了解么?三次握手是怎么样的?每次传递的内容是什么?如果有一次丢失怎么办?
为了准确无误地把数据送达目标处,TCP 协议采用了三次握手策略。
用TCP协议把数据包送出去后, TCP 不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。第一次:客户端发送带SYN(发起新连接)标志的消息。seq=x
第二次:服务器回复SYN+ACK(确认序号有效)的消息。seq=y,ack=x+1
第三次:客户端回复ACK的消息。seq=x+1,ack=y+1若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。
-
TCP/IP一定要三次握手吗
是的一定要的!
在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此可以正常的建立连接。
但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据...问题就在这里,
Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,“三次握手”很有必要!
网友评论