作为一名准前端开发工程师,必须要对http基础知识有一定的了解,可是想学习HTTP相关的知识,发现国内只有两本相关的图书,《HTTP权威指南》和《图解http》,所有的书但凡带上权威指南,必将是圣经级别的图书,我在学校图书馆借了一本,600多页的砖头书,由于基础太过薄弱,根本读不下去,于是转向了《图解HTTP》,是本书很薄,只有二百多页,很适合我这样的小白。推荐基础比较薄弱的朋友先从《图解HTTP》看起!废话不多说,准备起飞!
     几乎每一位前端工程师在面试的时候都会被问道这样一个问题,在浏览器地址栏输入URL到显示出整个页面,经历了什么?这个问题并没有一个统一的答案,最简单的形容:  
  1.利用dns进行域名解析,解析成计算机能够识别的ip地址 。
  2.进行tcp的三次握手 。
  3.建立起tcp连接后,进行http请求 。
  4.服务器端相应http请求,浏览器得到html页面 。
  5.浏览器解析html页面,发起html页面内的资源请求 。
  6.渲染得到的html页面,呈献给用户。
     如果觉得理解不了,可以先跳过,等看完全篇文章再回看这个问题,就容易理解很多。
     首先要了解两个概念,客户端和服务器,客户端通俗理解就是用户(比如你手机上的浏览器),请求资源的一方,而服务器端就是存储网站信息的主机(比如百度公司的服务器),提供资源相应的一方。而http就是客户端和服务器之间进行交流的一个协议。计算机和网络设备之间进行通信,就必须使用双方都能够理解的信息进行交流,这种为了使双方顺利进行信息的通讯而制定的规范就是协议! 要想学习http,则还要简单了解一下tcp/ip协议,tcp/ip协议是许多协议组成的集合的总称,包括TCP, IP, HTTP, DNS,FTP,UDP,PPPoE,ICMP,SNMP,FDDI等协议,http是tcp/ip协议的一个子集,是tcp/ip协议族的一部分!由于tcp/ip协议族中有很多不同的协议,而这些协议所应用的领域又有很大的不同,所以,对不同领域的协议进行划分就显得很重要了,tcp/ip协议族将这些协议划分为4层,分别是:应用层,传输层,网络层,数据链路层。不同的层次分工也各有不同。
     应用层:应用层决定了向用户提供应用服务时通信的活动,包含的协议包括HTTP, DNS(Domain Name System,域名系统),FTP(File Transfer Protocol,文件传输协议)。
     传输层:传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。包括TCP(Transmission Control Protocol, 传输控制协议)和UDP( User Data Protocol, 用户数据报协议)。
     网络层(又称:网络互联层):网络层用来处理 在网络上流动的数据包。数据包是网络传输的最小数据单位,该层规定了通过怎样的传输路线到达对方计算机,并把数据包传给对方,当与对方计算机之间通过多台计算机或者网络设备进行传输时,网络层的作用就是在多条路中间选择一条传输路线。网络层最主要的就是IP协议(Internet Protocol)。
     数据链路层: 用来处理连接网络的硬件部分,包括控制操作系统,硬件的设备驱动,网卡,光纤等肉眼可见的部分,硬件范畴都属于数据链路层。
     
  配图(tcp/ip分层结构图)
     在利用tcp/ip协议族通讯的时候,会按分层的顺序走,客户端从上往下,接收端从下往上,以此完成一次通讯!通俗点理解就是,在京东购物下单,发送用户的请求(应用层,http发送请求),仓库打包物品(传输层,tcp将大数据分割成报文段,准确可靠的把信息传递),快递装车,途径各个中转中心,发往全国各地(网络层,ip协议,通过目标地址,选择线路),快递小哥派送物品(数据链路层)。
     知道这些显然还不够,与http有关的协议主要有TCP,IP,DNS。
     DNS属于应用层,有时候输入域名(给人看的)或者一串数字(给计算机看的)组成的ip地址都能够访问同一个网站,这是因为域名是方便记忆,但是计算机看不懂,计算机只能看懂ip地址,所以DNS就是为了将域名和ip地址进行转换而生的。输入网址后,第一件事就是利用DNS将域名转换为ip地址。
     TCP协议属于传输层,将http的大块请求数据进行分解,拆成报文段( segment)为单位的数据包进行管理,这样可以方便传输。tcp有强迫症,将信息告诉他人后,他还不放心,需要再次确认才能够放心,所以tcp传递是靠谱,准确的传递,整个过程就像:
          小A:我给你说点事,XXXXXXXXXXXXXXXX,你可别给他人说!收到请回复!(第一次握手)(发送SYN数据包)
          小B:好的,收到了。(第二次握手)(回复SYN/ACK数据包)
          小A:嗯,我就是确认一下!(第三次握手)(发送ACK数据包)
     这就是大名鼎鼎的三次握手,如果中间莫名中断,tcp协议会再次以相同的顺序发送相同的数据包。保证了通信的可靠性。
     IP协议属于网络层,主要负责数据传输,把数据包传递给对方,要想传递给对方,则需要知道对方的IP地址或MAC地址,IP地址指明了节点被分配到的地址,而MAC地址是指网卡所属的固定地址,IP地址能够和MAC地址进行配对,IP地址能够更换,而MAC地址是固定不变的!IP间的通讯依赖MAC地址,但是,通信双方在一个局域网内的情况是很少的,所以说大部分的通信都是需要中间的设备进行中转的,根据下一个中转设备的MAC地址才能够搜索下一个中转目标。采用ARP协议(Address Resolution Protocol),解析通信方的ip地址,反查出MAC地址。
  未完,待续!

HTTP学习(一)初识HTTP的更多相关文章

  1. SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏

    SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!!   基础知识目前不够,有感性 ...

  2. DotNetty网络通信框架学习之初识Netty

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  3. 学习笔记:java并发编程学习之初识Concurrent

    一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...

  4. C++学习 之 初识头文件

    声明:            本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...

  5. C++学习 之 初识命名空间

    声明:            本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...

  6. C++学习 之 初识变量和基本类型 之 内置类型

    声明:            本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...

  7. C++学习 之 初识C++

    声明:            本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...

  8. TensorFlow学习(1)-初识

    初识TensorFlow 一.术语潜知 深度学习:深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法. 深度学 ...

  9. Java学习-002-Java初识

    此文主要讲述什么是 Java,以及 Java 常识性知识,方便亲们进一步了解 Java 语言相关的常识. 一.Java 概述 Java 语言是美国 Sun Microsystems 公司于 1995 ...

  10. Backbone.js学习之初识hello-world

    说了好久好久要学习Backbone.js,现在终于下定决心开始学习了.然后呢,就根据我的学习进度在这里做个简单的记录,方便新人,也方便我自己以后回忆. 准备 用bower下载这几个库或框架也是醉了.. ...

随机推荐

  1. Memcached源码分析之从SET命令开始说起

    作者:Calix 如果直接把memcached的源码从main函数开始说,恐怕会有点头大,所以这里以一句经典的“SET”命令简单地开个头,算是回忆一下memcached的作用,后面的结构篇中关于命令解 ...

  2. PHPCMS快速建站系列之自定义分页函数

    内容分页的实现方法:{pc:content action="lists" catid="$catid" order="id DESC" nu ...

  3. php包管理工具最基本的一些问题

    windows下的 1.先安装windows下的set-up程序 点击一步步的, cmd进入,输入composer能成功显示一幅图说明安装成功 2.在下载,https://getcomposer.or ...

  4. Struts2标签遍历List<Map<String,String>>

    <s:if test="resultList != null && resultList.size() > 0"> <s:iterator  ...

  5. React Native 之 HelloWorld

    1. 切换目录 输入之前要切换到要保存的目录 2. 修改下载源 cd ~/ vim .npmrc 添加 registry = https://registry.npm.taobao.org 3. 在终 ...

  6. Quartz2D 之 绘制文本

    1. 基础概念 1.1. 字体(Font) 同一大小.同一样式的字形的集合. 1.2. 字符(Character) 字符表示信息本身,一般指某种编码,如Unicode编码. 1.3. 字形(Glyph ...

  7. [c#]解决方案:需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。

    问题详情 如下图所示(部分): 出现该错误,是因为应用程序中需要使用到jquery(现在的web应用程序哪个能离开jquery呢),而目前程序目录中并没有jquery文件,或者有jquery文件但是程 ...

  8. 让表格table呈现边框,不用给tr、td加边框的写法

    <table width="100%" cellspacing="1" cellpadding="1" bgcolor="# ...

  9. thinkphp 3.2 模型的使用示例

    原来以为thinkPHP的 model 就和PHPCMS一样  就起到一个连接数据库的作用,今天看了视频,才发现这个也是 mvc中的m 使用方法可以使用 D() 方法 下面是 UserControll ...

  10. Eclipse中应用的调试

    作为编程人员,程序的调试是一项基本功.在不使用IDE的时候,程序的调试多数是通过日志或者输入语句(System.out.println)的方式.可以把程序运行的轨迹或者程序运行过程中的状态显示给用户, ...