1、HTTP头部包含哪些信息
HTTP 头部本质上是一个传递额外重要信息的键值对,主要分为通用头部、请求头部、响应头部和实体头部。
- 通用头部
通用头部是 客户端和服务器都可以使用的头部,可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能。
协议头 | 说明 | 举例 |
---|---|---|
Cache-Control | 指定当前的请求或回复中是否使用缓存机制 | Cache-Control: no-store |
Connection | 客户端(浏览器)优先使用的连接类型 | Connection: keep-alive (Upgrade) |
Date | 报文创建时间 | Date: Dec, 26 Dec 2015 17: 30: 00 GMT |
Warning | 一般性的警告,表示在实体内容中可能存在错误 | Warning: 199 Miscellaneous warning |
- 请求头部
请求头部是 请求报文特有的,它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据,如Accept头部。
协议头 | 说明 | 举例 |
---|---|---|
Accept | 告诉服务器自己允许的文本类型 | Accept: text/plain |
Accept-Charset | 浏览器申明可接受的字符集 | Accept-Charset: utf-8 |
Accept-Encoding | 浏览器声明可以接收的编码方式 | Accept-Encoding: gzip, deflate |
Accept-Language | 浏览器可以接收的响应内容的语言列表 | Accept-Language: en-US |
User-Agent | 浏览器的身份标识字符串 | User-Agent: Mozilla/…… |
- 响应头部
响应头部 便于客户端提供信息,比如,客服端在与哪种类型的服务器进行交互,如Server头部。
协议头 | 说明 | 举例 |
---|---|---|
Location | 表示重定向的URL | Location:https://gitee.com/xuleiProject/delivery-springboot |
Server | 告知客户端的服务器信息 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
- 实体头部
用于应对实体主体部分的头部,比如,可以用实体头部来说明实体主体部分的数据类型,如Content-Type头部
协议头 | 说明 | 举例 |
---|---|---|
Allow | 网络资源允许的有效请求 | Allow: GET, HEAD |
Content-encoding | 返回内容的编码方式 | Content-Encoding: gzip |
Content-Length | 返回内容的字节长度 | Content-Length: 348 |
Content-Language | 响应体的语言 | Content-Language: en,zh |
Content-Location | 请求资源可替代的备用的另一地址 | Content-Location: /index.htm |
Content-Type | 返回内容的MIME类型 | Content-Type: text/html; charset=utf-8 |
Expires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
2、Keep-Alive 和非 Keep-Alive 区别,对服务器性能有影响吗
3、HTTP长连接和短连接的使用场景
长连接:多用于操作频繁,点对点的通讯,而且客户端连接数较少的情况,如:即时通讯、网络游戏等。
短连接:用户数目较多的Web网站的HTTP服务一般会使用短连接,避免长连接导致服务端大量资源被无效占用的情况,如:京东、淘宝等客户端数量达到千万甚至上亿的大型网站。
4、HTTP的请求方法有哪些
- HTTP/1.0 定义了三种请求方法:GET, POST 和 HEAD 方法。
- HTTP/1.1 增加了六种请求方法:PUT,DELETE,OPTIONS,PATCH, TRACE 和 CONNECT 方法。
方法 | 说明 |
---|---|
GET | 请求指定的页面信息,并返回具体内容,通常只用于读取数据。 |
HEAD | 类似于HEAD请求,但返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据,并处理请求(如:提交表单或上传文件),数据被包含在请求体中,POST请求可能会建立或更新资源 |
PUT | 替换指定的资源,如果没有就新建资源 |
DELETE | 请求服务器删除 URL 标识的资源数据 |
PATCH | 对 PUT 方法的补充,对已知资源进行局部更新(PUT方法是全部更新) |
CONNECT | 将服务器作为代理,让服务器代替用户进行访问 |
OPTIONS | 向服务器发送该方法,会返回对指定资源所支持的 HTTP 请求方法 |
TRACE | 回显服务器收到的请求数据,即服务器返回自己收到的数据,主要用于测试和诊断 |
5、GET和POST的区别
GET | POST |
---|---|
GET提交的数据大小有限制 | POST 提交的数据大小则没有限制 |
GET只支持URL编码 | POST支持多种编码格式 |
GET产生一个TCP数据包 | POST产生两个TCP数据包 |
GET请求参数直接暴露在URL中,可能会存在安全问题 | POST参数放在请求主体中,比GET更为安全,主要用于修改服务器上的资源 |
用于获取资源,不管调用多少次接口,结果都不会改变,即具有幂等性, | 调用多次,都将产生新的资源,不满足幂等性 |
- 补充:
HTTP 幂等性,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。
6、HTTP和HTTPS的工作方式(建立连接的过程)
1)HTTP:
- HTTP(Hyper Text Transfer Protocol:超文本传输协议)是种简单的请求-响应协议,用于在Web浏览器和网站服务器之间传递消息,采用TCP作为支撑运输层的协议,默认工作在TCP协议的80端口。
- HTTP客户机发起一个与服务器的TCP连接,连接一旦建立,浏览器和服务器进程就可以通过套接字接口来访问TCP。客户机通过套接字接口发送HTTP请求报文和接收HTTP响应报文,服务器也会通过 套接字接口接收HTTP请求报文和发送HTTP响应报文。当通讯结束时,客户端与服务器之间的连接关闭。
- HTTP通信内容以明文的形式发送,不进行任何方式的加密。
2)HTTPS
- HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的HTTP协议,在HTTP的基础上,通过传输加密和身份认证的方式保证了数据传输的安全性,其工作流程如下:
补充:
HTTP和HTTPS的区别如下:
HTTP | HTTPS |
---|---|
以明文的形式发送内容,数据未加密,安全性较差 | 传输的数据需要加密,安全性较好 |
默认是80端口 | 默认是443端口 |
无需认证 | 需要到数字认证机构(CA)申请证书,要一定费用 |
客户端和服务器需要握手三次来建立连接 | 除了TCP的3次握手,还需要经历SSL协商,故比HTTP的页面响应速度慢 |
7、HTTPS的加密方式
HTTPS采用对称加密和非对称加密相结合的方式,先是使用SSL/TLS进行加密传输,采用证书进一步加强 非对称加密的安全性,通过非对称加密,客户端和服务端协商好之后生成对称密钥,后续的所有信息都会通过该对称密钥来实现加密和解密。
8、HTTP 是不保存状态的协议,如何保存用户状态
维持用户状态有如下两种方式:
1)基于Session实现的会话保持
- 客户端会创建一个Session对象来保存客户端的身份信息,且以键值对的形式存储(SessionId-Session),会话标识(SessionId)会被保存在客户端的Cookie中,往后每次请求都会带上该SessionId到服务器,服务器根据会话标识将之前的状态信息和会话关联起来,从而实现会话保持。
- 优点:安全性较高,客户端的状态信息被保存在服务端。
- 缺点:在基于分布式服务器的大型网站中,如果同一个浏览器两次请求落在不同的服务器上,基于Session就不能保持会话了。解决方式是 将Session的信息存储Redis中,使每个服务器都可以访问到之前的状态信息。
2)基于Cookie实现的会话保持
- 服务器发送消息时在响应头中设置Set-Cookie字段,存储客户端的状态信息,客户端根据该字段去创建Cookie并在请求时带上(每个Cookie包含客户端的状态信息),从而实现会话保持。
- 优点:服务器不用保存状态信息,减轻服务器的存储压力,也便于服务端做水平扩展。
- 缺点:不够安全,状态信息存储在客户端,故不能在客户端保存机密数据;此外,浏览器每次发起HTTP请求时,服务端都需要发送额外的Cookie到服务端,会占用更多资源。
3)两者实现方式的对比
基于 Cookie 的会话保持与基于 Session 实现的会话保持最主要的区别是前者完全将会话状态信息存储在浏览器 Cookie 中。
9、DNS的作用和原理
- DNS(Domain Name System)是域名系统的英文缩写,是一种计算机和网络的命名系统,作用于TCP/IP 网络。
- DNS作用:
识别主机通常有主机名和IP地址两种。人们往往喜欢便于记忆的主机名来标识主机,而路由器则擅长通过定长的、有着层次结构的IP地址来标识主机。
域名系统是将域名和IP地址相互映射的分布式数据库(提供主机名到IP地址转换的目录服务),方便人们访问互联网。 - DNS域名解析原理:
DNS采用了分布式的设计方案,其域名空间采用一种树形的层次结构,从上到下分别根域名服务器、顶级域名服务器和权威域名服务器。
根域名服务器在因特网上有13个,大部分位于北美洲;顶级域服务器负责顶级域名(如 com、org、net、edu)和所有国家的顶级域名(如uk、fr、ca 和 jp);权威 DNS 服务器:因特网上具有公共可访问主机(例如 Web 服务器和邮件服务器)的每个组织机构必须提供公共可访问的 DNS 记录,这些记录由组织机构的权威 DNS 服务器负责保存,这些记录将这些主机的名称映射为 IP 地址。上图展示了 DNS 服务器的部分层次结构,从上到下依次为根域名服务器、顶级域名服务器和权威域名服务器。
此外,还有一类叫做本地DNS服务器,一般来说,每个网络服务提供商(ISP)都有一台本地DNS服务器。当主机与某个ISP相连时,该ISP提供一台主机的IP地址,该主机拥有一台或多台本地DNS服务器的IP地址。
主机的本地DNS服务器通常距离主机较近,当主机发起DNS请求时,该请求被发送到本地DNS服务器,本地DNS服务器起代理作用,并将该请求转发到DNS服务器的层次结构中。
如上图,IP地址的查询经历了递归查询和迭代查询两种方式。 - 递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机自己进行下一步查询,如上图步骤(1)和(10)。
- 迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器下一步应该找哪个域名服务器进行查询,然后让本地服务器进行后续的查询,如上图步骤(2)~(9)。
10、Socket()套接字有哪些
- 套接字(Socket)是网络中不同主机的应用进程之间进行双向通信的端点的抽象,网络进程通信的一端就是一个套接字,不同主机上的进程就是通过套接字发送报文来完成通信的,如:TCP通过 主机IP地址+端口号 作为TCP连接的端口,该端口就称为套接字。
- 套接字主要有以下三种类型:
1)流套接字(SOCK_STREAM):流套接字基于 TCP 传输协议,主要用于提供面向连接、可靠的数据传输服务。由于 TCP 协议的特点,使用流套接字进行通信时能够保证数据无差错、无重复传送,并按顺序接收,通信双方不需要在程序中进行相应的处理。
2)数据报套接字(SOCK_DGRAM):和流套接字不同,数据报套接字基于 UDP 传输协议,对应于无连接的 UDP 服务应用。该服务并不能保证数据传输的可靠性,也无法保证对端能够顺序接收到数据。此外,通信两端不需建立长时间的连接关系,当 UDP 客户端发送一个数据给服务器后,其可以通过同一个套接字给另一个服务器发送数据。当用 UDP 套接字时,丢包等问题需要在程序中进行处理。
3)原始套接字(SOCK_RAW):由于流套接字和数据报套接字只能读取 TCP 和 UDP 协议的数据,当需要传送非传输层数据包(例如 Ping 命令时用的 ICMP 协议数据包)或者遇到操作系统无法处理的数据包时,此时就需要建立原始套接字来发送。
11、URI 和 URL之间的区别
URL,即统一资源定位符 (Uniform Resource Locator ),URL 其实就是我们平时上网时输入的网址,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。例如 https://leetcode-cn.com/problemset/all/ 这个 URL,标识一个特定资源并表示该资源的某种形式是可以通过 HTTP 协议从相应位置获得。
从定义即可看出,URL 是 URI 的一个子集,两者都定义了资源是什么,而 URL 还定义了如何能访问到该资源。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。简单地说,只要能唯一标识资源的就是 URI,在 URI 的基础上给出其资源的访问方式的就是 URL。
12、如果你访问一个网站很慢,怎么排查和解决
网页打开速度慢的原因有很多,这里列举出一些较常出现的问题:
-
① 首先最直接的方法是查看本地网络是否正常,可以通过网络测速软件例如电脑管家等对电脑进行测速,若网速正常,我们查看网络带宽是否被占用,例如当你正在下载电影时并且没有限速,是会影响你打开网页的速度的,这种情况往往是处理器内存小导致的;
-
② 当网速测试正常时,我们对网站服务器速度进行排查,通过 ping 命令查看链接到服务器的时间和丢包等情况,一个速度好的机房,首先丢包率不能超过 1%,其次 ping 值要小,最后是 ping 值要稳定,如最大和最小差值过大说明路由不稳定。或者我们也可以查看同台服务器上其他网站的打开速度,看是否其他网站打开也慢。
-
③ 如果网页打开的速度时快时慢,甚至有时候打不开,有可能是空间不稳定的原因。当确定是该问题时,就要找你的空间商解决或换空间商了,如果购买空间的话,可选择购买购买双线空间或多线空间;如果是在有的地方打开速度快,有的地方打开速度慢,那应该是网络线路的问题。电信线路用户访问放在联通服务器的网站,联通线路用户访问放在电信服务器上的网站,相对来说打开速度肯定是比较慢。
-
④ 从网站本身找原因。网站的问题主要包括网站程序设计、网页设计结构和网页内容三个部分。
网站程序设计:当访问网页中有拖慢网站打开速度的代码,会影响网页的打开速度,例如网页中的统计代码,我们最好将其放在网站的末尾。因此我们需要查看网页程序的设计结构是否合理;
网页设计结构:如果是 table 布局的网站,查看是否嵌套次数太多,或是一个大表格分成多个表格这样的网页布局,此时我们可以采用 div 布局并配合 css 进行优化。
网页内容:查看网页中是否有许多尺寸大的图片或者尺寸大的 flash 存在,我们可以通过降低图片质量,减小图片尺寸,少用大型 flash 加以解决。此外,有的网页可能过多地引用了其他网站的内容,若某些被引用的网站访问速度慢,或者一些页面已经不存在了,打开的速度也会变慢。一种直接的解决方法是去除不必要的加载项。
13、网页解析全过程(用户输入网址到显示对应页面的全过程)
- 1)DNS解析
当用户输入网址并回车后,浏览器获得域名,DNS将其解析为IP地址。 - 2)TCP连接
浏览器通过DNS获取到Web服务器真正的IP地址后,便向Web服务器发送TCP连接请求,通过TCP三次握手建立好连接之后,浏览器便可以将HTTP请求的数据发送给服务器了。 - 3)发起HTTP请求
HTTP协议是建立在TCP协议之上的应用层协议,其本质是在建立起的TCP连接中,按照HTTP的协议标准发送一个索要网页的请求,这一过程,会涉及到服务端的负载均衡等操作。 - 4)处理请求并返回
服务器接收到客户端的HTTP请求后,会根据HTTP请求中的内容来获取相异的服务器资源,并将资源发送给客户端 - 5)浏览器渲染
浏览器根据响应结果来显示页面,首先会解析HTML来构建DOM树,再解析CSS文件构建渲染树,浏览器开始布局渲染树并将其展示到浏览器屏幕上 - 6)断开连接
客户端和服务器通过四次挥手关闭TCP连接。