0%

浏览器如何发起一个完整的HTTP请求(1)

浏览器如何发起一个完整的 HTTP 请求?

答:==应用层==的发送 http 请求,==DNS==将域名解析成 IP,然后到==传输层==通过==三次握手==建立==TCP/IP 请求==,再到==网络层==的 ip 寻址,再到==数据链路层==的封装成帧,最后到==物理层==的利用物理介质传输。

五层因特网协议栈

1
2
3
4
5
6
7
8
9
1.应用层(dns,http) DNS解析成IP并发送http请求

2.传输层(tcp,udp) 建立tcp连接(三次握手)

3.网络层(IP,ARP) IP寻址

4.数据链路层(PPP) 封装成帧

5.物理层(利用物理介质传输比特流) 物理传输(然后传输的时候通过双绞线,电磁波等各种介质)

HTTP

超文本传输协议,Web 浏览器和 Web 服务器之间的通信,一般基于 TCP/IP 协议

DNS

Domain Name System,即域名系统。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 端口 53[1]。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。

可以理解为一个工具将域名和 IP 关联了起来,通过让快速访问到 IP,域名查询到 IP。
比较牛逼的网站可能会用 CDN 来进行均衡用户访问负载量。

CDN

Content Delivery Network,即内容分发网络。网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN 的关键技术主要有内容存储和分发技术。
通俗的讲就是在人多的地方放置更多的服务器,当访问量激增,CDN 可以通过全局负载技术将流量平均分配到不同的服务器中,保证流量均很,减少网络拥堵。一般域名查询时会用到 CDN,保证用户访问域名是能获得最快的访问速度

什么是 TCP/IP 协议?

TCP(传输控制协议)和 IP(网际协议)。

通俗的讲,我们所接触的绝大多数 HTTP 请求都是 TCP/IP 请求。
tcp 将 http 长报文划分为短报文,通过三次握手与服务端建立连接,进行可靠传输以及断开连接的四次握手。

什么是三次握手、四次握手?

  • 三次握手
1
2
3
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

通俗的讲

1
2
3
1.客户端告诉服务端,请求建交
2.服务端告诉客户端,我已经收到请求信息,请确认是否为正确的服务端?
3.客户端确认,正式建交
  • 四次握手
1
2
3
4
第一次握手:TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
第二次握手:服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
第三次握手:服务器关闭客户端的连接,发送一个FIN给客户端。
第四次握手:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

通俗的讲

1
2
3
4
1.客户端告诉服务器,我要开始和你断交了
2.服务端收到这个断交信息
3.服务器断开连接,并且告诉客户端,服务端断交。
4.客户端获取服务器断交信息,数据通道关闭。

浏览器对于同一域名的 tcp/ip 并发是有数量限制的,一般是 2~10 个不等,就是 POST/GET 请求在同一域名下请求并发量是有限制的!

GET 和 POST 的区别

POST 会发送 2 个 TCP 的包,首先发起预请求,会向服务端发送 headers,如果的到 100 continue,则会发送 data 包,返回数据
GET 只会发送一个 TCP 的包,直接向服务端发送 header 和 data,返回数据。

后台处理流程

1
2
3
4
5
1.一般有的后端是有统一的验证的,如安全拦截,跨域验证
2.如果这一步不符合规则,就直接返回了相应的http报文(如拒绝请求等)
3.然后当验证通过后,才会进入实际的后台代码,此时是程序接收到请求,然后执行(譬如查询数据库,大量计算等等)
4.等程序执行完毕后,就会返回一个http响应包(一般这一步也会经过多层封装)
5.然后就是将这个包从后端发送到前端,完成交互

http 的报文接口

报文接口包含:通用头部,请求/响应头部,请求/响应体

通用头部

1
2
3
4
Request Url:请求的web服务器地址
Request Method:请求方式(POST/GET/OPTIONS/PUT/DELETED等)
Status Code:状态码(10X/404/200)
Remote Address: 请求远程的web服务器地址(IP)

值得注意的是,在存在跨域问题的时候,可能是 method 为 options,状态码为 404/405 等

在这里主要归纳下状态码:

1
2
3
4
5
1XX——指示信息,表示请求已接收,继续处理
2XX——成功,表示请求已被成功接收、理解、接受
3XX——重定向,要完成请求必须进行更进一步的操作
4XX——客户端错误,请求有语法错误或请求无法实现
5XX——服务器端错误,服务器未能实现合法的请求

也就是 4XX 可能是客户端的问题,不单单是服务器端的问题,个人觉得应该优先排除客户端的容器问题(tomcat、iis 等)