说明:本文主要是自己从Github和论坛上查找的资料进行汇总,方便自己梳理知识点
附原文章和资源的地址:https://github.com/huihut/interview#%E8%99%9A%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0
https://github.com/Snailclimb/JavaGuide
https://github.com/CyC2018/CS-Notes
https://leetcode-cn.com/circle/discuss/f40g4J/
这些大佬总结的知识点,非常到位。
读者可以收藏链接,去源地址观看!!!
1.计算机网络的体系结构,有哪些协议?
通常计算机网络的体系结构分为三类:
-
开放式系统互联模型(Open System Interconnection Model, OSI)
-
TCP/IP
-
五层协议
1.1 应用层
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。*应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如*域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文。
域名系统
域名系统(Domain Name System 缩写 DNS,Domain Name 被译为域名)是因特网的一项核心服务,它作为可以将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。(百度百科)例如:一个公司的 Web 网站可看作是它在网上的门户,而域名就相当于其门牌地址,通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,类似的还有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco 公司的域名是 www.cisco.com 等。
HTTP 协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。(百度百科)
1.2 运输层
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议:
-
传输控制协议 TCP(Transmission Control Protocol)--提供面向连接的,可靠的数据传输服务。
-
用户数据协议 UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
1.3 网络层
在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。
这里要注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。
这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Internet Protocol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP 层。
1.4 数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
1.5 物理层
在物理层上所传送的数据单位是比特。
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异, 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定单指 TCP 和 IP 这两个具体的协议,而往往表示互联网所使用的整个 TCP/IP 协议族。
1.6 总结一下
上面我们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图总结一下(图片来源于网络)。
2. TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流 的传输层通信协议,其传输的单位是报文段。
特征:
-
面向连接
-
只能点对点(一对一)通信
-
可靠交互
-
全双工通信
-
面向字节流
TCP 如何保证可靠传输:
-
确认和超时重传
-
数据合理分片和排序
-
流量控制
-
拥塞控制
-
数据校验
TCP:状态控制码(Code,Control Flag),占 6 比特,含义如下:
-
URG:紧急比特(urgent),当 URG=1 时,表明紧急指针字段有效,代表该封包为紧急封包。它 告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据), 且上图中的 Urgent Pointer 字段也会被启用。
-
ACK:确认比特(Acknowledge)。只有当 ACK=1 时确认号字段才有效,代表这个封包为确认封 包。当 ACK=0 时,确认号无效。
-
PSH:(Push function)若为 1 时,代表要求对方立即传送缓冲区内的其他对应封包,而无需等 缓冲满了才送。
-
RST:复位比特(Reset),当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原 因),必须释放连接,然后再重新建立运输连接。
-
SYN:同步比特(Synchronous),SYN 置为 1,就表示这是一个连接请求或连接接受报文,通常带 有 SYN 标志的封包表示『主动』要连接到对方的意思。
-
FIN:终止比特(Final),用来释放一个连接。当 FIN=1 时,表明此报文段的发送端的数据已发送 完毕,并要求释放运输连接。
3. UDP协议
UDP(User Datagram Protocol,用户数据报协议)是 OSI(Open System Interconnection 开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,其传输的单位是用户数据报。
特征:
-
无连接
-
尽最大努力交付
-
面向报文
-
没有拥塞控制
-
支持一对一、一对多、多对多的交互通信
-
首部开销小
4.TCP与UDP的区别
-
TCP 面向连接,UDP 是无连接的;
-
TCP 提供可靠的服务,也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序 到达;UDP 尽最大努力交付,即不保证可靠交付
-
TCP 的逻辑通信信道是全双工的可靠信道;UDP 则是不可靠信道
-
每一条 TCP 连接只能是点到点的;UDP 支持一对一,一对多,多对一和多对多的交互通信
-
TCP 面向字节流(可能出现黏包问题),实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的(不会出现黏包问题)
-
UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等)
-
TCP 首部开销20字节;UDP 的首部开销小,只有 8 个字节
5. TCP三次握手和四次挥手问题
5.1 三次握手建立连接
TCP建立连接过程:
1.客户端发送SYN给服务器,表示请求建立连接
2.服务器接收到客户端发送的SYN后,表示同意建立连接,并回复SYN+ACK给客户端
3.客户端接收到服务端的SYN+ACK后,回复服务端ACK,表示客户端收到了服务端的同意报文
4.服务端收到客户端的ACK,连接已建立,可以传输数据
5.2 为什么要进行三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
5.3 TCP四次挥手释放连接
TCP释放连接:
1.客户端发送FIN给服务器,说明客户端不在发送数据给服务器了(请求释放客户端到服务器的连接)
2.服务器收到客户端发送的FIN后,回复ACK给客户端(表示同意释放客户端到服务器端的连接)
3.客户端收到服务端回复的ACK,此时客户端到服务端的连接已释放(但服务端到客户端的链接还未释放,客户端还可以接收数据)
4.服务端继续发送未发送完的数据给客户端
5.服务端发送FIN+ACK给客户端,说明服务端发送完了数据(请求释放从服务端到客户端的连接,就算没收到客户端的回复,过段时间也会自动释放)
6.客户端收到服务端的FIN+ACK后,回复ACK给服务端(同意释放从服务端到客户端的连接)
7.服务器收到客户端的ACK后,释放从服务器到客户端的连接
5.4 为什么要进行四次挥手
因为 TCP 是全双工模式,客户端请求关闭连接后,客户端向服务端的连接关闭(一二次挥手),服务端继续传输之前没传完的数据给客户端(数据传输),服务端向客户端的连接关闭(三四次挥手)。
6. TCP黏包问题
原因
TCP 是一个基于字节流的传输服务(UDP 基于报文的),“流” 意味着 TCP 所传输的数据是没有边界的。所以可能会出现两个数据包黏在一起的情况。
解决
-
发送定长包。如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。
-
包头加上包体长度。包头是定长的 4 个字节,说明了包体的长度。接收对等方先接收包头长度,依据包头长度来接收包体。
-
在数据包之间设置边界,如添加特殊符号
\r\n
标记。FTP 协议正是这么做的。但问题在于如果数据正文中也含有\r\n
,则会误判为消息的边界。 -
使用更加复杂的应用层协议。
7. TCP流量控制
概念
流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及收
方法
-
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口(rwnd), 即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。
-
发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口(cwnd),其大小与网络的带宽和时延密切相关
因此发送方利用可变窗口进行流量控制:发送方的发送窗口取接收窗口和拥塞窗口的最小值
8. TCP拥塞控制
8.1什么是拥塞控制
拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
8.2 拥塞控制与流量控制的区别
-
拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
-
流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。
8.3 解决方法
-
慢开始( slow-start ):慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
-
拥塞避免( congestion avoidance ):拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1.
-
快重传与快恢复: 在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
9.打开一个网页会使用哪些协议
总体来说分为以下几个过程:
-
DNS 解析
-
TCP 连接
-
发送 HTTP 请求
-
服务器处理请求并返回 HTTP 报文
-
浏览器解析渲染页面
-
连接结束