开头
这一篇文章主要是针对前端对于计算机网络这一块的,着重讲了运输层和应用层这一块的内容,这些内容对前端来说应该算是比较重要的了,所以感觉有必要好好去了解一下。文章大概8000字,欢迎大家阅读!希望对你有所帮助~~~
从运输层到应用层
运输层
运输层复用和分用指什么?
- 复用:发送端不同的应用程序的进程都可以用同一个运输层协议来传输数据
- 分用:接收端运输层去除报文首部之后可以把这些数据正确交付给应用程序进程
这里的进程是两台通信主机中的应用进程,两台主机通信实际上是两台主机中的应用进程互相通信和交换数据,通信的端点不是主机而是主机中的进程。
UDP协议(用户数据报协议-User Datagram Protocol)
UDP传送的数据单位协议是UDP报文或用户数据报,拥有差错检测的功能(对数据传输过程可能产生的数据错误进行检测,抛弃已经损坏的数据)
特点:
- 无连接:传送数据前不需要建立连接,对方的运输层收到UDP报文后不需要进行确认,减少了开销和发送数据之前的时延
- 多端传输:支持一对一、一对多、多对一和多对多交互通信
- 不可靠传输:不保证可靠交付,但是会尽最大努力去交付
- 面向报文:一次交付一个完整的报文,对应用层交下来的报文,既不合并也不拆分,而是保留报文边界。
- 无拥塞控制:网络出现的拥塞并不会使源主机发送速率降低,所以比较适合直播,通话等实时应用。
- 首部开销小:只有8个字节,比TCP的20个字节首部要短
TCP协议(传输控制协议- Transmission Control Protocol)
TCP传送的数据单位协议是TCP报文段
特点:
- 面向连接:传输数据前必须先建立起TCP连接,数据传输结束后要释放连接,就像打📞一样,先拨号,然后打完挂掉,TCP连接是一条虚连接而不是真正的物理连接
- 端对端传输:一条TCP连接只能有两个端点
- 可靠传输:通过TCP连接传输数据,无差错、不丢失、不重复、按序到达。
- 全双工通信:通信双方的应用程序任何时候都可以发送数据。双方都设有发送缓存和接收缓存,双方既是发送方也是接收方。发送缓存用来存放应用程序给传送方用来准备发送的数据和TCP已经发出但没收到确认的数据;接收缓存用来存放按序到达但未被接收应用程序读取的数据和不按序到达的数据。
- 面向字节流: 应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓存区,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。TCP不保证每一次接收方应用程序收到的数据块和发送方应用程序发送的数据块具有相应的大小,因为在发送过程中还会加上各种首部。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
- 首部开销较大:TCP报文段首部前20个字节是固定的,后面4n(整数)个字节根据需要增加,所以TCP首部最小长度是20字节,比UDP的8字节首部要长
TCP可靠传输的工作原理
理想传输条件有两个特点:1.传输信道不发生错误;2.不管以多快速度发送数据,接收方总是来得及处理数据。但是现实中并不具有这两个理想条件,所以我们需要一些可靠的传输协议。
此时我们会使用到自动重传请求ARQ - Automatic Repeat reQuest:重传的请求是自动进行的,接收方不需要请求方重传某个出错的分组。 而ARQ又包括停止等待ARQ协议和连续ARQ协议,拥有错误检测、正面确认、超时重传、负面确认及重传等机制
-
停止等待协议:发送完一个分组就停止发送,等待对方确认,确认后继续发送下一个分组。优点是很简单,缺点是信道利用率很低,每次发了一段分组数据之后要等很长一段时间进行确认才会继续发送下一段分组数据,中间等待的时间都浪费了。下面我们看看停止等待协议是如何进行的
在无差错的情况下:
而如果接收方B检测M1发生了错误,就会丢弃M1,也不会去通知A,又如果M1在传输过程中丢失了,这时候B啥也不知道,那肯定什么都不做噻。那我们怎么保证B可以正确收到A发来的信息呢?
其实我们可以采用超时重传:A为每一个发送的分组都设置了一个超时计时器,A只要在计时器到期前收到B的确认就会撤销计时器,继续发送下一个分组M2。而如果B对M1的确认丢失了,A在设定的时间内无法收到确认,但是A不知道消息是自己发送的时候出错或丢失了还是B在返回确认的时候丢失了。所以超时之后就要进行重传M1。
另一种情况:传输过程中没有差错,但是B对M1的确认迟到了,A的计时器此时会超时,还是会重传M1,B会收到重复的M1,此时B会丢弃重复的M1,并重传确认信息,A会收到重复的确认,此时它收下重复确认之后就丢弃。
-
连续ARQ协议:即滑动窗口协议,也是TCP的精髓所在。我们来看看它的工作原理
位于滑动窗口内的分组都可以连续发送而不需要等待对方的确认,这样提高了信道利用率。发送方每收到一个确认的时候就把滑动窗口向前移动一个分组的位置,接收方采取累计确认的方式对按序到达的最后一个分组发送确认,这样表示:到这个分组为止的所有分组都已经收到了确认。
TCP的流量控制
一般来说,我们总希望数据能传输得快一些,但是如果数据发送得过快,接收方来不及接收,就会造出数据的丢失。流量控制就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。实现流量控制的方法就是利用滑动窗口机制。
TCP的拥塞控制
在某段时间内,对网络中某资源的需求超过了该资源能提供的可用部分,网络传输性能就变低了,这就称为拥塞。TCP采用基于滑动窗口的方法进行拥塞控制,发送方维持一个拥塞窗口(大小取决于网络拥塞程度,并且动态变化,发送方根据网络拥塞情况调整发送的数据量),只要网络没有堵塞,拥塞窗口就可以再增大一些,便于把更多分组发送出去,提高网络的利用率。但只要网络出现拥塞或者可能出现拥塞,就要把拥塞窗口减小,以减少注入到网络中的分组数,用来缓解网络中出现的拥塞。
**如何判断网络出现了拥塞:**出现超时的情况就是出现了网络拥塞。
TCP拥塞控制算法
-
慢开始:由小到大逐渐增大拥塞窗口,每经过一个传输轮次,拥塞窗口就翻倍,这里有个东西叫做慢开始门限,就是当慢开始增长到一定量的时候就转为拥塞避免算法。
当拥塞窗口 < 慢开始门限:采用慢开始算法
当拥塞窗口 > 慢开始门限:采用拥塞避免算法
当拥塞窗口 = 慢开始门限:可以用慢开始也可以用拥塞避免
-
拥塞避免:让拥塞窗口缓慢增大,每经过一个传输轮次就把拥塞窗口加1,而不是翻倍,使其按线性规律缓慢增长
当网络出现拥塞的时候(出现超时重传),就调整 慢开始门限 = max(拥塞窗口/2,2),然后将拥塞窗口置1,开始执行慢开始算法,这样做的目的是迅速减少主机发送到网络中的分组数,让发生拥塞的路由器能有足够的时间处理累积的分组。
下面我们看个图来对比一下两种算法
-
快重传:可以让发送方尽早知道发生了个别报文段的丢失,它要求接收方不要等待自己发送数据时才进行确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。发送方只要一连收到了三个重复确认,就知道接收方没有收到报文段,就立即采用快重传,这样就不会出现超时的情况,发送方也不会误认为网络出现了拥塞。下面是个例图
-
快恢复:当发送方收到连续三个重复确认,由于发送方现在认为网络可能没有发送拥塞,因此不执行慢开始算法,而是执行快恢复算法,即:
慢开始门限 = 当前拥塞窗口 / 2
新拥塞窗口 = 慢开始门限
执行拥塞避免算法,使拥塞窗口线性增长
另外,发送窗口的上限值应该取接收方窗口和拥塞窗口这两个变量中的较小值
即:发送窗口上限 = Min(接收窗口,拥塞窗口),发送数据的速率由其中较小的一个值来决定。
三次握手
TCP建立连接的过程叫做握手,握手需要在客户端和服务端之间交换三个TCP报文段,所以也称为三报文握手。
让我们先来看一张图
我们先理解一下这几个单词的意思: SYN(synchronous)-同步 seq(sequence)-序号 ACK/ack(acknowledgement)-确认 FIN(finish)-完成
建立连接是由客户端向服务端发起的
-
第一步:A的TCP向B发出请求报文段,同步位SYN=1,seq表示传送数据时第一个字节序号是x
-
第二步:B收到A发来的连接请求报文段,使ACK=1变为确认态,确认号ack=x+1,
自己选择的序号seq=y
-
第三步:A收到该报文段后向B给出确认,ACK=1,序号seq在第一步中发送的序号的基础上+1,变为seq=x+1,确认号在第二步收到的序号y基础上+1变为ack=y+1,当B的TCP收到A的这一步确认信息后,也通知上层应用:连接已建立
为什么A最后还要发送一次连接,改成两次连接行不行?
改成两次连接肯定是不行的噻。建立第三次连接主要是为了防止已经失效的连接请求报文忽然又传送到了B,因而产生错误。当失效的连接请求报文传送到B之后,B会给予A确认,这时候A不会最后再发送一次确认,因此连接是建立不起来的。
四次挥手
数据传输结束之后,通信的双方都可以释放连接,TCP连接释放的过程也叫四报文挥手,直接看图
- 第一步:A应用进程向TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接,A让连接释放报文段完成态FIN=1,序号seq=u,等待B的确认
- 第二步:B发出确认,确认号在第一步中序号上+1,确认号ack=u+1,而自己的序号seq=v,确认态ACK=1,从A到B这个方向的连接到此已经释放,TCP处于半关闭状态。
- 第三步:B若发送数据,A仍要接收。若B没有向A发送的数据,其进程就要通知TCP释放连接,将完成态FIN=1,确认态ACK=1,序号seq=w,确认号ack=u+1发送给A
- 第四步:A收到B发来连接释放报文段,就要给出相应的确认,在自己的确认报文段中ACK=1,确认号ack=w+1,自己的序号seq=u+1
应用层
应用层的具体内容是规定应用进程在通信时遵守的协议,应用层很多协议都是基于客户端-服务端的方式。主要协议有:DNS(域名系统)、FTP(文件传输协议)、TFTP(简单文件传输协议)、TELNET(远程终端协议)、HTTP(超文本传输协议-最重要) 等
域名系统DNS
域名系统(Domain Name System)是互联网使用的命名系统。互联网采用层次结构的命名树作为主机名字,使用分布式的域名系统,用于把人们使用的机器名字转化为IP地址,域名比IP更方便人们记忆。
DNS使用UDP协议作为传输层协议,这样做是为了避免使用TCP时产生的连接时延,减少查询时等待的时间。
DNS的一些常见的顶级域名: .cn(代表中国)、.us(代表美国)、.uk(代表英国)、.com(公司和企业)、.net(网络服务机构)、.org(非营利性组织)。
看一张互联网的域名空间图,可以看到这是一个树结构,域名层级从上到下递减。对应的分别是域名从右到左的顺序,例如www.baidu.com -> com是顶级域名,baidu是二级域名,www是三级域名
域名需要由遍及全世界的服务器进行解析,域名服务器就是装有域名系统的主机,每个域名服务器都有高速缓存,存放最近用过的名字以及从何处获得的名字映射信息记录。
| 分类 | 作用 |
|---|---|
| 根域名服务器 | 最高层次的域名服务器,本地域名服务器解析不了就会向其求助。所有根域名服务器都知道所有顶级域名服务器的域名和IP地址。 |
| 顶级域名服务器 | 负责管理该顶级域名服务器下注册的二级域名 |
| 权限域名服务器 | 负责一个区的域名解析工作 |
| 本地域名服务器 | 当一个主机发出DNS查询请求时,这个查询首先发给本地域名服务器 |
域名解析的过程:
- 主机先向本地域名服务器进行递归查询
- 本地域名服务器采取迭代查询,向一个根域名服务器进行查询
- 根服务器告诉本地域名服务器,下一次要查询的顶级域名服务器的IP地址
- 本地域名服务器向顶级域名服务器查询
- 顶级域名服务器告诉本地域名服务器,下一步查询的权限服务器的IP地址
- 本地域名服务器向权限服务器进行查询
- 权限服务器告诉本地域名服务器所查询的主机IP地址
- 本地域名服务器最后把查询结果告诉主机
一个完整的过程就是 客户端 --------> 本地域名服务器 ------> 根域名服务器 ----返回----> 本地域名服务器 -------->顶级域名服务器 ----返回----> 本地域名服务器 -------->权威域名服务器 ----返回---->本地域名服务器 ----返回----> 客户端
递归查询
本机向本地域名服务器发出一次查询请求,就静待结果。如果本地域名服务器无法解析,自己就会以客户机的身份向其它域名服务器进行查询,相当于不断去递归,直到查找到结果,就把结果IP地址返回给本机。
迭代查询
本机域名系统向根域名服务器查询,根域名服务器告诉它下一步该去哪里查询,然后它再去查,每次查的时候都是以客户机的身份向各个服务器进行查询。
URL(统一资源定位符)
对可以从互联网上得到的资源的位置和访问方法的一种简洁表示,也就是我们常说的URL地址
URL的一般形式,比如http://主机:端口/路径 http是协议,主机表示主机的域名,HTTP端口号默认是80,可以省略,路径表示 /home 或者 /about,指网页中的子页面。
用户点击URL发生的过程大概就是下面这样
- 请求构建-构建请求头和请求行
- 查找本地缓存
- 准备IP地址和端口-DNS解析
- 客户端发起请求
- 服务器解析请求
- 浏览器解析响应数据
更加详细的可以查看这篇文章浏览器从输入URL经过浏览器显示发生了什么
HTTP(超文本传输协议)
HTTP就是一种在计算机网络中两点间传输文字、图片、视频、音频的协议
它有一些特点:
-
简单灵活易扩展: HTTP允许传输任意类型的数据对象,传输的类型由Content-Type标记。常见的Content-Type格式如:text/html(HTML文本)、text/plain(纯文本)、image/jpeg(jpg图片)、image/png(png图片)、application/json(JSON数据)、multipart/form-data(文件上传格式)
-
请求-响应模式:客户端发送请求,服务器响应请求
-
可靠传输: 基于TCP协议,把TCP协议的可靠传输特征给保留了下来
-
无连接: 指限制每次连接只处理一个请求,服务器处理完客户端的请求,然后响应,客户端收到应答之后就断开连接,这样可以节省传输时间.。
-
无状态: 无状态指协议对于事务处理没有记忆能力,缺点是如果后续的处理需要用到之前的信息,必须要重传,这样导致了每次连接传输的数据量增大。优点是如果后续的连接不需要之前提供的信息,响应就会比较快。
-
明文传输:这也是HTTP的缺点,数据是以明文传输的,就是不安全,可以被监听和窥探,中途传输的信息可以很容易被人看到,而解决方案就是使用HTTPS。
-
队头阻塞: 当HTTP开启长连接时,共用一个TCP连接,当某个请求时间过长时,其他的请求只能处于阻塞状态 。
现在常用的HTTP版本是HTTP1.1,它默认采用持久连接,就是说TCP连接之后不关闭,可以被多个请求复用,可以由请求头中的Connection:keep-alive设置,这样做虽然可以省去了每次连接时产生的时延,但也会给服务器造成较大压力。
而目前也有HTTP2.0版本(2015年)了,它大幅度提高了Web性能。完全兼容HTTP1.1的语义,它有如下的特点:
- 二进制分帧: 其在应用层和传输层之间增加了一个二进制分帧层 。在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码 ,减小了数据传输大小。
- 首部压缩: HTTP1.1不支持HTTP首部压缩 ,造成了数据较大,降低了传输速度。 在HTTP2.0中,使用了HPACK(头部压缩算法,类似于索引表-js中的数组,每个索引对应一个值, 在传输的时候,不在是传输对应的头部信息了,而是传递索引,对于之前出现过的头部信息,只需要把索引(比如1,2,...)传给对方即可,对方拿到索引查表就行了,比如索引2对应的就是method方法,类似于数组中下标2对应'GET'),使用该算法大大增加了传输速度。
- 多路复用: 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题,也极大提高了传输性能 。
- 请求优先级: 可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验 。
- 服务端推送: 服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源也无需客户端明确的请求 。
HTTPS
HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。 HTTPS解决了HTTP中使用明文传输不安全的问题,对传输数据进行了加密。看看下图,HTTPS也就是在应用层和传输层之间多了SSL层, 在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
HTTPS协议依赖于TLS/SSL协议,它们的功能实现依赖于
- 对称加密: 加密和解密同用一个密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。 使用这种方式在传输的过程中很难保证能将密钥安全的转发,收到之后也很难保管,反正就是很容易落到攻击人手里,所以单单使用这种方式还8太行。
- 非对称加密:它使用公有密钥和私有密钥。服务端存储着私有密钥,然后将公有密钥发布出去给客户端,服务端使用一对私有密钥就可以和多对公有密钥通信。但是数据加密和解密都需要花费时间,会降低传输效率。
HTTPS使用的是上面两种加密方式的结合
使用对称密钥的好处是解密的效率快,使用非对称密钥的好处是使得传输的内容不能被破解,就算拦截到了客户端传输过去的数据,没有服务端的私钥也不能破解。HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。
具体步骤是:
- 服务端首先把自己的公钥(Key1)发给证书颁发机构,向证书颁发机构申请证书。
- 证书颁发机构自己也有一对公钥私钥。机构利用自己的私钥来加密Key1,并且通过服务端网址等信息生成一个证书签名,证书签名同样经过机构的私钥加密。证书制作完成后,机构把证书发送给了服务端。
- 当客户端向服务端请求通信的时候,服务端不再直接返回自己的公钥(Key1),而是把自己申请的证书返回给客户端。
- 客户端收到证书以后,要做的第一件事情是验证证书的真伪。需要说明的是,各大浏览器和操作系统已经维护了所有权威证书机构的名称和公钥。所以客户端只需要知道是哪个机构颁布的证书,就可以从本地找到对应的机构公钥,解密出证书签名。 客户端对证书验证成功后,就可以放心地再次利用机构公钥,解密出服务端的公钥Key1。 证书就是HTTPS中的数字证书,证书编号就是数字签名,而第三方机构就是指数字证书签发机构(CA)
- 客户端随机生成自己的对称密钥Key2,并且用服务端公钥Key1加密Key2,发送给服务端。
- 服务端用自己的私钥解开加密,得到对称加密密钥Key2。于是客户端与服务端开始用Key2进行对称加密的通信。
大致流程就是:服务器申请证书发送给客户端,客户端根据证书解密服务端公钥,拿到服务端的正确公钥,然后客户端随机生成一个对称加密密钥,使用获取的公钥进行加密再传输给服务端,服务端再通过解密拿到该对称密钥,后续的所有信息都通过该对称密钥进行加密解密,完成整个HTTPS的流程。
HTTP 与 HTTPS 的区别
-
HTTP明文传输,HTTPS密文传输
-
HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO,谷歌、百度优先索引HTTPS网页;
-
HTTPS需要用到SSL证书,而HTTP不用;
-
HTTPS标准端口443,HTTP标准端口80;
-
HTTPS基于传输层,HTTP基于应用层;
👉 最后再简单总结一下关于ajax的内容
封装一个Ajax
这里先罗列一下关于ajax的一些知识点
-
readyState
- 0 - (未初始化)还没有调用send()方法
- 1 - (载入)已调用send()方法,正在发送请求
- 2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
- 3 - (交互)正在解析响应内容
- 4 - (完成)响应内容解析完成,可以在客户端调用了 (主要)
-
status(HTTP状态码)
- 1XX: 信息,服务器收到请求,需要请求者继续执行操作(不常用)
- 2XX: 成功,操作被成功接收并处理 。常见: 200-OK(正常返回)、201-Created(成功创建)、204 - No Content(网页未更新时,服务器正常处理但没返回内容)
- 3XX: 重定向,需要进一步的操作以完成请求 。常见:301 - Moved Permanently (永久重定向, 请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI )、302 - Found(临时重定向,资源临时被移动,客户端应继续使用原有URI )、304 - Not Modified( 未修改。请求的资源未修改,不返回任何资源。客户端通常会缓存访问过的资源)
- 4XX: 客户端错误状态 ,表示服务器无法处理请求。常见:400 - Bad Request (客户端请求语法错误,服务器无法理解 )、401 - Unauthorized(未授权,一般是需要先登录授权)、403 - Forbidden ( 服务器理解请求,但是拒绝执行 ,一般用于某些页面权限的设置)、404 - Not Found(资源访问不到)
- 5XX: 服务器错误,处理请求的过程中发生了错误 。常见:500( 服务器内部错误,无法完成请求 )、 503(超载或者在维护,暂时无法处理请求)
封装的代码
function getJson(options) {
//这个options时传入给ajax的配置参数
return new Promise((resolve, reject) => {
//返回一个promise对象 resolve成功是的处理,reject失败时的处理
if (!options.url) { // 需要请求的路径
console.log("请输入url")
return
}
let method = options.method || "GET" //请求方式如果没有就默认为get
let async = options.async || true //ajax是否异步请求默认位true
let xhr = new XMLHttpRequest()
if (method === "GET") {
xhr.open(method, options.url, async)
xhr.send()
} else if (method === "POST") {
xhr.open(method, options.url, async)
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(options.data)
}
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.responseText) {
//有数据说明相应成功
resolve(xhr.responseText)
}
}
xhr.onerror = err => {
reject(err)
}
})
}
//调用api
getJson({
url: "",
method: "",
}).then(res => {
console.log(res)
})
总结
文章就暂时先写到这了,因为自己本学期才学到计算机网络,我们上课所用的教材也就是谢希仁编撰的《计算机网络》,除了这个,也在网上搜集了各种关于计网的资料,收集了下来。针对里面的一些内容对自己的计网知识进行了一下简单的总结,也为自己未来找工作打一些基础。这文章里的大部分内容应该都是前端需要掌握的,所以重点就写了这些,像计网里还有物理层、链路层、网络层这些啥的就不总结了,想了解的也可以去看一下。如果里面内容有哪些写得不对,欢迎大家批评指正! 那些和我一样还是学生党的也正在准备找工作的,希望大家一起加油!共勉!!! 码字不易,路过的帅哥美女们在这寒冷的冬天里动动手指运动运动点个赞8,ball ball you!
往期文章
参考
《计算机网络》-谢希仁