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

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

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

出去转转其实是好事,面试官问你什么了?

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

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

Http介绍

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

以上并非此次文章重点,更详细的http介绍请移步 www.baidu.com

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

我要IP

当用户请求某个域名的资源,比如在浏览器敲入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的分配 等等。

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

长按识别二维码关注

程序员过关斩将--面试官再问你Http请求过程,怼回去!的更多相关文章

  1. 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!

    最近看了 @JavaGuide 发布的一篇『面试官问我如何保证Kafka不丢失消息?我哭了!』,这篇文章承接这个主题,来聊聊如何保证 RocketMQ 不丢失消息. 0x00. 消息的发送流程 一条消 ...

  2. 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看

    前言 HashMap 源码和底层原理在现在面试中是必问的.因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合.文章较长,介绍了很多原理性的问题,希望对你有所帮助~ ...

  3. 面试官再问Redis分布式锁如何续期?这篇文章甩 他一脸

    一.真实案例 二.Redis分布式锁的正确姿势 据肥朝了解,很多同学在用分布式锁时,都是直接百度搜索找一个Redis分布式锁工具类就直接用了.关键是该工具类中还充斥着很多System.out.prin ...

  4. 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)

    本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公司你选,两厢便利. 毕 ...

  5. 面试挂了阿里却拿到网易offer,一个三年Java程序员的面试总结!

    前言 15年毕业到现在有三年多了,最近去面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去了网易. ...

  6. 程序员如何面试才能拿到offer

    一.概述 面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:“面试官为什么会 ...

  7. (转)Java程序员的面试经历和题库

    背景:最近我在找工作,前期就像打了鸡血的一样,隔一段时间没有面试,就又松懈了下来,看到别人写的面经,感觉就像打脸一般,以后要多多总结前人的经验,时刻保持压力状态才是. 作者:nuaazhaofeng2 ...

  8. 【程序员联盟】官网上线啦!coderunity.com

    内容简介 欢天喜地,[程序员联盟]官网上线咯(此处应该有鸡蛋丢过来...) [程序员联盟]官网 大家也许会问:“这几天小编都没出文章,跑哪里happy去啦?是不是偷懒去了?” 小编:“臣妾冤枉啊.” ...

  9. 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!

    写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...

随机推荐

  1. Shell脚本学习 - 基本内容以及数据格式

    为了捞取日志,自己用python写了一些东西,大致套路就是读取写入文件的操作,放到linux上跑.实际使用时发现要操作的文件有时比较大,直接打开文件找需要的东西可能会有一些效率问题.所以学习一下she ...

  2. Linux top命令的用法详细详解

    首先介绍top中一些字段的含义: VIRT:virtual memory usage 虚拟内存1.进程“需要的”虚拟内存大小,包括进程使用的库.代码.数据等2.假如进程申请100m的内存,但实际只使用 ...

  3. Python的使用方法

    1 安装turtle Python2安装命令: pip install turtule Python3安装命令: pip3 install turtle 因为turtle库主要是在Python2中使用 ...

  4. Vue知识点总结

    1.属性名已$开头的都是内部提供的属性 2.为什么使用事件修饰符的原因:methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节 3.v-if 如果值为false,元素在页面中不存在:值为t ...

  5. 旧项目Makefile 迁移CMake的一种方法:include Makefile

    有些c++旧项目用Makefile,要迁移CMake的时候非常痛苦,有些像static pattern的语法和make自带命令 cmake要重写一套非常的麻烦. 因此这里用trick的方法实现了一种i ...

  6. 关于如何在Visual Studio上仿真调试安卓的U3D应用

    正巧最近需要开发一个安卓手机上的Unity3D游戏功能,想着既然要开发么,当然需要调试.本来的话一些基础功能是不需要使用仿真模拟器,直接在U3D的开发编辑器上就能调试,不过有一些安卓上才能执行,比如 ...

  7. mongodb的几种运算符

    ①比较运算符: 等于:默认是等于判断,没有运算符 小于:$lt(less than) 小于等于:$lte(less than equal) 大于:$gt(greater than) 大于等于:$gte ...

  8. FCC(ES6写法) Make a Person

    用下面给定的方法构造一个对象. 方法有 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(l ...

  9. DCOS实践分享(2):基于Docker Compose和Swarm的Docker化之路

    2016 年1 月 23 日,北京史上气温最低的一天. 在下午 1 点半的时候,由 DaoCloud 赞助的 2016 年度首次 Docker Meetup 准时开始. 在这次Meetup中,我分享了 ...

  10. 干货分享: 长达250页的Libvirt Qemu KVM的ppt,不实验无真相

    下载地址:Libvirt Qemu KVM 教程大全 http://files.cnblogs.com/popsuper1982/LibvirtQemuKVM.pptx 1. 概论 1.1 虚拟化的基 ...