七、Socket 连接与 HTTP 连接的联系与区别
1. 由于通常情况下 Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
2. 而 HTTP 连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
3. 很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是 Socket 连接,服务器就可以直接将数据传送给客户端;若双方建立的是 HTTP 连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
八、http(tcp) 报文结构
例如一个 100kb 的 HTML 文档需要传送到另外一台计算机,并不会整个文档直接传送过去,可能会切割成几个部分,比如四个分别为 25kb 的数据段。而每个数据段再加上一个 TCP 首部,就组成了 TCP 报文。 TCP 报文 (Segment),包括首部和数据部分。
九、http 报文大小限制
如前所述,一个 HTTP 报文包含起始行,头域和消息体,HTTP 协议本身并没有对报文中任一部分的长度做限制,也就是说,理论上一个请求 URI 可以无限长,头域可以无限多,请求体可以无限大。但在实际场景下,请求 URI 的长度会受到浏览器的限制,如果在浏览器中输入过长的 URL,那么浏览器会自动进行截断。而服务器出于安全性和效率的考虑,也会对头域和消息体的大小作出一定的限制。
十、HTTP 的缓存机制
Http 的缓存主要利用 header 里的两个字段来控制,通过 Cache-control 和 Etag 的配合来实现 Http 的缓存机制。
1. Cache-control主要包含以及几个字段:
private:则只有客户端可以缓存
public:客户端和代理服务器都可以缓存
max-age:缓存的过期时间
no-cache:需要使用对比缓存来验证缓存数据
no-store:所有内存都不会进行缓存
2. ETag:即用来进行对比缓存,Etag 是服务端资源的一个标识码
当客户端发送第一次请求时服务端会下发当前请求资源的标识码 Etag,下次再请求时,客户端则会通过 header 里的 If-None-Match 将这个标识码 Etag 带上,服务端将客户端传来的 Etag 与最新的资源 Etag 做对比,如果一样,则表示资源没有更新,返回 304。
十一、如何理解 HTTP 协议是无状态的
HTTP 协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议(无连接)。
十二、HTTP 长连接、短连接
在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。
而从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
十三、cookie
Cookie 就是用来在本地缓存记住一些状态的,一个 Cookie 一般都包含 domin(所属域)、path、Expires(过期时间)等几个属性。服务端可以通过在响应头里的 set-cookies 来将状态写入客户端的 Cookie 里。下次客户端发起请求时可以带上cookie。