转自掘金网https://juejin.im/post/5c591fda6fb9a049dc02b1cc#heading-23
作者:小生方勤
网络基础
1.五层因特网协议栈
2.HTTP与HTTPS的区别
3.TCP/IP 协议
4.三次握手和四次挥手
5.DNS域名解析
6.五类IP地址
7.跨域的原因及处理方式
8.正向代理和反向代理
9.CDN带来的性能优化
10.HTTP强缓存&协商缓存
1.五层因特网协议栈
(1).应用层(application-layer)
作用:用来定义应用进程(进程:主机中正在运行的程序)间的通信和交互的规则
在互联网中,应用层的协议还有域名系统DNS (Domain name system)、万维网应用的HTTP协议、支持电子邮件的SMTP协议
(2).传输层(transport layer)
作用:负责两台主机进程间的通信提供的数据传输服务。
传输层常用的两种协议:
1.传输控制协议-TCP:提供面向连接的,可靠的数据传输服务
2.用户数据协议-UDP:提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)
TCP(transmission Control Protocol)
1.TCP是面向连接的(需要先建立连接)
2.每一条TCP连接只能有两个端点,每一条TCP连接只能是一对一,
3.TCP提供可靠交付的服务。通过TCP连接传送的数据,误差错、不丢失、不重复、并且序列到达
4.TCP提供双全工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP两端都设有发送缓存和接收缓存,用来临时存放通信的数据。
5.面向字节流。TCP中的流(Stream)指的是流入进程或从进程流出的字节序列。
UDP(User Datagram Protocol)
1.UDP是无连接的。
2.UDP是尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态。
3.UDP是面向报文的。
4.UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如直播、实时视频会议等....)
5.UDP支持一对一、一对多、多对一和多对多的交互通信。
6.UDP的首部开销小,只有8个字节,比TCP首部的20个字节要短。
(1).单工数据传输只支持数据在一个方向上传输
(2).半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,值允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。
(3).双全工数据通信允许数据同时在两个方向上传输,因此,双全工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
(3).网络层
作用:选择合适的网间路由和交换节点,确保计算机通信的数据及时传送。
互联网是由大量的异构网络通过路由器相互连接起来的。互联网使用的网络层协议是无连接的网际协议(intert prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。
(4).数据链路层(链路层) data llink layer
作用:两台主机间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。
在两个相邻节点之间传送数据时,数据链路层将网络层接下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息、地址信息,差错控制等)
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始到哪个比特结束。
(5).物理层
作用:实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。
“透明传输比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。在互联网使用的各种协议中最重要的和最著名的就是TCP/IP 两个协议。
同OSI七层协议模型、TCP/IP四层模型的区别
1.OSI七层模型
OSI七层协议模型主要是:
应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data link) 、物理层。
2.TCP/IP四层模型
TCP/IP是一个四层的体系结构,主要包括:
应用层(Application)、传输层(Transport)、网络层(Network)、和链路层(Link)
HTTP 和HTTPS的区别
1.协议
HTTP:运行在TCP上,明文传输,客户端与服务端都无法验证对方的身份。
HTTPS:审批SSL(secure socker layer ) 外壳的HTTP,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP.
2.端口
HTTP:80
HTTPS:443
3.资源消耗
HTTP:较少
HTTPS:由于加密处理,会消耗更多的CPU和内存资源
4.开销
HTTP:无需证书
HTTPS:需要证书,而证书一般需要向认证机构购买
5.加密机制
HTTP:无
HTTPS:共享密钥加密和公开密钥加密并用的混合加密机制
6.安全性
HTTP:弱
HTTPS:由于加密机制,安全性强
对称加密与非对称加密
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全的将密钥发送给对方;
而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
由于非对称加密的方式不需要发送用来解密的私钥,所以可保证安全性;但是和对称加密比起来,非常的慢。
因此,我们还是用对称加密来发送消息,但对称加密使用的私钥我们可以通过非对称加密的方式发送出去。
HTTP2
意义:提高了网页的性能
在HTTP1中浏览器限制了同一域名下的请求数量(chrome下一般是六个),当在请求很多资源的时候,由于对头阻塞,当浏览器达到最大请求数量时,剩余的资源需要等待当前的六个请求完成后才能进行请求。
HTTP2中引用了多路复用的技术,这个技术可以只通过一个TCP连接就可以传送所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。
TCP/IP协议
负责传输的IP协议
按层次分,IP(Internet Protocol) 网际协议位于网络层,IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件,其中两个重要的条件是IP地址和MAC地址(Media Access Control Address) .
IP地址和MAC地址:指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址,IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。
使用ARP协议凭借MAC地址进行通信
1.IP间的通信依赖MAC地址。
2.ARP是一种用以解释地址的协议,根据通信方的IP地址就可以反查出对应方的MAC地址。
TCP协议如何保证传输的可靠性
tcp提供一种面向连接的、可靠的字节流服务。
1.面向连接
意味着两个使用TCP的应用(通常是一个应用和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;
2.字节流服务
意味着两个应用程序通过TCP连接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。
TCP之所以可靠,大体上由于以下原因:
1.数据包校验:目的是检测数据在传输过程中的任何变化,若校验包有错,则丢弃报文段并且不给出响应,这是TCP发送数据端超时后会重发数据;
2.对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将会对失序数据进行重新排序,然后才交给应用层;
3.丢弃重复数据:对于重复数据,能够丢弃重复数据;
4.应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
5.超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
6.流量控制:TCP连接的每一方都有固定大小的缓存空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓存区溢出,这就是流量控制。
TCP/IP通信传输流
发送端在层与层之间传送数据时,每经过一层必定会加上一个该层的首部信息。反之,接收端在层与层之间传输数据时,每经过一层会把相关的首部信息去掉。
TCP三次握手和四次挥手
TCP(Transmission control Protocol 传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层控制协议,由IPTF的RFC793定义。
三次握手
TCP连接
第一次握手:
建立连接时,向服务器发出连接请求报文,这是报文首部中的同部位 SYN = 1,同时选择一个初始序列号 seq = x ,客户端进程进入了SYN-SENT(同步已发送状态)状态,等待服务器确认;
第二次握手:
服务器收到SYN 包后,如果同意连接,则发出确认报文;确认报文ACK=1,SYN = 1,确认号是ack=x + 1,同时也要为自己初始化一个序列号seq = y,此时服务器进程进入了SYN-RCVD(同步收到)状态;
第三次握手:
客户端收到服务器的SYN+ACK包,要向服务器给出确认。确认报文的ACK=1,ack =y+1,自己的序列号seq=x+1,此时TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。
完成三次握手,客户端与服务器开始传送数据。
注:
seq:"sequance" 序列号;
ack:"acknowledge" 确认号;
SYN:"synchronize" 请求同步标志;
ACK:"acknowledge" 确认标志;
FIN:"Finally" 结束标志。
未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目已表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所表示的连接在服务器处于SYN_RECV状态,当服务器收到客户端的确认包时,删除该条目,服务器进入ESTABLISHED状态。
建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭(half - close)造成的。
四次挥手
第一次挥手:
客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部FIN = 1,其序列号为seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。
第二次挥手:
服务器收到连接报文,发出确认报文,ACK= 1,ack = u+1,并且带上自己的序列号seq= v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。
第三次挥手:
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN = 1,ack = u + 1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq= w ,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手:
客户端收到服务器的连接释放报文后,必须发出确认,ACK = 1,ack = w + 1,而自己的序列号是 seq = u + 1,此时,客户端就进入了 TIME-WAIT(时间等待)状态。
四次的原因
这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN(ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。 但关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你未必会马上会关闭 SOCKET ,也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的.
由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
DNS 域名解析
当你在浏览器的地址栏输入https://juejin.im后会发生什么,大家在心中肯定是有一个大概的,这里我将DNS 域名解析这个步骤详细的讲一遍。在讲概念之前我先放上一张经典的图文供大家思考一分钟。
查找域名对应的 IP 地址的具体过程
1.浏览器搜索自己的 DNS 缓存(浏览器维护一张域名与 IP 地址的对应表);如果没有命中,进入下一步;
2.搜索操作系统中的 DNS 缓存;如果没有命中,进入下一步;
3.搜索操作系统的 hosts 文件( Windows 环境下,维护一张域名与 IP 地址的对应表);如果没有命中,进入下一步;
DNS Prefetch
即 DNS 预获取,是前端优化的一部分。一般来说,在前端优化中与 DNS 有关的有两点:
减少 DNS 的请求次数
进行 DNS 预获取
典型的一次 DNS 解析需要耗费 20-120 毫秒,减少DNS解析时间和次数是个很好的优化方式。DNS Prefetching 是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能减少用户的等待时间,提升用户体验。
TCP状态转换图
SSL单向/双向认证详解(其实是握手过程的详解)