HTTP 恳求,是客户端和服务器之间进行数据传输的方式之一,是客户端向服务器发送恳求音讯,用于恳求特定的资源或履行特定操作。今天,咱们来揭秘一下 HTTP 恳求的进程。
当咱们想要建议一个 HTTP GET 恳求时,需求指定好恳求的 URL(/pins) 和恳求参数。体系收到咱们的 HTTP 恳求时,要先进行 HTTP 解析。
HTTP 解析
HTTP 解析首要是体系将用户恳求或呼应的音讯进行解析和处理,如解析 URL,生成恳求报文或呼应报文等。
URL 的结构比较简单,首要由数据运用协议、服务器名称和数据源途径三个部分组成,如下图所示:
以 /pins 为例:
- 开头的 “https” 表明咱们向服务器恳求数据运用的协议,这儿运用的 https 协议来向服务器恳求数据。“//” 后跟着的字符串表明服务器的域名,如 。
- /pins 是数据源的途径名,表明资源位于服务器的相对“根目录”的方位。这儿的“根目录”并不是咱们了解的体系根目录:“/”。一般情况下,咱们会在为 Web 服务器里装备“根目录”,这个“根目录”可以是体系下的 var/www/html/ 相似这样的目录。
- 若咱们在恳求的时分不指定数据源的途径,一般默许会去获取默许的资源文件,如 index.html 或许 default.html。
解析 URL 后,咱们就可以承认恳求的服务器和恳求的资源,依据这些信息可以生成 HTTP 恳求报文,格局如下图所示:
- 办法,HTTP 恳求可以运用 9 种办法,这些办法首要是用来约束客户端和服务器之间进行数据传递的行为和操作,其间 GET 和 POST 是咱们最常用的办法:
- GET:从服务器获取资源;
- POST:向服务器提交数据,常用于提交表单数据、上传文件等操作;
- PUT:将数据发送到服务器,常用于创建或替代资源;
- DELETE:从服务器删除指定的资源;
- PATCH:用于对资源进行部分更新,只更新恳求中指定的字段或属性;
- HEAD:与 GET 办法相似,但只获取呼应头信息,不回来呼应体,常用于查看资源是否存在或获取资源的元数据;
- OPTIONS:获取服务器支撑的恳求办法列表、服务器装备信息等;
- TRACE:用于回显服务器收到的恳求,用于测试或确诊;
- CONNECT:将恳求衔接转化为透明的 TCP/IP 通道,一般用于进行加密地道的树立,例如 HTTPS 。
- 版别,用来表明客户端和服务器之间的传输数据的协议,HTTP 目前有 4 个版别,分别是 HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3
- 首部字段名和字段值,用来传递关于恳求或呼应的附加信息,以键值对的形式出现,供给关于恳求和呼应的元数据和相关数据,首要分为通用首部字段、恳求首部字段和呼应首部字段。
除了 HTTP 恳求报文外,还有 HTTP 呼应报文,是由服务端发送给客户端的音讯,如下图所示:
- 状况码,服务器呼应客户端的恳求时回来的三位数子代码,用于表明恳求的处理结果,首要有 5 大类;
- 短语,短语和状况码是相关的,用于供给更详细的描述和说明。
组装好 HTTP 恳求报文后,应用层会将数据下传给传输层,在这期间需求获取服务器域名的实在地址——DNS实在地址查询。
DNS——实在地址查询
DNS(Domain Name System)是互联网中用于将域名转化为对应 IP 地址的分布式命名体系。它充当了一个相似电话簿的角色,将易记的域名映射到计算机可以了解的 IP 地址。
DNS运用分层、分布式的架构,由许多相互衔接的DNS服务器组成。以 为例,越往右层级越高。DNS 的层级结构相似于树状结构,如下图所示:
- 根域 DNS 服务器是最尖端的服务器,它首要是办理尖端域名的解析,首要效果是供给对尖端域名服务器的递归查询和指引,任何 DNS 服务器都存储了依据 DNS 服务器的地址。
- 除了图中所述的 DNS 服务器外,还有本地 DNS 服务器,位于用户本地网络中的 DNS 服务器,为用户设备(如计算机、手机、路由器等)供给域名到 IP 地址的转化功用。
DNS 域名解析的作业流程如下,以 为例:
- 将域名先发送给本地 DNS 服务器(也就是 TCP/IP 中设置的 DNS 服务器地址),询问该域名的 IP 地址;
- 本地域名 DNS 服务器收到客户端恳求后,若自己缓存该域名的 IP 地址,则直接回来,若没有则去查询根域名 DNS 服务器,根域名 DNS 服务器不做域名解析,而是告知下一层级的 DNS 服务器地址,这儿会告知 .cn 尖端 DNS 服务器地址;
- 本地 DNS 服务器收到尖端 DNS 服务器地址后,建议恳求查询域名对应的 IP 地址;
- 尖端 DNS 服务器收到恳求后,供给了 区域的威望 DNS 服务器地址;
- 本地 DNS 收到后向威望 DNS 服务器地址后,建议恳求;
- 威望 DNS 服务器查询后将对应的 IP 地址告知本地 DNS 服务器;
- 本地 DNS 服务器再将 IP 地址回来客户端,让客户端持续接下来的流程。
通过 DNS 拿到服务器域名对应的 IP 后,由于 HTTP 是根据 TCP 传输的,接下去就由 TCP 协议进行封装传输。
TCP——牢靠传输
TCP 协议全称是传输操控协议,是一个牢靠、按需和面向衔接的传输协议。TCP 具有很多优异的特性,如超时重传、流量操控和拥塞操控等。TCP 表面上仅仅担任承受应用层的委托进行收发数据,实践上由网络层进行实践的网络包收发操作。
TCP 协议也有自己的格局,如下图所示:
-
源端口和意图端口,用于标识不同的应用程序和服务,端口号是一个 16 位的数字,从 0 ~ 65535,0 ~ 1023 是已经被用于一些标准服务了;
-
序号,32 位的无符号整数,用于保证数据的牢靠传输和报文段的排序;
-
承认号,32 位的无符号整数,用于标识接纳方期望从发送方接纳的下一个字节的序号。接纳方收到数据后,会将承认号字段设置为已成功接纳的最终一个字节的序号加 1,通过承认号可以实现牢靠的数据传输和流量操控;
-
状况位:用于指定数据段的不同状况和履行特定的操作,有 6 个标志位
- URG:表明紧急指针字段的值是否有用,当为 1 时,数据是紧急数据,需求被优先处理;
- ACK:表明承认号的字段是否有用,当为 1 时,表明承认号字段有用;
- PSH:表明接纳方应该立即将数据推送给应用层,而不是等候缓冲区填满再推送;
- RST:表明重置衔接,当 RST 位被设置为 1 时,表明衔接犯错或被强制中断,需求终止衔接
- SYN:表明树立衔接恳求,当为 1 时,表明发送方恳求树立衔接,并制定初始化序号;
- FIN:表明发送方已完成数据发送,恳求封闭衔接。
-
窗口巨细:16 位无符号整数,指的是接纳方的缓冲区巨细,用于操控发送方发送速率,实现流量操控。
TCP 会将 HTTP 的报文作为数据体。在实践传输进程中,网络层 IP 协议对数据包的传输巨细有约束,因而,TCP 也会对数据体的巨细做约束,若 HTTP 报文过大,会对其进行分段,如下图所示:
一般情况下,网络层规则数据包的巨细不能超过 MTU,MTU 一般是 1500 个字节。而 MSS 一般是 MTU 去除 IP 和 TCP 首部之后,一个网络包能包容的 TCP 数据的最大长度,如下图所示:
TCP 在传输数据前,需求同服务器进行三次握手后,才干树立衔接,如下图所所示:
- 一开始,客户端和服务端都处于 CLOSE 状况,服务端会自动监听某个端口,处于 LISTEN 状况;
- 客户端自动建议 SYN,树立衔接,之后处于 SYN-SEND 状况;
- 服务端收到客户端的 SYN,也回来 SYN,而且对客户端的 SYN 进行 ACK,之后处于 SYN-RCVD 状况
- 客户端收到服务端发送的 SYN 和 ACK 之后,发送对 SYN 承认的 ACK,之后处于 ESTABLISHED;
- 服务端收到 ACK 的 ACK 之后,也处于 ESTABLISHED;
- 通过三次握手,保证客户端和服务端都有发送和接纳的才干。
当客户端和服务端树立衔接后,TCP 将 HTTP 报文作为数据部分,加上首部便封装成 TCP 数据段,然后就向下交给给网络层的 IP 协议处理。
IP——长途定位
IP 协议是网络层中用于数据传输的协议,传输层 TCP 协议在履行衔接、收发、断开等操作,实践上都是委托 IP 协议去履行的。
IP 协议有自己的协议格局,如下图所示:
-
版别:IP 协议的版别,目前首要有 IPv4 和 IPv6;
-
协议:用于指示封装在 IP 数据包中的上层协议,占 8 位,0~255,常用的协议有
- ICMP(1):用于在IP网络中传递过错音讯和操作操控音讯。
- IGMP(2):用于在IP网络中进行多播组成员办理。
- TCP(6):供给牢靠的、面向衔接的数据传输服务。
- UDP(17):供给无衔接的、不牢靠的数据传输服务。
- IPv6(41):用于封装IPv6数据报。
- OSPF(89):用于在路由器之间动态承认最佳途径的内部网关协议。
- SCTP(132):供给面向音讯的牢靠传输服务。
-
原地址 IP 和方针地址 IP:用于指示数据报的意图地和源头
- 原地址 IP 即客户端输出的 IP 地址
- 方针地址即通过 DNS 域名解析得到的 Web 服务器 IP
IP 协议将上层的 TCP 数据段作为数据体,加上 IP 首部,封装成一个数据包。想要将数据包传输给意图 IP 地址,这需求运用上 IP 协议的寻址才干。
在 IPv4 协议中,IP 地址共 32 位,由网络号和主机号组成。其间,网络号用于表明该 IP 地址归于哪一个子网,主机号用于表明 IP 地址归于该子网下的哪一个主机。
举个例子,比如咱们需求对 IP 地址为 10.100.122.2/24 的主机发送一份数据,24 对应的子网掩码为 255.255.255.0。
第一步咱们需求找到 IP 地址对应的子网,将 10.100.122.2 和 255.255.255.0 进行 AND 运算,得出子网号为 10.100.122.0,如下图所示:
第二步,子网掩码取反后为 0.0.0.255,将 10.100.122.2 和 0.0.0.255 进行 AND 运算,得出主机号为 0.0.0.2。因而,咱们便能将数据数据给 10.100.122.0 子网下的 0.0.0.2 主机。
除了寻址功用,网络层还需求 IP 协议供给路由选择的才干。路由器需求通过选择找到方针地址的子网,进而将数据包转发到对应的网路中。
网络层将数据包封装好后,会接着向下传输给网络衔接层,让网络衔接层给数据包写上 MAC 地址,以便在物理链路中传输。
MAC——两点传输
MAC(Media Access Control)地址是网络设备(如网卡)在物理层上的唯一标识符。它是一个由48位二进制数(一般以十六进制表明)组成的地址,用于在局域网中唯一标识每个网络接口。
MAC 的首部格局如下图所示:
- MAC 头部包含发送方的 MAC 地址和接纳方方针 MAC 地址,用于两点之间的传输
- MAC 包头的协议类型一般只运用 IP 协议(0000)和 ARP 协议(0806)
一般在设备出厂的时分,发送方网卡的 MAC 地址是出产的时分就写到 ROM 中。而接纳方的 MAC 地址则需求通过 ARP 协议,通过播送的方式在子网中查找方针 IP 地址对应的 MAC 地址。
在网络衔接层中,数据包写上 MAC 地址后,接下来通过网卡向外出口数据包。
网卡——出口
通过前面的封装,咱们的数据包此刻仅仅一堆数字信息,需求将其转化为电信号才干在物理链路上进行网络传输。网卡会担任将数字信号转化为电信号。
网卡驱动获取到数据包后,会将其复制到网卡内的缓存区,接着会在其开头加上报头和起始帧分界符,在结尾加上用于检测过错的帧校验序列,如下图所示:
- 起始帧分界符是一个用来表明包起始方位的标识
- 结尾的 FCS 用来查看包传输进程中是否有损坏
网卡将数据转化为电信号后往外交给,需求通过交流机或路由器才干传输到服务器。
交流机——局域网内通讯
交流机(Switch)是计算机网络中的网络设备,用于在局域网(LAN)中衔接多个设备并转发数据包。它在数据衔接层作业,被称为二层网络设备(只要链路层和物理层)。
交流机的首要效果有:
- 数据包转发;
- 播送和组播处理;
- 网络隔离和分割;
- 带宽办理。
交流机收到网卡发送过来的电信号,会进行如下操作:
- 电信号抵达交流机接口,交流机将电信号转为数字信号;
- 通过帧尾部的 FCS 校验过错,若没有过错则放到缓存区(这个进程和网卡相同);
- 计算机的网卡接纳到包的时分需求查看下接纳方 MAC 地址是不是自己,假如不是则丢掉;交流机的端口不核对接纳方 MAC 地址,全都放到缓冲区;
- 接着需求查询下这个包接纳方的 MAC 地址是否已经在自己的地址表中,地址表首要包含两个信息:设备的 MAC 地址和对应的端口。
假如找不到指定的 MAC 地址后,一般是该地址的设备没有向交流机发送过数据帧或这个设备有一段时间没作业导致地址被删除。交流时机进行以下处理:
- 交流时机将数据帧转发到除源端口之外的一切端口,只要相应的接纳者才接纳包,其他设备会忽略包
- 若有方针设备做出呼应,交流时机将它的地址写入到 MAC 表中进行缓存
- 接纳方的 MAC 地址是一个播送地址(FF:FF:FF:FF:FF:FF/255.255.255.255),交流时机将包发送到除端口之外的一切端口
路由器——跨网络通讯
在网络传输中,路由器是要害的设备,它在实现局域网内通讯的同时也担任衔接到互联网。
路由器和交流机的都具有转发下一个路由器或方针设备的功用。但路由器是根据 IP 设计的,称为三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;而交流机是根据以太网设计的,俗称二层网络设备,交流机的端口不具有 MAC 地址。
路由器的基本原理:
- 路由器具有 MAC 地址,可以成为以太网的发送方和接纳方,同时也具有 IP 地址,基本上和网卡一样;
- 路由器会接纳发给自己的以太网包,然后路由表查询转发方针,再由相应端口作为发送方将以太包发出去。
路由器的接纳数据包的进程:
- 电信号抵达路由器后,路由器中的模块会将电信号转化为数字信号,通过包结尾的 FCS 进行过错校验;
- 查看 MAC 头部的接纳方 MAC 地址,假如是发送给自己的就放到缓冲区中,不然就丢掉这个包。
通过路由器和交流机,服务端可以接纳到客户端发送的数据包,并逐层开始解开数据包。
服务端和客户端解数据
数据包抵达服务器后,服务器会先解开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址契合,契合就将包收起来。
接着持续解开数据包的 IP 头,发现 IP 地址契合,依据 IP 头中协议项,知道自己上层是 TCP 协议。解开 TCP 的头,里面有序列号,需求看一看这个序列包是不是服务器想要的,假如是就放入缓存中然后回来一个 ACK,假如不是就丢掉。TCP 头部里面还有端口号, HTTP 的服务器正在监听这个端口号。
所以,服务器就知道是 HTTP 进程想要这个包,所以就将包发给 HTTP 进程。
服务器的 HTTP 进程看到,知道恳求是要拜访一个页面,就把这个网页封装在 HTTP 呼应报文里。HTTP 呼应报文也需求穿上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,意图地址是客户端 IP 地址。
数据包封装好后,从网卡出去,交由交流机转发到出城的路由器,路由器就把呼应数据包发到了下一个路由器,通过若干个路由器后。最终跳到了客户端的路由器,路由器解开 IP 头部发现是发送给自己的,所以又把包发给了交流机,再由交流机转发到客户端。
客户端收到了服务器的呼应数据包后,进行解包,便拿到服务端回来的数据。
最终,客户端和服务器建议了 TCP 四次挥手,至此双方的衔接就断开了。
总结
总而言之,当客户端建议一个 HTTP 恳求时,数据包会被 TCP/IP 协议从上到下逐层处理和封装后,才会被送到网卡缓存中,随后由交流机和路由器向外通讯。
当服务端接纳到客户端的数据包时,会从下而上的解封装和处理,最终交给到应用层中。