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的分配 等等。


添加关注,查看更精美版本,收获更多精彩

转载于:https://juejin.im/post/5d079264f265da1b6a34958d

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

  1. post大小限制_作为一个程序员,面试中常问的get和post的区别,你真的知道吗

    作为一个程序员无论是搞前端的还是搞后端的,只要问起来GET和POST的区别,都能说出来个一二三四来. 你可能自己写过无数个GET和POST请求,或者也看过很多权威网站总结出来的区别,你非常清楚的知道什 ...

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

    0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁 ...

  3. 面试十五年经验程序员,面试官沦为听众

    本文转载自 程序员八卦 面试时总会发生各种各样的尴尬事和奇葩事,今天又有一个略显尴尬的面试故事要给大家分享. 一个面试官发帖爆料:今天面试了一个工作十五年的程序员,过程无比尴尬. 面试刚开始,这位应聘 ...

  4. qt 如何 指针 自动 释放内存_要是面试官再问你智能指针的问题,就拿这篇文章“盘他”!!!...

    前一段时间,有不少朋友问我关于智能指针的问题,并且反映经常会在面试中被面试官问到,所以今天小豆君就来讲讲我对智能指针的理解,希望能对大家有所帮助 既然讲智能指针,我们就先来看看它为什么会出现. 1 传 ...

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

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

  6. 查询已有链表的hashmap_面试官再问你 HashMap 底层原理,就把这篇文章甩给他看...

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

  7. “不会Linux,怎么当程序员?”面试官:等着被淘汰吧!

    说起优秀程序员的必备技能,我想大家都可以说很多,比如:数据结构.算法.数学.编程语言等等. 但是,你可能会忽略了每一个程序员都应该掌握的技能:Linux. 想一想,我们日常学习.求职.工作场景的中,你 ...

  8. 面试官再问高并发,求你把这篇发给他!

    高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时.CPU load升高.GC频繁.死锁.大数据量存储等等,这些问题能推动我们在技术深度上不断 ...

  9. 程序员被面试官要求:清唱一首歌!

    虽然是年底了,但也挡不住很多人已经开始跳槽面试了,也可能是找了挺久的工作,毕竟现在都挺艰难的. 说到面试,想必大家都经历过一些很奇葩的问题和面试官,就像上回和大家分享的,一个老程序员本来被拒了,结果拿 ...

最新文章

  1. 02JavaScript中的变量
  2. .NET架构与模式探索
  3. 微软一站式示例代码库 2012 年2月示例代码更新。8个全新示例为您的开发保驾护航...
  4. word2vec原理_深入理解Word2Vec底层原理
  5. php 几秒后返回,php计算两个时间差并返回差多少天、时、分、秒
  6. python安卓自动化原理_appium---appium自动化原理
  7. python随机数列_Python2随机数列生成器简单实例
  8. 一位 90 后程序员的自述:如何从年薪 3W 到 30W
  9. 2010年下半年信息系统监理师下午题的答题参考五
  10. 玩转代码|简单分析如何获取小程序的t值
  11. Linux/Unix如何将日志发送到日志服务器
  12. echarts:legend调整
  13. js 中国时间转换美国太平洋标准时间
  14. PHP接入谷歌验证器(Google Authenticator)
  15. element ui 上一页下一页_vue翻页器,包括上一页,下一页,跳转
  16. Java:进化的尽头 by Bruce Eckel 以及Thinking in Java 5th edition 《On Java 8》
  17. 欧拉回路,欧拉路径,欧拉图详解
  18. 被动信息收集(一)nslookup.dig.DNS字典爆破.whois
  19. matlab图像边缘宽度调整
  20. Meta Post v3.3.1(带有ANSYS和METApsot的LS-DYNA的前后处理器)

热门文章

  1. python类型转换异常_python知识:json格式文本;异常处理;字符串处理;unicode类型和str类型转换...
  2. logit方程怎么写_一元四次方程的常规解法
  3. android触摸事件分发,Android 事件分发机制
  4. java中的string函数_java中string.trim()函数的作用实例及源码
  5. linux 挂载硬盘_Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令...
  6. bae 3.0 mysql_bae3.0 mysql 有时报错?报错-问答-阿里云开发者社区-阿里云
  7. mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键
  8. python中collections_Python中的collections模块
  9. git 合并代码_git的几种实用操作(合并代码与暂存复原代码)
  10. android 拖动数字选择,拖放android 3.x导致illegalStateException之后的小数字拖动