程序员过关斩将--面试官再问你Http请求过程,怼回去!


菜菜哥,X总在产品部瞎指挥,做为程序媛的我都快撑不住了nginx

不光你撑不住了,你们都要撑不住了,外行人指导内行人,呵呵web

前天我偷偷的去面试了,结果挂了面试

出去转转实际上是好事,面试官问你什么了?浏览器

他让我描述一个Http请求的过程,我没回答上来,给我讲讲呗缓存

靠近点,我给你补一补这块知识服务器

Http介绍网络

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为普遍的一种网络协议。全部的WWW文件都必须遵照这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种经过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。


以上并不是这次文章重点,更详细的http介绍请移步 www.baidu.com架构

Http是一种网络协议,并且是无状态的超文本协议,基于Tcp/Ip协议的应用层协议。app


我要IPless

        当用户请求某个域名的资源,好比在浏览器敲入http://www.qq.com的时候,浏览器首先会根据输入的域名去查询IP地址。去哪查呢?这里就须要引入DNS的概念,能够把DNS看作是域名映射IP的帐簿。

        当客户端发送一个DNS请求的时候,首先本地的DNS服务器会接收到请求,会在本地先查询缓存中有没有当前域名和IP的映射关系,若是有则直接返回IP信息,若是没有,则会询问其余DNS服务器,这里简单说一下网络上DNS服务器的结构,DNS服务器在网络上是树状结构的,存在一个根服务器,根服务器的子节点是一级域名服务器(好比 .com, .cn),一级域名服务器的子节点又称为权威(权限)DNS服务器


        当本地DNS服务器没有相关查询信息的时候会依照以上树的顺序查询域名和IP的对应关系,查到以后会缓存到本地DNS,这个过程最终的结果就是获取到相关域名对应的IP地址,若是客户端输入的是IP地址信息,则省略了以上查询IP的过程了。


访问互联网的任何网站本质上都是依据IP来寻址的。


创建Tcp链接

        当一个http请求发出以后,而且获取到了正确的服务器IP地址,这个时候就能够创建链接了。有一点须要明确:http协议是基于Tcp协议的。因此第一步就须要创建Tcp链接,这个过程就是不少网络文章所说的三次握手:

Client:Hi,我是 Client。 

Server:您好 Client,我是 Server。 

Client:您好 Server...


这里是三次握手能够以这样的顺序来表示:client的问->server的答->client的答


        有的面试官无聊会问为何是三次握手而不是两次或者四次五次呢?你能够理解,当两我的A和B要想互相联系的时候,最简单的方式就是A提问而后能收到B的回答,B提问能收到A的回答。这也是三次握手的核心。


平时所说的Tcp是面向链接的,这里的链接实际上是双方约定必定格式来进行通讯的过程(包括发包的顺序,buffer的大小等约定),在逻辑上好像是维持了一条链接而已。


我要出网关

        一旦Tcp链接创建起来,http请求就能够组织数据发送报文了。目前http协议的版本大部分是1.1,在这个版本中有一个属性 Keep-Alive,这个属性标示要保持此http链接创建的TCP链接,默认是开启的。

        网络上有文章大篇幅描述http的长链接信息,实际上是错误的说法,长链接是针对tcp链接,http链接打开keepalive选项只不过保持了tcp链接不断开而已。

        HTTP 的报文大概分为三大部分。第一部分是请求行,第二部分是请求头(header),第三部分是请求体(body)。这里具体的http协议其余概念再也不展开讨论,由于内容有点多。http协议位于应用层,因此要发送的报文首先会把http协议相关的内容包含在包中,而后传给下一层。


        下一层是传输层,这一层主要有两个协议:Tcp和Udp,http协议选择的是tcp协议,tcp会有两个端口信息,一个是源端口,一个是目标端口,好比http请求通常目标端口是80。传输层把端口信息封装完毕,接着把请求包传给网络层。


网络层的协议是IP协议,在这一层会把源Ip地址和目标IP地址封装进去(目标IP就是请求的网站ip,查询dns得到)。

        操做系统知道了要发往的IP地址,会判断这个ip是否在本地局域网内(根据子网掩码来判断),若是不在的话,则须要网关把这个请求发送出去(网关的ip通常是DHCP协议配置的)。操做系统怎么获取网关在哪呢?这个过程基本上靠的是广播,应用的协议是ARP协议,当局域网内的全部设备接收到ARP协议的内容以后会判断ip是否和网关ip相同,若是相同就会回复,通过这个过程,系统找到了网关,获取到了网关的MAC地址,并把网关的MAc地址和本机的MAc地址封装进请求包,发给下一层MAC层,最后网卡把消息发往网关。


MAC地址主要用在同一个局域网内定位某个计算机,是在局域网内才有效的地址


到达目标服务器

    请求包到达网关,网关会根据消息的MAC地址来判断是否和本身的mac相同,若是相同则把消息接收下来。接着会判断消息中目标IP,若是目标IP未在本身的局域网中,则须要根据本身的路由规则把消息发送给下一个相连的网关。网关和网关之间是通讯的,至于网关怎么计算出最优路径这里再也不展开。咱们以常见的家庭路由器为例,每一个路由器的网关IP实际上是运营商给分配的,而且网络包发送出去通常都是采用修改IP的方式(NAT)。具体步骤:

1

网关检查目标IP是否在本身的局域网内,若是不在,则获取要传送的下一个网关mac和IP,把目标IP和mac修改成下一个网关的IP和mac,并把来源IP和mac修改成当前网关的IP(外网IP)和mac。

2

下一个网关收到消息,首先检查mac是否和本身匹配,若是匹配接会检查目标IP是否在本身的局域网内,若是不在则重复以上步骤

3

重复以上步骤直到目标服务器所在的网关。

4

目标服务器所在的网关收到消息,会判断出来当前的目标IP在个人局域网范围,就不会在跳跃下一个网关,而是向局域网内发ARP请求寻找目标服务器,目标服务器收到请求会响应,网关会把具体的请求发送给目标服务器。

5

目标服务器收到消息会解析请求的消息,在对比完mac和IP信息以后,会获得端口的信息,目标服务器则在本机寻找监听这个端口的程序,http服务器颇有多是nginx或者其余web服务器。

6

请求经过端口传送给具体的处理的程序,程序会解析http请求的内容,根据内容做出相应的回复。

7

请求按照以上全部步骤把响应返回给请求方(网关路由器会记住来源路径),至此一个http请求结束

网关(路由器)之间经过路由表来决定下一个跳跃的网关地址


写在最后

以上只是http请求的一个大概过程,其实每一步都很是复杂,没有详细展开。好比:路由协议、ip的分配 等等。


互联网之路,菜菜与君一同成长

长按识别二维码关注

相关文章
相关标签/搜索