Appearance
HTTP相关知识点记录
About 1544 wordsAbout 5 min
2022-07-19
从事开发工作这么多年了,一直没有系统的了解过网络协议和Http协议,正好最近在看罗剑锋老师的《透视HTTP协议》,所以在此做一个总结,记录一些知识点。
引用说明
本文部分资料引用来自于极客时间《透视 HTTP 协议》。
计算机网络基础
TCP/IP 网络分层模型
TCP/IP 网络分层模型分为四次,从下到上分别是 链路层、网络层、传输层、应用层。
分层 | 相关协议 |
---|---|
应用层 | SSH 协议、FTP 协议、SMTP 协议、HTTP协议 |
传输层 | TCP 协议、UDP 协议 |
网际层 | IP 协议 |
链路层 |
- 链路层。负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标记网络上的设备,所以有时候也叫 MAC 层
- 网际层。因为 IP 协议定义了“IP 地址”的概念,所以就可以在“链接层”的基础上,用 IP 地址取代 MAC 地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时只要把 IP 地址再“翻译”成 MAC 地址就可以了
- 传输层。这个层次协议的职责是保证数据在 IP 地址标记的两点之间“可靠”地传输,是 TCP 协议工作的层次,另外还有它的一个“小伙伴”UDP
- 应用层。
TCP 协议
三次握手
- 客户端向服务端发送一段 TCP 报文SYN=1,seq=x,SYN=1表示请求建立新的连接,seq=x表示序号为x,随后客户端进入同步发送状态。
- 服务端收到报文后,发送一段 TCP 报文SYN=1,ACK=1,seq=y,ack=x+1给客户端。标志位SYN=1,ACK=1表示确认收到客户端的报文 seq 序号有效,服务器能正常接收到客户端发送的数据,并同意建立连接。seq=y,ack=x+1表示发送一个y的序号给客户端,并且将客户端发送的seq+1作为确认号发送给客户端。
- 客户端收到服务端返回的报文后,发送报文ACK=1,seq=x+1,ack=y+1给服务器,告诉服务器自己收到的序号有效,并且继续从x+1处发送报文,确认号是服务器返回的seq+1。
四次挥手
挥手阶段是指一方主动要求断开连接。这里以客户端主动要求断开连接为例进行说明。
- 客户端发送报文FIN=1,seq=u给服务端,FIN=1表示要断开连接,序号是seq=u。
- 服务端收到报文后,回复报文ACK=1,seq=v,ack=u+1给客户端,ACK=1表示请求断开连接的序列号有效,服务端发送的数据到v了,确认号是u+1。然后服务端继续向客户端发送数据。
- 当服务端的数据发送完成之后,服务端发送报文FIN=1,ACK=1,seq=w,ack=u+1给客户端,告诉客户端服务端的数据以及发送完成了,这个确认号ack=u+1是客户端上次请求断开连接的序号。
- 客户端收到服务端发送的报文后,发送报文ACK=1,seq=u+1,ack=w+1给服务端,告诉服务端自己已经收到了断开连接的请求,接下来彼此不在进行数据交换了。然后客户端进入时间等待状态,这个状态必不可少,因为如果第四次挥手服务端没有接收到,会无法完成断开连接,这个阶段是为了接收服务端的再一次第三次挥手。
数据包
Flag 标志位:
- URG: 紧急指针有效
- ACK: 确认序列号有效
- PSH: 接收方应该尽快
- RST: 重置连接
- SYN: 发起一个新的连接
- FIN: 释放一个连接。
IP 协议
OSI 7层协议
OSI全称是“开放式系统互联通信参考模型”(Open System Interconnection Reference Model)。
OSI 分层 | 说明 |
---|---|
应用层 | 面向具体的应用传输数据 |
表现层 | 把数据转换为合适、可理解的语法和语义 |
会话层 | 维护网络中的连接状态,即保持会话和同步 |
传输层 | 相当于 TCP/IP 里的传输层 |
网络层 | 相当于 TCP/IP 里的网际层 |
数据链路层 | 它基本相当于 TCP/IP 的链接层 |
物理层 | 网络的物理形式,例如电缆、光纤、网卡、集线器等等 |
一些概念
CDN
CDN的全称是内容分发网络(Content Delivery Network)。
DNS
URI 和 URL 的区别
Http 组成
请求
请求数据包括
响应
Body 体
一些问题
在浏览器输入一个 url 请求,背后的执行过程
- 浏览器查找本地域名缓存,将域名解析为 IP 地址,如果找不到则去操作系统缓存查找,再找不到就去本地 hosts 文件中查找,如果还是找不到就去 DNS 服务器查找,总之是要找到这个域名对应的 IP 地址。
- 将 http 请求封装成请求包,包括头信息和 body 体。
- 将 http 请求包封装成 TCP 包。
- 将 TCP 包封装成 IP 包。
- 到达数据链路层则需要将数据包传输到目标机器上,这时候需要找到目标机器在哪里。根据本机IP与子网掩码做 and 操作,同目标 IP 与子网掩码做 and 操作的结果做比较,如果一致,则说明是在同一子网内部,那么说明可以通过广播将数据包传输出去了如果不一致,则需要将数据包丢给网关转发出去。