共计 4124 个字符,预计需要花费 11 分钟才能阅读完成。
一、前言
主要包括:1、http 基础:TCP/IP,TCP 协议,IP 协议,DNS 协议,URI 与 URL;
2、http 协议:http 报文,http 方法,http 状态码,常见问题
名词解释:
(1)HTTP(HyperText Transfer Protocol)超文本传输协议
(2)URL(Uniform Resource Locator)统一资源定位符
(3)URI(Uniform Resource Identifer)统一资源标识符
(4)TCP(Transmission Control Protocol)传输控制协议
(5)IP(Internet Protocol)网际协议
(6)UDP(User Data Protocol)用户数据报协议
(7)MAC 地址(Media Access Control)媒体访问控制地址/物理地址/硬件地址
(8)ARP 协议(Address Resolution Protocol)地址解析协议
二、HTTP 基础
2.1TCP/IP
TCP/IP 是互联网相关的各类协议族的总称,而 http 是 TCP/IP 协议族中的一个子集。
TCP/IP 协议族可以分为四层:
(1)应用层:决定向用户提供应用服务时通信的活动,TCP/IP 协议族内预存了各类通用的应用服务,如:http,ftp,dns 等。
(2)传输层:提供处于网络连接中的两台计算机之间的数据传输,包含两个协议:tcp,udp。
(3)网络层:用来处理网络上流动的数据包,在众多的选项中选择一条传输线路,将数据包传送到对方计算机。包含的协议:IP 协议。
(4)数据链路层:用来处理连接网络的硬件部分。
2.2 IP 协议
IP 协议属于网络层,负责处理网络上流动的数据包。为了保证传送成功,需要满足各类条件,其中两个重要的条件时 IP 地址和 MAC 地址。
(1)IP 地址,指明了节点被分配到的地址;
(2)MAC 地址,指网卡所属的固定地址;
(3)IP 地址可以和 MAC 地址进行配对,IP 地址可以变换,但是 MAC 地址基本上不会更改;
(4)使用 ARP 地址解析协议可以根据通信方的 IP 地址反查出对应的 MAC 地址
2.3 TCP 协议
TCP 协议位于传输层,提供可靠的字节流服务(也就是说,将大数据分隔成以报文段为单位的数据包进行管理)。
为了确保数据准确无误的到达目标处,TCP 协议通常采用三次握手策略。
如果在握手的过程中某一个阶段莫名的中断了,TCP 协议会再次以相同的顺序发送相同的数据包。
2.4DNS 协议
DNS 协议位于应用层,提供域名到 IP 地址之间的解析服务。
2.5 URI 和 URL
URI 是某一个协议方案表示的资源的定位标识符,协议方案是指访问资源所使用的协议类型,如:http,ftp,file 等。
URL 用字符串标识某一个互联网资源,而 URL 表示资源的地点,URL 是 URI 的子集。
2.6 HTTP 协议
HTTP 协议用于客户端和服务器端之间的通信。请求必定由客户端发出,而服务器端回复响应。
HTTP 协议不保存状态,为无状态协议。这是为了更快的处理大量事务,确保协议的可伸缩性而特意设计的。
但是随着 Web 的不断发展,这一特性也引发了一些问题,如:如何保持登录状态、如何记录用户信息等,为了解决这一问题,引入了 Cookie 技术。
2.6.1 常见状态码
2XX 成功
200 OK,表示从客户端发来的请求在服务器端被正确处理
204 No content,表示请求成功,但响应报文不含实体的主体部分
205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与 204 响应不同在于要求请求方重置内容
206 Partial Content,进行范围请求
3XX 重定向
301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
302 found,临时性重定向,表示资源临时被分配了新的 URL
303 see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源
304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
307 temporary redirect,临时重定向,和 302 含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
4XX 客户端错误
400 bad request,请求报文存在语法错误
401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
403 forbidden,表示对请求资源的访问被服务器拒绝
404 not found,表示在服务器上没有找到请求的资源
5XX 服务器错误
500 internal sever error,表示服务器端在执行请求时发生了错误
501 Not Implemented,表示服务器不支持当前请求所需要的某个功能
503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
2.6.2HTTP 报文头部(HTTP 首部)
通用字段 作用
Cache-Control 控制缓存的行为
Connection 浏览器想要优先使用的连接类型,比如:keep-alive
Date 创建报文时间
Pragma 报文指令
Via 代理服务器相关信息
Transfer-Encoding 传输编码方式
Upgrade 要求客户端升级协议
Warning 在内容中可能存在错误
请求字段 作用
Accept 能正确接收的媒体类型
Accept-Charset
能正确接收的字符集
Accept-Encoding 能正确接收的编码格式列表
Accept-Language 能正确接收的语言列表
Expect 期待服务端的指定行为
From 请求方邮箱地址
Host 服务器的域名
If-Match 两端资源标记比较
If-Modified-Since 本地资源未修改返回 304(比较时间)
If-None-Match 本地资源未修改返回 304(比较标记)
User-Agent 客户端信息
Max-Forwards 限制可被代理及网关转发的次数
Proxy-Authorization 向代理服务器发送验证信息
Range 请求某个内容的一部分
Referer 示浏览器所访问的前一个页面
TE 传输编码方式
响应字段 作用
Accept-Ranges 是否支持某些种类的范围
Age 资源在代理缓存中存在的时间
ETag 资源标识
Location 客户端重定向到某个 URL
Proxy-Authenticate 向代理服务器发送验证信息
Server 服务器名字
WWW-Authenticate 获取资源需要的验证信息
实体字段 作用
Allow 资源的正确请求方式
Content-Encoding 内容的编码格式
Content-Language 内容使用的语言
Content-Length request body 长度
Content-Location 返回数据的备用地址
Content-MD5 Base64 加密格式的内容 MD5 检验值
Content-Range 内容的位置范围
Content-Type 内容的媒体类型
Expires 内容的过期时间
Last_modified 内容的最后修改时间
2.6.3 HTTP 方法
方法名称 方法描述
GET 获取资源
POST 传输实体主体
PUT 传输文件,自身不带验证机制,在无验证机制或不遵守 REST 标准时不建议使用
DELETE 删除文件,自身不带验证机制
HEAD 获取报文首部,和 GET 方法一样,不返回报文主体部分
OPTIONS 询问支持的方法,返回服务器所支持的方法
TRACE 追踪路径,可以通过该方法查询发送出去的请求是如何被加工修改或篡改的。容易引发 XST 攻击,不常用。
CONNECT 要求用隧道协议连接代理
三、HTTPS 基础
HTTPS 还是通过了 HTTP 来传输信息,但是信息通过 TLS 协议进行了加密。
3.1 TLS
TLS 协议位于传输层之上,应用层之下。首次进行 TLS 协议传输需要两个 RTT,接下来可以通过 Session Resumption 减少到一个 RTT。(RTT 表示发送端发送数据到接收到对端数据所需的往返时间)
在 TLS 中使用了两种加密技术,分别为:对称加密和非对称加密。
对称加密:
对称加密就是两边拥有相同的秘钥,两边都知道如何将密文加密解密。
非对称加密:
有公钥私钥之分,公钥所有人都可以知道,可以将数据用公钥加密,但是将数据解密必须使用私钥解密,私钥只有分发公钥的一方才知道。
3.2 TLS 握手过程如下图:
(1)客户端发送一个随机值,需要的协议和加密方式
(2)服务端收到客户端的随机值,自己也产生一个随机值,并根据客户端需求的协议和加密方式来使用对应的方式,发送自己的证书(如果需要验证客户端证书需要说明)
(3)客户端收到服务端的证书并验证是否有效,验证通过会再生成一个随机值,通过服务端证书的公钥去加密这个随机值并发送给服务端,如果服务端需要验证客户端证书的话会附带证书
(4)服务端收到加密过的随机值并使用私钥解密获得第三个随机值,这时候两端都拥有了三个随机值,可以通过这三个随机值按照之前约定的加密方式生成密钥,接下来的通信就可以通过该密钥来加密解密
通过以上步骤可知,在 TLS 握手阶段,两端使用非对称加密的方式来通信,但是因为非对称加密损耗的性能比对称加密大,所以在正式传输数据时,两端使用对称加密的方式通信。
PS:以上说明的都是 TLS 1.2 协议的握手情况,在 1.3 协议中,首次建立连接只需要一个 RTT,后面恢复连接不需要 RTT 了。
四、GET 和 POST 的区别
从技术上说:
1、get 请求能缓存,post 不能;
2、post 相对于 get 来说,安全一点点,因为 get 请求都会包含在 URL 里,会被浏览器保存历史记录,post 不会,但是在抓包的情况是一样的。
3、post 可以 request body 来传递比 get 更多的数据,get 米有这个技术。
4、url 长度有限制,会影响 get 请求,长度限制是浏览器限制规定的,不是 rfc(互联网通信协议)规定的。
5、post 支持更多的编码类型且不对数据类型限制
五、参考
1、https://github.com/junruchen/…
2、https://www.cnblogs.com/Leo_w…
【注:我是 saucxs,也叫 songEagle,松宝写代码,文章首发于 sau 交流学习社区 https://www.mwcxs.top,关注我们每天阅读更多精彩内容】