HTTP 基础整理
最近花了点时间稍微整理了一下常见的 HTTP 相关的知识点,没有特别的往计算机网络的深度去挖,但常见的请求与相应的相关知识点还是需要清楚的。这里只会记录一些不是经常使用但是却需要了解的部分,并不是一个完整的知识列表,在阅读文章之前请知晓。
1. TCP/IP 协议族:
如果基于常用的四层网络体系,TCP 协议位于传输层,IP 协议位于网络层。传输层还包含常用的 UDP 协议。
2. 三次握手:
在建立基于 TCP 协议的连接时,客户端与服务器端会采用三次握手机制。首先客户端发送一个含有 SYN 标识的数据包,服务器返回一个含有 SYN/ACK 标识的数据包,最后客户端再返回一个 ACK 标识的确认数据包。如果在握手中的某一个阶段莫名中断,TCP 协议会再次以相同的顺序发送相同的数据包。
3. ARP 协议与 DNS 协议:
DNS 协议用于将域名解析为 IP 地址。ARP 协议用于通过 IP 地址找到对应设备的 MAC 地址。ARP 广播机制:如果在当前的 ARP 本地缓存中没有找到对应 IP 的 MAC 地址,那么 ARP 协议会在当前域内发送一个广播请求,所有的客户机都会收到该广播请求,只有客户机发现该广播对应要询问的 IP 与自己相同时,该客户机会把自己的 MAC 地址作为响应返回。
4. URL 与 URI:
URI 是统一资源定位符的简写,主要用对应的定位符来定位某一种资源。URL 是 URI 的一个子集,主要用来表示资源在互联网中的地点。URI 格式:http://user:pass@www.example.com:80/dir/index.html?uid=1#ch1。这里扩展一下“HTTP基本认证(Basic Authentication)”。上述的 URI 完整格式中“user:pass@”部分即对应一个基本认证的登录部分。基本认证主要需要服务器返回一个 “WWW-Authenticate Basic realm=”My Realm”” 头部,在该头部指定了服务器需要的认证方式和显示给用户的备注信息。服务器端可以通过 $_SERVER["PHP_AUTH_USER"]
和 $_SERVER["PHP_AUTH_PW"]
来获得用户输入的验证信息。
if (!validate($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) {
http_response_code(401); // 401 未授权: (Unauthorized);
header("WWW-Authenticate:Basic realm='Please input you username and password!'");
echo "Please input you username and password!";
exit;
}
5. HTTP 无状态. 无连接:
HTTP 协议不会保留之前的请求或者响应,意味着每当有新的请求产生,就会有新的响应,这样做的好处是:可以做到快速的响应;缺点是:每次的请求可能包含大量的重复信息;HTTP 协议的无连接是指在每一次发送请求之前都需要重新进行三次握手连接,每次请求结束后连接都会被释放。直到 HTTP 1.1 中,引入了 “Connection: Keep-Alive” 这个头部的字段,使得 HTTP 请求的连接得以保持,具体保持连接的时间可以在服务器端进行控制。
6. 常用的 HTTP 方法:
- GET:获取资源;传输非机密信息,大小在 1024 比特以内;
- POST:获得传输实体主体;一般用于提交表单,登录或者注册等,理论上没有传输大小限制;
- PUT:传输文件;一般需要配合服务器的验证机制,协议本身不提供验证方法;
- HEAD:获得报文首部;同 GET 方法,但是不返回报文主体,只返回响应头部,用于验证 URL 有效性等;
- DELETE:删除文件;同 PUT 方法;
- OPTIONS:询问支持的方法;一般用于 CORS 复杂验证的预检请求,比如在 CORS 中使用了 PUT 或者 DELETE 方法(同时在头部携带了一个 Origin 字段);
- CONNECT:使用隧道协议连接代理;主要用于请求使用 SSL/TSL 进行连接加密的情况;不常用;
- TRACE:追踪路径;不常用;
7. 四次握手:
由于 TCP 协议是全双工的,所以在关闭连接时,要从客户端和服务端两个方向分别关闭。客户端先发送一个带有 FIN 标识的请求,服务器端返回一个 ACK 请求,完成一次关闭。服务器端同上。
8. HTTP 管线化技术:
该技术可以同时把多个 HTTP 请求放到一个 TCP/Socket 连接中,批量发送连接,仅支持 HTTP 1.1。本质是把多个 HTTP 消息放到同一个 TCP 分组中进行传输,在低延迟的连接里效果尤为突出。
9. 报文结构:
请求/响应报文首部和主体之间通过空行(CR+LF 0X0d, 0X0a)进行分割,报文首部中包含各种传输头部信息。
10. 报文实体压缩:
在传输二进制数据时,常常需要在服务器端将报文的实体数据进行压缩,常用的压缩技术有:
- gzip:GUN zip;
- compress:Unix 系统标准压缩方式;
- deflate:zlib 是一种 deflate 实现,deflate 本身是使用 LZ77 和哈弗曼进行编码的;
- identify:不压缩;
11. 分块传输编码:
服务器在响应请求并返回数据时可以实体主体分割成多个块(chunk),分块传输。每一个分块都会用一个十六进制的数来标记自己的大小,而分块的最后一个将会使用 “CR+LF” 来标记自己。该技术可以让客户端分段显示页面。
12. 多部分对象集合:
- multipart/form-data:在提交表单时如果含有图像或文件时使用;
- multipart/byteranges:响应报文包含了多个范围的内容,状态码206。很少使用;
对应于每一个类型的对象实体,HTTP 协议都会采用一个 “boundary” 作为分隔符来进行区分。
13. 不常见状态码:
- 204:服务器成功处理请求,但是不返回任何实体部分的数据;No-Content;
- 206:服务器成功处理请求,返回由响应头中 Content-Range 指定范围内的实体数据;Partial-Content;
- 303:表示资源的地址被暂时更新,同时应该使用 GET 方法来访问新的资源地址;(301. 302. 303 对于 POST 请求都会自动转换成 GET 请求,因此会导致 POST 参数丢失)
14. 代理技术:
代理服务器的基本行为就是转发接收到的客户端请求,代理并不对 URL 做任何的处理。无论是请求还是响应,每次经过一个代理服务器的转发都会向其头部追加一个 “Via” 字段,指明当前通过的代理主机信息。设置代理服务器主要用于以下几个方面。
- 代理缓存:代理服务器可以作为缓存服务器,在合适的条件下不直接访问目的服务器,而是将代理上的缓存返回给浏览器;
- 访问控制:可以对内部网络的访问进行过滤;
- 日志服务器:内部网络可以以一个单一的代理作为内部日志服务器,标记所有请求的 URL 信息。
15. End to end / Hop by hop:
端到端首部(End to end)此类首部不会在通过缓存代理时丢失,规定在缓存代理服务器转发时也要携带对应的首部直到发送到终点;逐跳首部(Hop by hop)该类别的首部只对单次转发有效,若通过缓存或者代理则不再向后转发,主要包括:Connection、Keep-Alive、Proxy 相关、Trailer、Upgrade、Transfer-Encoding 等首部。
评论 | Comments