HTTP相关知识点记录

作草分茶July 19, 2022About 5 min

HTTP相关知识点记录

从事开发工作这么多年了,一直没有系统的了解过网络协议和Http协议,正好最近在看罗剑锋老师的《透视HTTP协议》,所以在此做一个总结,记录一些知识点。

引用说明

本文部分资料引用来自于极客时间《透视 HTTP 协议》。open in new window

计算机网络基础

TCP/IP 网络分层模型

TCP/IP 网络分层模型分为四次,从下到上分别是 链路层网络层传输层应用层

分层相关协议
应用层SSH 协议、FTP 协议、SMTP 协议、HTTP协议
传输层TCP 协议、UDP 协议
网际层IP 协议
链路层
  1. 链路层。负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标记网络上的设备,所以有时候也叫 MAC 层;
  2. 网际层。因为 IP 协议定义了“IP 地址”的概念,所以就可以在“链接层”的基础上,用 IP 地址取代 MAC 地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时只要把 IP 地址再“翻译”成 MAC 地址就可以了;
  3. 传输层。这个层次协议的职责是保证数据在 IP 地址标记的两点之间“可靠”地传输,是 TCP 协议工作的层次,另外还有它的一个“小伙伴”UDP;
  4. 应用层。

TCP 协议

43CoBZ

G8mq0q

三次握手
  1. 客户端向服务端发送一段 TCP 报文SYN=1,seq=x,SYN=1表示请求建立新的连接,seq=x表示序号为x,随后客户端进入同步发送状态。
  2. 服务端收到报文后,发送一段 TCP 报文SYN=1,ACK=1,seq=y,ack=x+1给客户端。标志位SYN=1,ACK=1表示确认收到客户端的报文 seq 序号有效,服务器能正常接收到客户端发送的数据,并同意建立连接。seq=y,ack=x+1表示发送一个y的序号给客户端,并且将客户端发送的seq+1作为确认号发送给客户端。
  3. 客户端收到服务端返回的报文后,发送报文ACK=1,seq=x+1,ack=y+1给服务器,告诉服务器自己收到的序号有效,并且继续从x+1处发送报文,确认号是服务器返回的seq+1。
四次挥手

挥手阶段是指一方主动要求断开连接。这里以客户端主动要求断开连接为例进行说明。

  1. 客户端发送报文FIN=1,seq=u给服务端,FIN=1表示要断开连接,序号是seq=u。
  2. 服务端收到报文后,回复报文ACK=1,seq=v,ack=u+1给客户端,ACK=1表示请求断开连接的序列号有效,服务端发送的数据到v了,确认号是u+1。然后服务端继续向客户端发送数据。
  3. 当服务端的数据发送完成之后,服务端发送报文FIN=1,ACK=1,seq=w,ack=u+1给客户端,告诉客户端服务端的数据以及发送完成了,这个确认号ack=u+1是客户端上次请求断开连接的序号。
  4. 客户端收到服务端发送的报文后,发送报文ACK=1,seq=u+1,ack=w+1给服务端,告诉服务端自己已经收到了断开连接的请求,接下来彼此不在进行数据交换了。然后客户端进入时间等待状态,这个状态必不可少,因为如果第四次挥手服务端没有接收到,会无法完成断开连接,这个阶段是为了接收服务端的再一次第三次挥手。
数据包

Flag 标志位:

  • URG:紧急指针有效;
  • ACK:确认序列号有效;
  • PSH:接收方应该尽快;
  • RST:重置连接;
  • SYN:发起一个新的连接;
  • FIN:释放一个连接。

OdpFMt

IP 协议

OSI 7层协议

OSI全称是“开放式系统互联通信参考模型”(Open System Interconnection Reference Model)。

OSI 分层说明
应用层面向具体的应用传输数据
表现层把数据转换为合适、可理解的语法和语义
会话层维护网络中的连接状态,即保持会话和同步
传输层相当于 TCP/IP 里的传输层
网络层相当于 TCP/IP 里的网际层
数据链路层它基本相当于 TCP/IP 的链接层
物理层网络的物理形式,例如电缆、光纤、网卡、集线器等等

一些概念

CDN

CDN的全称是内容分发网络(Content Delivery Network)。

DNS

URI 和 URL 的区别

DX8yTh

Http 组成

请求

PpgMNl

请求数据包括

PnyudN

响应

Body 体

一些问题

在浏览器输入一个 url 请求,背后的执行过程

  1. 浏览器查找本地域名缓存,将域名解析为 IP 地址,如果找不到则去操作系统缓存查找,再找不到就去本地 hosts 文件中查找,如果还是找不到就去 DNS 服务器查找,总之是要找到这个域名对应的 IP 地址。
  2. 将 http 请求封装成请求包,包括头信息和 body 体。
  3. 将 http 请求包封装成 TCP 包。
  4. 将 TCP 包封装成 IP 包。
  5. 到达数据链路层则需要将数据包传输到目标机器上,这时候需要找到目标机器在哪里。根据本机IP与子网掩码做 and 操作,同目标 IP 与子网掩码做 and 操作的结果做比较,如果一致,则说明是在同一子网内部,那么说明可以通过广播将数据包传输出去了;如果不一致,则需要将数据包丢给网关转发出去。
Last update:
Contributors: qiqiang