1.从输入URL到页面展示发生了什么?
1.在浏览器中输入指定网页的URL;
2.浏览器通过DNS协议,获取域名对应的IP地址;
3.浏览器根据IP地址和端口号,向目标服务器发送一个TCP连接请求;
4.浏览器在TCP连接上,向服务器发送一个HTTP请求报文,请求获取网页的内容;
5.服务器收到HTTP请求报文后,处理请求,并返回HTTP响应报文给浏览器;
6.浏览器收到HTTP响应报文后,解析响应体中的HTML代码,渲染网页的结构和样式,同时根据HTML中的其他资源的URL(如图片,css,js),再次发起HTTP请求,获取这些资源的内容,直到网页完全加载显示;
7.浏览器在不需要和服务器通信时,可以主动关闭TCP连接,或者等待服务器的关闭请求;
2.http1.0 vs http1.1
(1)响应状态码:http1.0仅规定了16种状态码,而http1.1新增了大量状态码;
(2)缓存处理:
http1.0中,服务器端使用expires标签来标志一个响应体,在expires标志时间内的请求,都会获得该响应体的缓存。服务器端在初次返回给客户端的响应体中,有一个last-modified标签,该标签标记了被请求资源在服务器端的最后一次修改。在请求头中,使用if-modified-since标签,该标签标志一个时间,意为向服务器端询问该时间之后我所请求的资源是否有被修改过,通常情况下,if-modified-since的值就是上一次获得该资源时,响应体中last-modified的值。如果服务器接收到了请求头,并判断if-modified-since时间后资源没有被修改过,则返回给客户端一个304not modified响应头,表示缓存可用,从浏览器中拿取;如果资源被修改过,则返回一个200ok的响应体,并附带全新的资源。
http1.1在1.0的基础上,大大增加了灵活性和可扩展性。基本工作原理和1.0保持不变,而是增加了更多细致的特性。其中,请求头中最常见的特性就是cache-control;
(3)连接方式:
http1.0默认使用短连接,也就是说客户端和服务器每进行一次http操作,就建立一次连接,任务结束就中断连接。这样会导致有大量的“握手报文”和“挥手报文”占用了带宽;
http1.1优化为默认长连接模式。建立的tcp连接会持续打开,为后续的客户端-服务端的数据交互提供服务。如果tcp一直保持连接的话也是一种浪费,因此一些服务器软件(比如apache)还支持超时时间,在超时时间内没有新的请求达到,tcp连接才会关闭;
http1.0中仍提供了长连接选项,即在请求头中加入Connection:Keep-alive。如果在http1.1中不希望使用长连接选项,也可以在请求头中加入Connect:close;
http协议的长连接和短连接,实质上是tcp协议的长连接和短连接;实现长连接需要客户端和服务端都支持长连接;
(4)Host头处理
域名系统(DNS)允许多个主机名绑定到同一个ip地址上,但是http1.0没有考虑这个问题,例如资源url是http://example.org/home.html,http1.0的请求报文中,将会请求get /home.html http/1.0,也就是不会加入主机名,这样的报文送到服务器端,服务器是理解不了客户端想请求的真正网址。因此,http1.1在请求头中加入了host字段,指定真正的网址;
(5)压缩
许多格式的数据在传输时都会做预压缩处理。数据的压缩可以大幅优化带宽的利用。然而,http1.0对数据压缩的选项提供的不多,不支持压缩细节的选择,也无法区分端到端压缩或者是逐跳压缩。
http1.1则对内容编码和传输编码做了区分。内容编码总是端到端的,传输编码总是逐跳的。
3.http常见状态码总结
http状态码用于描述http请求的结果。
类别 | 原因短语 | |
1xx | informational(信息性状态码) | 接收的请求正在处理 |
2xx | success(成功状态码) | 请求正常处理完毕 |
3xx | redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | client error(客户端错误状态码) | 服务器无法处理请求 |
5xx | server error(服务器错误状态码) | 服务器处理请求出错 |
(1)2xx success
200:ok,请求被成功处理;
201:created,请求被成功处理并且在服务端创建一个或多个新的资源;
202:accepted,服务端已经接收到了请求但是还未处理;
204:no content,服务端已经成功处理了请求,但是没有返回任何内容;
(2)3xx Redirection
301:moved permanently,资源被永久重定向了;
302:found,资源被临时重定向了;
(3)4xx client error
400:bad request,发送的http请求存在问题,比如请求参数不合法,请求方法错误;
401:unauthorized,未认证却请求需要认证之后才能访问的资源;
403:forbidden,直接拒绝http请求,不处理。一般针对非法请求;
404:not found,你请求的资源未在服务器端找到。
409:conflict,表示请求的资源与服务端当前的状态存在冲突,请求无法被处理;
(4)5xx server error
500:internal server error,服务端出问题了(通常是服务器出bug);
502: bad gateway,我们的网关将请求转发到服务器,但是服务端返回的却是一个错误的响应;
4.http和https的区别?
端口号:http默认是80,https默认是443;
url前缀:http的url前缀是http://,https的前缀是https://;
安全性和资源消耗:http协议运行在tcp之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。https是运行在ssl/tls上的http协议,ssl/tls运行在tcp之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的秘钥用服务器方的证书进行了非对称加密。所以说,http安全性没有https高,但是https比http耗费更多服务器资源;
seo:(搜索引擎优化)搜索引擎通常会更青睐使用https协议的网站,因为https能够提供更高的安全性和用户隐私保护。使用https协议的网站在搜索结果中可能会被优先显示,从而对seo产生影响。
5.http是不保存状态的协议,如何保存用户状态?
http是一种不保存状态,即无状态协议。Session机制的存在就是为了解决这个问题,Session的主要作用就是通过服务端记录用户的状态。在服务端保存Session的方法很多,最常用的就是内存和数据库。
6.Tcp和Udp的区别?
1.是否面向连接:Udp在传送数据之前不需要先建立连接。而Tcp提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。
2.是否是可靠传输:远程主机在收到udp报文后,不需要给出任何确认,并且不保证数据不丢失。不保证是否按顺序到达。Tcp提供可靠的传输服务,tcp在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制等机制。通过tcp连接传输的数据,无差错、不丢失、不重复、并且按序到达。
3.是否有状态:tcp传输是有状态的,这个有状态说的是tcp会去记录自己发送消息的状态比如消息是否发送了,是否被接受了等等。为此,tcp需要维持复杂的连接状态表。而udp是无状态服务;
4.传输效率:由于使用tcp进行传输的时候多了连接、确认、重传等机制,所以tcp的传输效率要比udp低很多;
5.传输形式:tcp是面向字节流的,udp是面向报文的;
6.首部开销:tcp首部开销比udp首部开销要大;
7.是否提供广播或多播服务:tcp只支持点对点通信,udp支持一对一、一对多、多对一、多对多;
7.tcp三次握手和四次挥手?
一次握手:客户端发送带有syn(seq = x)标志的数据包到服务端,然后客户端进入syn_send状态,等待服务端的确认;
二次握手:服务端发送带有syn + ack(seq = y, ack = x + 1)标志的数据包到客户端,然后服务端进入syn_recv状态;
三次握手:客户端发送带有ack(ack = y + 1)标志的数据包到服务端,然后客户端和服务端都进入established状态,完成tcp三次握手;
第一次挥手:客户端发送一个fin(seq = x)标志的数据包到服务端,用来关闭客户端到服务端的数据传送。然后客户端进入fin-wait-1状态;
第二次挥手:服务端收到这个fin(seq = x)标志的数据包,它发送一个ack(ack = x + 1)标志的数据包到客户端,然后服务端进入close-wait状态,客户端进入fin-wait-2状态;
第三次挥手:服务端发送一个fin(seq = y)标志的数据包到客户端,请求关闭连接,然后服务端进入last-ack状态;
第四次挥手:客户端发送ack(ack = y + 1)标志的数据包到服务端,然后客户端进入time-wait状态,服务端在收到ack(ack = y + 1)标志的数据包后进入close状态。此时如果客户端等待2 msl(报文段最长寿命) 后依然没有收到回复说明服务端已经正常关闭,随后客户端也可以关闭连接了;
8.tcp如何保证传输的可靠性?
1.基于数据块传输:应用数据被分割成tcp认为最适合发送的数据块,再传输给网络层,数据块被称为报文段或段;
2.对失序数据包重新排序以及去重:tcp为了保证不发生丢包,会给每个包一个序列号,有了序列号就能对接收到的数据根据序列号排序,并且去掉重复序列号的数据就可以实现数据包去重;
3.校验和:tcp将保持它首部和数据的校验和。这是一个端到端的校验,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差错,tcp将丢弃这个报文段和不确认收到此报文段。
4.重传机制:在数据包丢失或延迟的情况下,重新发送数据包,直到收到对方的确认应答(ack)。
5.流量控制:tcp连接的每一方都有固定大小的缓冲空间,tcp的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。tcp使用的流量控制协议是可变大小的滑动窗口协议。
6.拥塞控制:当网络拥塞时,减少数据的发送。tcp在发送数据时,需要考虑两个因素:一是接收方的接收能力,二是网络的拥塞程度。接收方的接收能力用滑动窗口表示,表示接收方还有多少缓冲区可以用来接收数据,网络的拥塞程度用拥塞窗口表示,它是发送方根据网络状况自己维护的一个值,表示发送方认为可以再网络中传输的数据量。发送方发送数据的大小是滑动窗口和拥塞窗口的最小值,这样可以保证发送方既不会超过接收方的接收能力,也不会造成网络的过度拥塞;