先要将http协议首先要来了解一下网络七层协议,也就是OSI参考模型,一种用于计算机网络通信的标准体系。该模型将网络通信划分为七个层次,下面简单来聊聊七个层次结构。
- 物理层(Physical Layer):这是最底层的层次,主要负责传输比特流。在这一层,物理特性如电压、电流、频率等被转化成数字信号,以便于数据的传输。
- 数据链路层(Data Link Layer):这一层主要负责将原始数据(比特流)转换成帧结构,并对这些数据进行差错校验和流控制等处理,以确保传输的可靠性,同时也需要对数据的流控制和帧同步。
- 网络层(Network Layer):这一层主要负责网络的寻址与路由,它通过建立逻辑连接来实现不同计算机之间的通信,同时也提供了一些辅助服务,如拥塞控制、包重组等。
- 传输层(Transport Layer):这一层主要负责进程之间的通信,它通过建立端到端的连接来确保数据传输的完整性和可靠性。同时还提供了一些流量控制和错误恢复机制。
- 会话层(Session Layer):这一层主要负责建立和维护计算机之间的通信会话,它提供了一些辅助服务,如会话管理、同步和故障恢复等。
- 表示层(Presentation Layer):这一层主要负责数据格式转换和加密解密等事务,以使应用程序在不同平台上的数据格式能够互相理解和交换。
- 应用层(Application Layer):这是最高层的层次,它为用户应用程序提供网络服务,前端页面的喧嚷主要就是在这个层面。如电子邮件、网页浏览等。
以及tcp/ip四层协议:
- 应用层(Application Layer):应用层协议是各种不同应用程序之间通信的协议,例如Web浏览器使用HTTP协议,电子邮件使用SMTP协议等。
- 传输层(Transport Layer):传输层协议负责在网络上可靠地传输数据,其中最常用的两个协议是TCP和UDP。
- 网络层(Internet Layer):网络层协议负责在多个网络之间传输数据,并提供一种寻址机制,其中最常用的协议是IP协议。
- 数据链路层(Data Link Layer):数据链路层协议定义了如何在主机之间传输数据,它将网络层的数据转换为适合物理层传输的格式。其中最常用的协议是以太网协议。
其中将数据链路层分为物理层和数据链路层,那就是五层模型,在一些资料中是存在五层模型的。 以上对一些新来的同学可能看着有点乱,我们可以用简单的例子来解释一: 想象成邮寄一封信的过程,那么"应用层"就相当于写信的人,"表示层"则负责格式化信件内容,"会话层"则处理收发双方之间的通信会话,"传输层"则保证信件能被准确无误地递送,"网络层"则决定信件如何寄到目标地点,"数据链路层"则负责对信件进行拆分和重组,"物理层"则是实实在在的信件传输媒介,类似于邮递员和快递车等物理设备。
每个层次都有这自己的作用,并可以各个层次之前相互作用,让网络通信更加高效和稳定。
http协议
聊完上面的七层协议后我们来聊聊http协议,http协议是一个应用层协议,主要发生在osi模型中的应用层,http是超文本传输协议的缩写,目前最广泛的是HTPP/1.1版本,它定义了如何从web服务器传输超文本标记语言也就是html到本地进行浏览的协议。 首先我们可以来了解一下如果我们在浏览器输入一个url,这中间会发生些什么
-
当浏览器输入一个url后,浏览器会对url进行解析,获取到url中的协议,主机,端口,路径,查询参数和哈希值等等信息。具体可以分析为以下步骤:
1. 解析协议 浏览器会首先解析 URL 中的协议部分,例如 http、https、ftp 等。 2. 解析主机和端口 对于 HTTP 和 HTTPS 协议,URL 中一般会包含主机名和端口号。浏览器在解析 URL 时,会先查找该字符串中是否包含主机名和端口号,如果有,则提取出来;如果没有,则使用默认值(如 HTTP 协议默认端口为80,HTTPS 协议默认端口为443)。 3. 解析路径 URL 中的路径部分表示主机上请求资源的具体位置。浏览器在解析 URL 时,会将路径部分提取出来,并去除其中的转义符(如 %20、%2F 等)。 4. 解析查询参数 URL 中的查询参数用于向服务器传递额外的信息和参数,它们以 ? 开头,各参数之间使用 & 分隔。浏览器在解析 URL 时,会将查询参数部分提取出来,并将各参数进行解码和拆分,方便后续使用。 5. 解析哈希 URL 中的哈希部分用于指定该页面内的特定位置,浏览器在解析 URL 时,会将哈希部分提取出来,并将其保存在内存中。 -
之后浏览器会对url进行转换,将url转化为ip地址才能和服务器建立连接,dns是一种将域名转化为ip地址的系统,因此浏览器可以通过dns来获取到服务器的ip地。首先浏览器会检查本地缓存中是否存在该域名的ip地址,如果存在就使用缓存的ip地址进行访问,否则向本地的dns缓存服务器发送dns查询请求,询问域名对应的ip地址。 如果本机的 DNS 缓存服务器没有缓存该域名对应的 IP 地址,则它会将请求转发给其他 DNS 域名服务器进行处理,直到找到包含该域名对应 IP 地址的 DNS 服务器为止。当 DNS 缓存服务器找到该域名对应的 IP 地址后,会将该 IP 地址返回给浏览器,并在本地缓存中保存一份该域名对应的 IP 地址,以便今后更快地响应 DNS 查询请求,浏览器在得到对应的ip地址后,就会和服务器建立tcp连接,接下来就是http熟悉的三次握手环节。
-
客户端要想通过tcp协议和服务器建立连接,需要通过tcp的三次握手环节,以下是三次握手的过程:
1. 第一次握手:客户端向服务器发送一个 SYN 报文段,并指定初始序列号(seq=x)。 1. 第二次握手:服务器接收到 SYN 报文段后,会以自己的 SYN 报文段作为应答,并且也要指定自己的初始序列号(seq=y),同时会对客户端的 SYN 报文段进行确认(ack=x+1);这个确认报文段ACK的编号是“期望收到客户端下一个数据包的序号”。 1. 第三次握手:客户端接收到服务器的 SYN/ACK 报文段后,会向服务器发送一个确认 ACK 报文段,并把服务器发来的 SYN 报文段进行确认(ack=y+1)。此时,客户端和服务器都已经完成了三次握手,建立了可靠的连接。
以下还有一些细节:
1. TCP 连接建立时,客户端和服务器要交换各自的 ISN(初始序列号),以便双方可以识别出数据包的顺序。
1. 当服务器收到客户端的 SYN 报文段时,它不仅会响应一个 SYN-ACK 报文段,还会为该连接分配一些内存和其他资源,以便后续的数据传输。
1. 客户端在第一次握手时发送的 SYN 报文段中并没有携带应用数据,而是在第三次握手时通过 ACK 报文段来携带应用数据。
1. 如果服务器一段时间内没有接收到客户端的 ACK 报文段,则会发送一个 RST 报文段,关闭连接。这种情况通常出现在客户端主动关闭了连接,但服务端由于某些原因未能及时收到 ACK 报文段。
4. 但这个时并不会直接向服务器获取资源,而是先在本地的浏览器上获取缓存资源,如果浏览器本地有缓存资源就可以直接在浏览器缓存中提取,不会向服务器获取,提高性能利用效率,这就是我们常说的强缓存。强缓存在浏览器获取到资源缓存的header信息后,会根据两个字段(cache-control和expires)来判断进行一个缓存是否过期的,如果不过期直接获取缓存信息,并缓存header信息,如果过期则会像服务器请求数据,此时状态码为200.
-
Expires是http1.0的规范,他的值为一个绝对时间的GMT格式的时间字符串。只要在该时间内,该本地缓存就有效果,但由于有时服务端和客户端会存在时间偏差,此时会因此导致缓存混乱,因此在http1.1出现了Cache-Control,他的优先级比Expires更高。
-
Cache-Control是http1.1中出现的,主要根据max-age字段来判断是否过期,它是一个相对的时间,来代表资源的有效期是多久,除此之外,Cache-Control还存在其他字段:
1. no-cache:表示缓存只能返回已经验证过的资源,否则必须向服务器请求获取最新数据。 2. no-store:表示不缓存任何响应结果,每次访问都要去服务器端获取。 3. public:表示响应可以被客户端和代理服务器缓存。 4. private:表示响应只能被客户端缓存,代理服务器不能缓存。 5. must-revalidate:表示客户端缓存过期后,必须向服务器验证缓存的有效性。 6. max-age:表示缓存内容的有效时间,在该时间内缓存内容有效,过期后需要重新从服务器获取。 7. s-maxage:类似于max-age,但是只对共享缓存生效,对私有缓存无效。 8. proxy-revalidate:类似于must-revalidate,但是只对缓存服务器生效,对客户端缓存无效。
-
如果没有强缓存资源过期,我们就会携带第一次请求返回的有关缓存的header字段信息,也就是它主要依靠的两种方式:Last-Modified和ETag
1. Last-Modified是HTTP协议中的一个响应头字段,它表示服务器端资源的最后修改时间。当客户端第一次请求该资源时,服务器会返回该资源的Last-Modified值。客户端在下次请求该资源时,会携带If-Modified-Since请求头字段,该字段的值为上次请求返回的Last-Modified值。服务器收到该请求后,检查资源的修改时间是否比该值更新。如果资源没有被修改,则服务器返回状态码304 Not Modified,客户端直接使用本地缓存;如果资源已被修改,则返回新的资源内容和新的Last-Modified值。 2. ETag也是HTTP协议中的一个响应头字段,它表示服务器端资源的唯一标识符。当客户端第一次请求该资源时,服务器会返回该资源的ETag值。客户端在下次请求该资源时,会携带If-None-Match请求头字段,该字段的值为上次请求返回的ETag值。服务器收到该请求后,检查资源的Etag是否和该值相同。如果相同,则返回状态码304 Not Modified,客户端使用本地缓存;如果不同,则返回新的资源内容和新的ETag值。