网络

1.1 分组传递(分包)

浏览器会基于http协议产生一个http报文(消息),然后会把这个报文拆分成不同的分组(包)
发送到路由上。路由先进行缓存,然后在根据路由表转发给下一个路由,直到到达服务器。

1.1.1 我们为什么不直接把消息发送给服务器,为什么一定要分包呢?

首先,路由是先缓存再转发,如果把整个报文直接发给服务器,那么对路由内存要求会非常高。
另外还有一个重要的概念就是网络的带宽,也是在链路上的传输速率,它是由单位时间内可以传输的数据总量决定的。而不是我们物理距离,

1.2传输延时

排队延时:比如当第1个到包达时A时,如果它前面已经有一些其他客户端的包到达,那么它就许多排队等待。排队所用的时间就是排队延时。

结点处理延迟:排队到了以后,结点A会对包进行一些处理,这个处理时间叫结点处理延迟,通常是毫秒级的影响非常小。

传播延迟: A出发后,从A到B在链路上传播还要经过一定物理距离,但传输的速度非常快,通常是0.7倍的光速,所用的时间叫传播延迟。

丢包: 如果很多客户端同时向A结点发送数据包,A的缓存满了以后,对接下来的数据包,会丢弃。而这正是丢包的主要原因。

2.1网络体系结构

osi 模型

分层:我们根据不同的功能把网络模型分层。

协议:不同层之间规定了不同协议,每个层遵循每个层的网络协议完成完成功能。

接口:层与层之间会通过接口去进行交互。

所以这也符合我们函数的模块化,低层函数定义好接口API,你按照函数的接口文档去调用依赖的函数,然后就等着让它去处理。在实际的开发中,我们就是这么去实现的
[图片上传失败...(image-71b6e6-1530587407491)]

应用层

浏览器根据http协议,产生报文头和主体
对并报文进行编码,加密,压缩。
将数据封装好后,交给下一层,我们将这一层的PUD叫 报文(message)

传输层

在浏览器端会将报文分组,在服务器端会将报文重组。
在每个分组的头,会加上自己协议信息。
这些协议信息主要功能是SAP寻址,连接控制,流量控制,差错控制
将数据封装好后,交给下一层,我们将这一层的PUD叫 段(segment)

网络层:

网络层在拿个每个段后,会根据IP协议,加上自己协议信息
这些协议信息主要功能是:逻辑寻址(IP地址)路由转发。
将数据封装好后,交给下一层,我们将这一层的PUD叫 数据报(datagram)

链路层

网络层在拿个每个段后,会根据IP协议,加上自己协议信息
这些协议信息主要功能是:物理寻址(MAC地址),流量控制,差错控制,接入控制。
将数据封装好后,交给下一层,我们将这一层的PUD叫 帧(frame)

物理层:

物理层在拿个帧后,会把它转化成 比特(bit),就是位,二进制编码(一堆100111)
然后将这些二进制,根据自己物理特性去表示,比如电信号啥的。
然后就把它交给物理介质去传输啦

MAC协议 (链路层 =>物理层)

在链路层上,主机和路由器用他们的物理地址来标志,即48位的物理地址,也是是我们通常所说的网卡地址(MAC地址)
总结:
信道划分MAC协议:时间、频带、码片划分 
      TDMA、 FDMA、 CDMA
随机访问MAC协议: 
  1. ALOHA, S-ALOHA, CSMA, CSMA/CD
  2.CSMA/CD应用于以太网
  3.CSMA/CA应用802.11无线局域网
轮转访问MAC协议: 
  1.主结点轮询;令牌传递
  2.蓝牙、 FDDI、令牌环网
详情:https://blog.csdn.net/qq_20233867/article/details/78451799

ARP协议 (网络层=>链路层)

在网络层上,主机和路由器用逻辑地址来标志,逻辑地址在本地是唯一的,但在全局上不一定。在TCP/IP协议族中称为IP地址,现在常用的版本是IPv4,长度是32位。

因此需要能够将逻辑地址和相应的物理地址之间进行映射,完成这样的映射可以使用静态映射和动态映射。

静态映射:创建一个表,存储逻辑地址和物理地址之间的关联关系。然后将网络上的每个主机都存储这张表。缺点是映射表必须周期的更新,增加了 网络的开销。

动态地址映射,地址解析协议ARP和逆地址解析协议RARP。

地址解析协议ARP(Address Resolution Protocol),负责完成逻辑地址向物理地址的动态映射,将32位逻辑地址(IP地址)转换为48位的物理地址(MAC地址)。
![image](http://upload-images.jianshu.io/upload_images/8848475-1cb3e7420bed0f50.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


具体过程:
1) 本地主机在局域网中广播ARP请求,ARP请求数据帧中包含目的主机的IP地址。意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址”。

2) 目的主机的ARP层解析这份广播报文,识别出是询问其硬件地址。于是发送ARP应答包,里面包含IP地址及其对应的硬件地址。

3) 本地主机收到ARP应答后,知道了目的地址的硬件地址,之后的数据报就可以传送了。

点对点链路不使用ARP协议。

APR请求包是广播的,但是ARP应答帧是单播的。
        ARP请求  :0x0001
        ARP应答  :0x0002
        RARP请求:0x0003
        RARP应答:0x0004
详情:https://blog.csdn.net/woshifennu1234/article/details/78256395

应用层协议

基于TCP:HTTP(超文本传输协议),FTP(文件传输协议),SMTP(邮件传输协议)
基于UDP:DNS(域名系统)和最近兴起的QUIC(谷歌制定低时延的互联网传输层协议)

传输层协议

常见的传输层协议有TCP,UDP。

URL:统一资源定位

语法为:
 协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
 http://username:password@host:80/directory/file.html? query#ref
 ftp://username:password@host:21/directory/file.html
 news://news.newsgroup.com.hk
注意:
如果参数里边有!,%,&,/,?,=,等非西欧字符 需要encode 方法对url的进行预处理
     decode解码成普通字符串
     encode普通字符串编码,编码后的名字非常长叫(application/x-www-form-urlencoded MIME 字符串)

HTTP协议

1.HTTP是超文本传输协议,从www浏览器传输到本地浏览器的 一种传输协议,
HTTP协议是由从客户机到服务器的请求(Request)和从服务器 到客户机的响应(response)进行约束和规范。

2.http报文

HTTP报文:用于HTTP协议交互的信息被称为HTTP报文。
     1.请求(Request)端的报文叫请求报文
     2.响应(response)端的报文叫响应报文

3.http 规则

   1. 报文首部和报文主体中间要有空行(CR+LF:回车+换行)
   2. 报文首部:处理请求和响应提供的信息(上文中设 
   3. 置的各种信息)
报文主体:所需要的资源都在(比如返回的文本信息就是Hello world)
eg:
     let responseDataTpl = `HTTP/1.1 200 OK
     Connection:keep-alive
     Date: ${new Date()}
     Content-Length: 12
     Content-Type: text/plain

     Hello world!
     `;
报文首部:根据实际用途会分为四种
   1.通用首部字段(General):请求报文和响应报文都会使用的字段
   2.请求首部字段(Requse Header):请求报文使用的首部
   3.响应首部字段(Response Header):响应报文使用的首部
   4.实体首部字段(Entity Header):与实体有关信息的字段

所以在chrome的network中,header会显示为:

General
Response Headers
Requse Headers
实体首部字段会写进请求头和响应头
对于get请求后边的参数会显示在Query String Parameters
  1. http 状态码
-  1XX :  信息性状态码(接收请求正在处理)
-  2XX :  成功状态码(请求正常处理完毕)
-  3XX :  重定向状态码(需要进行附加操作以完成请求)
-  4XX :  客户端错误状态码(服务器无法处理请求)
-  5XX :  服务端错误状态码(服务器处理请求出错)
所以状态码就是前后端通信时对于状态的一种约定,原则上只要遵循状态码类别的定义,即使改变RFC2616定义的状态码,或自行创建都是没问题的。

常用状态码:
- 200 OK :请求被正常处理返回 200 OK,这也是我们最常见的啦
- 204 No Content :请求处理成功但是没有资源返回,就是报文中没有报文主体
- 206 Partial Content :客户端进行范围请求,就是请求资源一部分,服务器返回请求这部分(Content-Range)

- 301 Moved Permanently:永久重定向(资源的URL已经更新)
- 302 Found :临时重定向(资源的URI已经临时定位到其他位置了)
- 303 See Other: 对应的资源存在另一URL,资源的URL已经更新,是否按新的去访问
- 304 Not Modified:客户端发附带条件的请求,服务端允许请求访问资源,但没有满足条件
- 307 Temporary Redirect: 也是临时重定向

- 400 Bad Request : 请求报文中存在语法错误
- 401 Unauthorized : 需要有HTTP认证
- 403 Forbidden : 请求访问的资源被服务器拒绝了
- 404 Not Found : 服务器上没有找到资源
- 500 Internal Server Error: 服务器执行请求时出错
- 503 Service Unavailable : 服务器处于超负载,正在进行停机维护

  1. http 压缩协议
1. http请求头带:Accept-Encoding: gzip, deflate, br
这是浏览器告诉服务器我支持什么样的压缩格式,优先级是什么样的。
2. http响应头带:Content-Encoding: gzip
这是服务器告诉浏览器我已经按什么样子的格式压缩了,解压工作你拜托你了

所以在浏览器上我们就需要根据请求头中的Accept-Encoding去判断,浏览器支持什么压缩啊。然后压缩之后再告诉浏览器,我已经给你压缩成什么样子啦。
  1. http 缓存协议
强缓存:
Catche Contrl: :是通用首部字段,就是之前将的发送报文和响应报文都会使用的。可以对文件里引用资源的缓存进行设置
eg:
   浏览器发访问http://localhost:10080/
  -       '请求报文没带 Cache-Control' 客户端说我要访问首页
  
  服务器返回数据
  -       '响应报文带:Cache-Control : max-age = 604800'  服务器说给你index.html和加载里面资源,并告诉你这些资源一周之内不要不必确认了
  
  浏览器刷新的网页再次访问http://localhost:10080/时
  -        里面的资源就不会再发送请求了,直接从缓存中拿  你会在chrome,network中看到Time是0(from memory catch)

  服务器返回数据
  -       服务器只返回index.html文件


  这时候你强制刷新浏览器(command+shift+R) 
  -       '请求报文带 Catche Contrl:no-cache '客户端说我不要缓存过的数据,我要源服务器的数据
  
 服务器返回数据
  -       服务器返回index.html文件和依赖的资源
这就是强缓存,所谓强是在条件内,你网页依赖的资源都不会发送http请求了。可以直接从网页里面拿。
协商缓存:(两种)
第一种. If-Modified-Since/Last-Modified
服务器会下发一个Last-Modified最后修改时间。然后浏览器会记住这个时间。当浏览器第二次请求时会带上if-modified-since的时间。服务器可以去比较这份文件在if-modified-since的时间后是否修改过。如果没有修改过,那就返回304.
  1. Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
  2. If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If- -Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified- Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说 明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包 体,节省浏览),告知浏览器继续使用所保存的cache。

第二种:Etag/ If-None-Match
服务器Etag会下发一个字符串,然后浏览器在第二次请求时会在if-none-match中带上这个字符串。这时候服务器可以比较两个字符串,如果相同,就让浏览器去缓存中去取。
 1.  Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)
 2.  If-None-Match:当资源过期时(使用Cache-Control标识的max- age),发现资源具有Etage声明,则再次向web服务器请求时带 上头If-None-Match (Etag的值)。web服务器收到请求后发现 有头If-None-Match 则与被请求资源的相应校验串进行比对,决 定返回200或304。

7.HTTP 浏览器缓存机制

![微信图片_20180703151902.png](https://upload-images.jianshu.io/upload_images/8848475-c670dec515435724.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
所以可以看出,强缓存优先于协商缓存。
  1. http 方法
GET:获取资源
POST:传输实体主体
PUT:传输文件
HEAD:获取报文首部
DELETE:删除文件
OPTIONS:查询支持方法
TRACK:追踪路径
CONNECT:要求用隧道协议连接代理
  1. GET 与 POST区别
浏览器:
      GET是请求数据,使用URL或Cookie传参。POST是传输实体主体所以会把参数放到报文体中
      GET数据放到URL中,浏览器对URL大小有限制,所以数据大小进行限制。POST是传输实体主体,所以大小没有限制
      GET数据放到URL中,所以安全性肯定不高啊,所以不能用来传递敏感信息。POST相对安全
      GET是请求数据所以URL地址可以后退,而POST发送数据不会(chrome中post就会后退)。
      GET是请求所以会被浏览器主动cache,而POST是发送数据,所以不会除非手动设置。

服务器:
      get是把参数放到URL中去处理
      而post是触发了服务器中监听的请求事件,服务器可能会做出处理,影响返回结果

总结:
“GET和POST最大的区别主要是GET请求是幂等性的,POST请求不是。幂等性是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一URL的多个请求应该返回同样的结果。

请求数据的时候用get,传输实体主体的时候用post。

浏览器与协议

1.XHR 与 AJAX

 AJAX全称是Asynchronous JavaScript and XML(异步js和XML)。异步js,我们比较容易理解。那么什么是XHR呢。

 XHR全称是XMLHttpRequest,就是XML的http的请求。其实这是一个浏览器层面的API。通俗点讲就是浏览器给你封装好了的http功能函数。

2.浏览器安全与跨域

XHR的会有很多限制,其中对我们影响很大的就是不允许发送不同协议,地址和端口号的请求。
那么我们常见的解决方案有三种:
     1.jsonp :是把请求伪装成标签去请求。因为标签是浏览器自己发送请求,所以不受同源策略影响啊
     2.代理服务器:这个也很好理解,我把所有请求都发送到不跨域的代理服务器上,服务器上可是我们说的算,只要经过处理把数据返回给浏览器就好。
     3.CORS:这是我们今天主要讲。因为解铃还须系铃人,既然是你限制的,那么你总得给我一个解决办法吧。浏览器给出的解决办法就是(CORS)

cors的办法也很简单:
      1.如果浏览器发现你已经跨域了它会发送一个带原IP的请求头Origin: http://localhost:8088
      2.问服务器,你让不让localhost:8088访问你的文件啊,如果浏览器同意就回复一个Access-Control-Allow-Origin: http://localhost:8088 。表示,这个IP可以访问的
      3.然后服务器在发起正式请求
      4.如果服务器没有給浏览器返回Access-Control-Allow-Origin或不允许这个地址访问,那么浏览器就报跨域请求错误
当然,为了安全起见CORS的请求都会忽略掉cookie 和 HTTP认证等用户凭证。如果你想用,同样在请求头带Origin时在发送一些参数。服务器也是在第一次返回时告诉浏览器同意还是不同意。

http发展

1.HTTP1.0 到http1.1

HTTP1.0的时候,每次发送一个http请求就要建立一次TCP连接,然后再断开
http1.1的时候,引入了Connection:keep-alive的机制,连接后不断开可以继续发送请求
但每次请求都是第一个回来,第二个再出发。后来浏览器又引入了 pipelining的管道化连接。
在一个TCP连接内,多个HTTP请求可以并行,下一个HTTP请求在上一个HTTP请求的应答完成之前就发起
这个不需要你去设置,引入了Connection:keep-alive,浏览器自动会这么处理。但这又有一个问题,由于HTTP1.1服务端返回响应数据的顺序必须跟客户端请求时的顺序一致,这样也就是要求先进先出。所以很容易造成队首阻塞。就是你第一个请求不返回,后面都得在那等着。

2.HTTPS

HTTPS是针对HTTP安全性不足,做的改进,我们先看看HTTP安全性都有哪些不足
     通信就是明文
     没有验证通信方身份
     无法证明报文完整性
所以 HTTS = HTTP + 加密 + 认证 + 完整性保护 **
加密解密:
比如我有一份数据要给你,我只需要把它加密了,你在解密这样不就安全了。
所以我有一个私钥用来加密,给别人解密的是公钥
但是这个时候,我们又不能保证别人拿到的公钥就是我的公钥。万一数据没有变,但是公钥被劫持,解密出来的内容就也不是我想发给对方的啦
所以我把公钥交给第三方CA认证一下,第三方把公钥变成了证书
这样浏览器再拿到我发给它的证书的时候,他去和第三方CA问一下,这是不是他的证书啊。
第三方说是,这样我们就安全了。
同样浏览器也会以同样的私钥和证书的方式对传给服务器的数据进行加密解密。在第三方认证的时候,我们会详细登记自己的信息。这样我们彼此也就完成了身份认证。
最后,这个加密算法还用摘要功能来保证数据的完整性

总结:
HTTPS协议只是HTTP通信接口部分用SSL协议代替而已。而刚才我们讲的这个过程就是SSL协议的内容。它是由网景公司发明,后来转交给IETF,IETF在SSL基础上制定的TLS

3.HTTP2.0

(1)多路复用,并不在遵循先进先出。
那么现在有一个问题,http2中,既然没有先进先出,那么重要的文件加载的慢,那不就尴尬啦。
(2)http2定义了请求优先级
我们可以让一些重要的请求优先加载。浏览器也智能的根据http2定义出的优先级规则去显示页面。
(3)头部压缩
我们知道我们在用Gzip方式给报文体进行压缩。http2给报文头也进行了压缩。你可别小看了报文头,一般网页的报文头能占到报文的40%。 而压缩后能减少60%左右。
(4)性能上新增了二进制分帧层。也得到了大大的提升。分针层对应的就是http报文。所以http/1.1是一个文本协议,而 http2 是一个彻彻底底的二进制协议。

你可能感兴趣的:(网络)