前端网络知识

网络基础知识

局域网

  1. 两个计算机通过网线便可互相访问对方的数据
  2. 在一个计算机上开两个网口,三台计算机便可互相访问对方的数据

这样的方式一致沿用至今(局域网)
随着互联的计算机越来越多,这种方法显然不可取,所有就想出来了中转, 这样多台计算机便可相互访问(这个中转就是路由器(家用);—这样一来,数据的传输就需要协议(类似于邮局寄信)

局域网:见图(网络应用)

  1. 现在的计算机(各种电子设备,平板,手机,小爱音箱啥的)都是冯诺依曼计算机(计算机之父)
  • 运算器 :CPU GPU(精确运算,浮点数)-显卡
  • 存储器:
    内存(断点数据清空,读写速度快)
    硬盘(辅存):(数据可以持久化,数据读写相对较慢)
  • 控制器
    主板上的一些器件
  • 输入设备
    键盘 鼠标 麦克风 网口
  • 输出设备
    显示器,耳机 网口

(计算机科学之父)—图灵

IP地址与公用网络

局域网之间的连接—也通过一个路由器(工业的 - 比如一个小区的路由器)

  1. IP地址

  2. IP地址的格式:四个段xxx.xxx.xxx.xxx 每个段都由0-255(8bit)

IPV4地址为32位:前面n位为网络号,后面32-n位为主机号
IPV6地址为128位
子网掩码:前面IP中网络号(前面24bit) 后面8bit为主机号

  1. IP地址的分类
    一个IP地址分为两个部分:网络ID,主机ID

只研究前三类

一个网络中能容纳的主机数:A类 > B类 > C类
A类:0.0.0.0 ~ 127.255.255.255(一个网络能有1600+万台)
B类:128.0.0.0 ~ 191.255.255.255(172.16.0.0 ~ 172.31.255.255 -私有网络)
C类:192.0.0.0 ~ 223.255.255.255(192.168.xxx.xxx -私有网络)
家用的一般都是C类IP地址
D类:(多播地址)
E类:

同一网络内IP地址不能冲突,但是不同的网络内IP地址可以重复

如果你想搭建一个服务器,让别人能够访问到,就必须有一个公网IP(可能不止一个)
我们自己之间能够相互访问,是因为互相形成了一个局域网
我们能访问到百度,是因为百度有一个公网IP(可能不止一个)
我们之所以能给其他路由器之下的朋友发微信,是因为我们的数据先传到了自己的路由器,然后再传到三大营业商的路由器,再转到腾讯微信的公网,然后腾讯的公网会查看你发送的地址,然后你朋友就可以收到你发的信息(前提是你朋友微信已登录,这样才能发送)

云穿透

域名与DNS解析过程

www.baidu.com ->域名
问:能通过域名访问到机器吗?
答:不能
网络只识别一个东西叫做IP地址

  • 用域名和IP形成了对应关系,给IP起名

首先,计算机是不知道域名对应的IP的.
然后计算机会问路由器(每个路由器都有一个域名Ip的映射表)
如果路由器认识这个域名,就返回一个IP,然后计算机访问这个IP
如果计算机不认识,他就问上一层路由器,
如果问到了城市级别的路由器,如果还没有问到,就问这个路由器的DNS服务器。
如果DNS服务器不认识这个域名,继续向上级DNS服务器查找.

往上推总会找到-因为最终有一台总的服务器(但一般到达不了这里)

互联网刚建立的时候,13台总的DNS服务器(有一台就可以找到-中国就有一台)

访问过的域名就会自动缓存(不会继续耗时查找)

面试问题:当向浏览器的地址栏中输入一个url按回车之后,网络中都会发生什么?

答:比如输入的是123.xyz;

  1. 看浏览器的缓存
  2. 看本机host文件(里面有这个映射关系) 127.0.0.1(默认指自己的这一台机器) - localhost 本机的host是无法缓存的,除非手动修改host文件

在Linux或mac或者就是127.0.0.0(指向本机IP)-未知的Ip

  1. 家用路由器
  2. 上级路由、城市的LDNS(local)服务器
  3. 继续向上级的DNS服务器找
  4. gDNS服务器(拥有全球的IP地址)

五层网络模型

  1. 应用层:HTTP协议、DNS协议
  2. 运输层:TCP协议(如果没有传到,就会重传-是可靠的传输)、UDP协议(我发一个就不管了,传到就算,没有传到拉倒-不可靠的传输)
  3. 网络层:最大的一个概念就是IP地址–对应了一个IP协议(两个字段,存着SA DA)
  4. 数据链路层:
  5. 物理层:介质不一样,数据传输的速率不一样

层级关系:用了TCP协议,就必须基于IP协议,用了HTTP协议,就必须基于TCP协议

HTTP 协议分为两个部分(HTTP协议也就是个字符串):

  1. 请求:Reqeuest
    请求方式 路径 协议版本
    在后面就是各种属性:host、connection、浏览器类型…
  2. 响应:Response
  • 发出(加密–自上而下)
    物理层的协议 TCP/IP协议(SA DA,对方的端口) HTTP协议(请求头) Reqeust Headers
  • 收到(解密–自下而上)
    见网络录播课资料的ppt

端口就相当于是目的地址的不同应用程序(比如给DA的微信发是xx1端口,给DA计算机qq发的话是xx2端口)
数据链路层和物理层都是硬件层 mac地址(物理地址)-在数据链路层

HTTP协议

HTTP协议是明文协议

  1. 请求:Request
    • 请求头
    • 数据体

请求头格式:请求方式 url 协议版本
常用的请求方式有GET/POST,还有不常用的HEAD,PUT,DELETE

面试题目

GET和Post区别?

  • get请求

请求头:GET /path?a=1&b=2 HTTP1.1
属性:
Host:www.baidu.com
Connection:keep-alive
User-Agent:用来记录自己是什么浏览器,但是由于浏览器大战这个字段变得特别乱
GET方式最大的特点就是请求的参数都在url里面,GET请求发的参数可以不在url里,但是那只是理论上的可以,我们现在使用的是基于在web网络环境下的HTTP协议,所以请求的参数都在url里面
GET请求数据体很少

  • post

发生文件用Post请求方式
请求头:POST /path?a=1&b=2 HTTP1.1
属性:
Host:www.baidu.com
Connection:keep-alive
User-Agent
传文件的一些信息
POST请求数据体很大

  1. 响应:Response

响应头:协议版本 状态码 message
一些其他参数:
cache-Control:max-age 86400 意思就是保留86400s(1天),如果一天之内还请求,就不发送,直接展示这个页面
content-Length:内容长度
Server:Apache (Apache服务器)

数据体:

GET与POST区别

重点:面试会考

  1. 是基于什么前提的? 如果什么前提都没有,也就是不使用任何规范,只考虑语法和理论上的HTTP协议。

GET和POST几乎没有什么区别,只有名字不一样;

  1. 基于RFC规范的
    (1)理论上的(Specification):GET和POST具有相同语法的,但是有不同的语义.GET是获取数据的,POST是用来发送数据的,其他方面,没有区别.
    (2)实现上的(Implementation):各种浏览器,就是这个规范的实现者,所以才有常见的不同:
    a. GET的数据在url是可见的.POST请求是不显示在url

注意,url不一定都在地址栏中,完整的url在network中requestHeaders查看
b. GET请求对长度有限制,POST的长度是无限的;
c. GET请求的数据可以收藏为书签,POST请求到的数据不可收藏为书签
d. GET请求后,按后退按钮、刷新按钮无影响,POST数据会被重新提交
e. GET编码类型:application/x-www-form-url,Post编码类型有很多种:
encodeapplication/x-www-form-urlencoded 加密的
multipart/form-data
f. GET历史参数会被保留在浏览器中,post是不会保存在浏览器中
g. GET只允许ASCII(America Standard Code for Information Interchange),Post是没有编码限制的,甚至允许发二进制
h. GET 与POST相比,GET安全性较差,因为GET请求所发的数据是url的一部分.(浏览器和服务器会保存信息)

cookie与session

cookie

  1. 如果我们用JS的变量来存数据,那么在页面关闭的时候,数据就消失了.
  2. 保持登陆状态(跨页面)

按照正常的HTTP协议来说,是做不到的,因为HTTP协议也叫上下文无关协议

  1. 前端页面上,是要一个可以持久化存储数据的东西,一旦登陆成功,我就记载在这个里面—cookie(有域名限定,百度只能往自己的域名下装cookie,不同的域名只能往自己的域名下装cookie)

  2. cookie是有限制的
    cookie

自动登陆过程

  1. 初始状态:没有登陆
  2. 访问百度的登录,输入用户名,密码
  3. 如果用户名和密码是正确的,百度的后端会向这个域名下,设置一个cookie,写入用户的基本信息(加密)
  4. 以后每一次向百度发送请求,浏览器都会自动带上cookie
  5. 服务端(后端)看到了带有id的cookie,就可以解析这个加密的id来获取到这个用户本身的id
  6. 如果能获取到本身的id,那么证明这个用户已经登录过了,所以后端可以继续保留用户的信息;

缺点:如果某个坏人,复制了我浏览器里的cookie,他就可以在他的电脑上登陆我的账号了;
(XSS注入攻击:获取cookie的一种手段)

session

发送完请求后,登陆信息存在服务器端的session上
session的存在服务器端,不容易被复制走;
只要页面不关掉,登录信息就一直在服务器上存着.

数据存在session上也有缺点

  1. 如果用户量非常大,上亿的用户.服务器很耗资源
  2. 因为后端可能不止一台服务器,用户的登录信息一般只会存在一台服务器上;因为用户的登录操作,在哪台机器上执行的,就一般存在哪台机器上.
  3. 需要通过反向代理(轮询,IP哈希)

轮询:在服务器端-来了一个请求,给第一台,再来了一个请求,给第二台…(这种情况session无法自动登录)
IP哈希: 相同的Ip地址发送的请求会达到同一个机器上(服务器),这样便可以实现session自动登录;

页面的的打开方式

文件协议:打开本地文件的协议
file://
这样打开页面可能用不了一些和网络相关的操作(cookie,跨域…)

  1. B/S结构:
    brower/server — brower(浏览器)只负责页面的展示,server负责提供内容(后端)

brower是指浏览器的某一个页面,和client相对应

  1. C/S结构:
    client/server — client(客户端)只负责内容的展示,server负责提供内容(后端);

client是指application

www.baidu.com

index.html

页面的本质是什么? 页面的本质就是一个字符串.(一个带有html格式的字符串).

.后缀名只是告诉操作系统–你尽量给我以什么方式(软件)打开这个文件

浏览器向服务器请求一个页面的本质是什么?

B/S结构:

a. www.baidu.com
b. 服务器接收到这个请求后,服务器想要**把这个页面的内容(html格式的字符串)**返回给浏览器.
c. 页面的字符串存在哪里呢?存在html文件里。例如:index.html
d. 服务器端要读取这个文件.
e. 将读取出来的内容返回给浏览器
最后返回的是一个字符串,这个字符串的来源可能是文件,可能是缓存,可能是数据库;

服务器:严格的说,服务器是一台计算机,这台计算机,只提供服务(不是用户用的)
服务器不需要界面,是Linux系统
但是,我们常说的这个服务器,指的是服务容器,不是服务器.

服务容器:是一个程序,这个程序可以监听一个端口.
一个程序对应一个端口,一个端口只有一个程序在监听; 读取文件,并且返回.

如果我们想通过访问**服务器(这里的服务器是指服务容器)**的方式,来访问我们自己写的页面,我们就得装一个服务容器的程序.

发送网络请求

  1. 在浏览器中直接输入网址 (无法用代码控制)

  2. location href = “” 可以发出网络请求,但是页面会跳转 勾上preserve log可以保留network里面的请求记录;
    跳转页面后network的记录就会都被清空

  3. 带有src属性的标签—img script

还可以发出去带参数的请求
可以发出请求,服务端也是可以处理的,也是可以返回的,但是返回之后,能否被应用,还要看浏览器(页面无法处理返回结果–格式不匹配)

  1. 带有href属性的标签

请求是可以发出的,服务端是可以处理也是可以返回的,但是返回之后,能否被应用,还要看浏览器(页面无法处理返回结果)

  1. 带有action属性的标签。例如form表单,也可以向后端发送请求,但是form表单发出请求之后,也会页面跳转(页面会强制跳转)

有一种方式,可以用代码控制,页面不会跳转,服务端返回的结果我可以用js继续处理,这就是Ajax


// 要素
// 1.请求方式 get post
// 2.url
var xhr = null;
// 兼容IE6
if(window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
} else {
    xhr = new ActiveXObject('Microsoft.XMLHttp');
}
xhr.open('get', 'http://developer.duyiedu.com/edu/testAjax');   //建立与服务端的连接
xhr.send();     //发送请求

跨域

跨域访问资源
哪些东西属于资源?

  1. js文件算吗? js文件肯定是算资源的,但是js文件是允许被跨域请求的;
    css文件,jpg, png等,都可以被跨域请求的;
  2. src属性的资源都是可以跨域请求的
  3. href资源大部分都是可以被跨域请求的

哪些资源算是跨域请求的资源?

  1. 后端接口的数据
  2. 其他域的cookie
  3. 其他域的缓存

什么是其他的域?怎么样算跨域?

  1. 页面本身:有协议(http/https),域名,端口
    要请求的数据:https://www.baidu.com:80
  2. 协议,域名,端口号 – 有任意一个不一样就算跨域;

跨域这个行为,发生在哪里?
答案:

  1. 即使跨域了(协议,域名,端口号有不一样的),请求也可以发出.
  2. 服务器端也是可以接收的
  3. 服务器端也是可以正常处理的
  4. 服务器端也是可以正常返回数据
  5. 浏览器也能接收到这些数据
  6. 接收到之后,发现当前页面的域和请求的域不同,所以判定为跨域.
  7. 我们的代码在这等待结果,但是因为浏览器判定跨域了,不会把结果传递给我们的代码.

虽然跨域了,但是我们依然需要这个数据,怎么办?
解决跨域问题:

  1. 后端(别人家的)配合我们进行跨域.
    pan.baidu.com --> zhidao.baidu.com
    (1) jsonp(正常的情况下,返回的数据都是json格式,jsonp是一种特殊的格式)
    jsonp是可以解决跨域的;
    (2) 后端设置 Access-control-Allow-origin属性可以支持跨域.(聊天机器人讲,需要node)
  2. 后端不配合我们进行跨域.
    (3) iframe元素(缺点:只能显示,不能控制)
    (4) 通过后端代理(自己的后端)(后面聊天机器人,需要node)

用js实现AJAX

/**
 * 辅助函数,用于字符串拼接
 * @param {*} data 
 */
function dataConcat(data) {
    let dataStr = ''
    if (typeof data === 'object') {
        for (const prop in data) {
            dataStr = dataStr + prop + '=' + data[prop] + '&'
        }
    } else {
        dataStr = String(data);
    }
    return dataStr;
}

function ajax({ method = 'GET', url, success, data } = {}) {
    let xhr = null;
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else {
        xhr = new ActiveXObject('Microsoft.XMLHttp');
    }

    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            success(JSON.parse(xhr.responseText));
        }
    }
    const dataStr = dataConcat(data);
    method.toUpperCase();
    if (method != 'POST') {
        xhr.open(method, url + '?' + (dataStr || ''), true);
        xhr.send();
    } else {
        //post请求
        xhr.open(method, url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.send(dataStr)
    }
}

json的使用与特性以及原理

因为我想从一个接口获取一个数据
但是这个接口和当前页面不是同源的(也就是跨域了)
但是这个接口是支持jsonp的
script元素,有src属性,所以可以发出网络请求 (支持跨域) 跨域引入jquery的cdn文件
script元素虽然可以引用其他域的资源,浏览器不限制
但是,浏览器会将返回的内容作为js代码执行

比如返回
asd({“status”:“ok”,“msg”:"Hello! })
相当于调用了asd方法,传入了一个json对象作为参数
这里我们没有声明asd函数,所以执行这个函数会报错:asd is no defined
但是如果我们提前声明了asd函数,就可以执行,并且使用这个json对象的参数

jsonp原理
1.判断请求与当前页面的域,是否同源,如果同源则发送正常的ajax,就没有跨域的事情了
2.如果不同源,生成一个script元素
3.生成一个随机的callback名字,还得创建一个名为这个的方法 有可能同一时间发送多个请求
4.设置script标签的src,设置为要请求的接口
5.将callback作为参数拼接在后面
======>以上是前端部分
6.后端接收到请求后,开始准备要返回的数据
7.后端拼接数据,将要返回的数据用callback的值和括号包裹起来
例如:callback=asd123456 要返回的数据{“a”:1, “b”:2},
就要拼接为:asd123456({“a”:1, “b”:2})
8.将内容返回
======>以上是后端部分
9.浏览器接收到内容,会当作js代码来执行
10.从而执行名为asd123456的方法,这样的话我们就接收到了后端返回给我们的对象

 // jsonp的格式哪里特殊?

// jsonp的格式哪里特殊?
// 发送的时候,会带上一个参数callback,返回的结果不是json
// callback的名 + (+ json +);
$.ajax({
    url: "http://developer.duyiedu.com/edu/testJsonP",
    type: "get",
    dataType: "jsonp",
    success: function (data) {
        console.log(data);
    }
});
// jsonp跨域只能使用get方法,如果我们设置的是post方法,jquery会自动转为get方法
// 是不是在jsonp里面,我只能使用get方法?是不是我设置的post方法都会自动转为get方法?
// 不是
// jquery会先判断是否同源(非同源则为跨域),如果同源,设置的是get就是get,设置的是post就是post
// 如果不是同源,无论设置的是什么,都改为 get

var $ = {
    ajax:function (options) {
        var url = options.url;
        var type = options.type;
        var dataType = options.dataType;
        // 判断是否同源(协议,域名,端口号)
        // 获取目标url的域
        var targetProtocol =  "";//目标端口的协议
        var targetHost = "";//目标接口的host,host是包含域名和端口的
        // 如果url不带http,那么访问的一定是相对路径,相对路径一定是同源的
        if (url.indexOf('http://') == 0 || url.indexOf('https://') == 0) {
            var targetUrl = new URL(url);
            targetProtocol = targetUrl.protocol;
            targetHost = targetUrl.host;
        } else {
            targetProtocol = location.protocol;
            targetHost = location.host;
        }
        // 首先判断的是否为jsonP,因为不是json不用做其他的判断,直接发送ajax
        if(dataType == 'jsonp') {
            // 判断是否为同源
            if(location.protocol == targetProtocol && location.host == targetHost) {
                // 同源,直接当作普通的ajax做请求
            } else{//不同源,跨域
                // 随机生成一个callback
                var callback = "cb" + Math.floor(Math.random() * 10000);
                // 给window上添加一个方法
                window[callback] = options.success;
                // 生成script标签   
                var script = document.createElement('script');
                if(url.indexOf('?') > 0) {
                    // 表示已经有参数了
                    script.src = url + '&callback=' + callback;
                } else{
                    script.url = url + '?callback=' + callback;
                }
                script.id = callback;
                document.head.appendChild(script);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值