# 用户态层-Http

# 目录

[toc]

# 请你说说 GET 和 POST 的区别

得分点

用法不一样、参数显隐式、参数长度。

标准回答

get主要用来获取数据,而post是提交或修改数据。

get有长度限制(2048字节)而post没有。

get的参数是显式的,而post是隐式的。

加分回答

  • 在Restful风格的API中,get主要用来获取数据,post主要用来提交数据。
  • get的参数有长度限制,最长2048字节,而post没有限制。
  • get的参数会附加在url之 ,以 " ? "分割url和传输数据,多个参数用 "&"连接,而post会把参数放在http请求体中。
  • get是明文传输,可以直接通过url看到参数信息,post是放在请求体中,除非用工具才能看到。 -
  • get请求会保存在浏览器历史记录中,也可以保存在web服务器日志中。
  • get在浏览器回退时是无害的,而post会再次提交请求。 【想一下,你按下那个回退按钮,是不是有询问是否要重新提交表单】
  • get请求会被浏览器主动缓存,而post不会,除非手动设置。
  • get请求只能进行url编码,而post支持多种编码方式。
  • get请求的参数数据类型只接受ASCII字符,而post没有限制。

# 键入网址后,其间发生了什么?

# 1.解析URL

首先浏览器做的第一步工作就是要对 URL 进行解析,从而生成发送给 Web 服务器的请求信息

# 2.浏览器查找域名的 IP 地址

1、请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。

2、如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务器 。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

3、查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

4、根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。这种过程是迭代的过程。

5、本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。

6、最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

# 3.浏览器向 web 服务器发送一个 HTTP 请求

拿到域名对应的IP地址之后,浏览器会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器。

  • 在发送之前,还有一项工作需要完成,那就是查询服务器域名对应的 IP 地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址(DNS查询)
  • 通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈
  • 应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责 收发数据的 TCP 和 UDP 协议,它们两会接受应用层的委托执行收发数据的操作
  • 协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的 网络包,而将网络包发送给对方的操作就是由 IP 负责的。

TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通 信对象。

  • 生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部