From ea8d9e806b7722ffe3d30a211468406a05aad5f2 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 10 Aug 2018 18:34:00 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E8=AE=A1=E7=AE=97=E6=9C=BA=E7=BD=91?= =?UTF-8?q?=E7=BB=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\234\272\347\275\221\347\273\234.md" | 159 ++++++++++++++---- 1 file changed, 127 insertions(+), 32 deletions(-) diff --git "a/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\344\270\216\346\225\260\346\215\256\351\200\232\344\277\241/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" "b/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\344\270\216\346\225\260\346\215\256\351\200\232\344\277\241/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" index 009f1980..2691269a 100644 --- "a/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\344\270\216\346\225\260\346\215\256\351\200\232\344\277\241/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" +++ "b/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\344\270\216\346\225\260\346\215\256\351\200\232\344\277\241/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" @@ -1,3 +1,39 @@ + + +- [一 OSI与TCP/IP各层的结构与功能,都有哪些协议](#一-osi与tcpip各层的结构与功能,都有哪些协议) + - [五层协议的体系结构](#五层协议的体系结构) + - [1 应用层(application layer)](#1-应用层(application-layer)) + - [域名系统(Domain Name System缩写DNS,Domain Name被译为域名)](#域名系统(domain-name-system缩写dns,domain-name被译为域名)) + - [HTTP协议](#http协议) + - [2 运输层(transport layer)](#2-运输层(transport-layer)) + - [运输层主要使用以下两种协议:](#运输层主要使用以下两种协议) + - [UDP的主要特点:](#udp的主要特点) + - [TCP的主要特点:](#tcp的主要特点) + - [3 网络层(network layer)](#3-网络层(network-layer)) + - [4 数据链路层(data link layer)](#4-数据链路层(data-link-layer)) + - [5 物理层(physical layer)](#5-物理层(physical-layer)) +- [二 TCP三次握手和四次挥手(面试常客)](#二-tcp三次握手和四次挥手(面试常客)) + - [为什么要三次握手?](#为什么要三次握手?) + - [为什么要传回SYN(发起一个新链接)?](#为什么要传回syn(发起一个新链接)) + - [传了SYN,为啥还要传ACK(确认序号有效)?](#传了syn,为啥还要传ack(确认序号有效)) + - [为什么要四次挥手?](#为什么要四次挥手) +- [三 TCP、UDP协议的区别](#三-tcp、udp协议的区别) +- [四 TCP协议如何保证可靠传输](#四-tcp协议如何保证可靠传输) + - [超时重传](#超时重传) + - [停止等待协议](#停止等待协议) + - [滑动窗口](#滑动窗口) + - [流量控制](#流量控制) + - [拥塞控制](#拥塞控制) + - [五 在浏览器中输入url地址 ->> 显示主页的过程(面试常客)](#五-在浏览器中输入url地址---显示主页的过程(面试常客)) + - [六 状态码](#六-状态码) + - [七 各种协议与HTTP协议之间的关系](#七-各种协议与http协议之间的关系) + - [八 HTTP长连接、短连接](#八-http长连接、短连接) +- [写在最后](#写在最后) + - [计算机网络常见问题回顾](#计算机网络常见问题回顾) + - [建议](#建议) + + + ## 一 OSI与TCP/IP各层的结构与功能,都有哪些协议 OSI的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用。在这里顺带提一下之前一直被一些大公司甚至一些国家政府支持的OSI失败的原因: @@ -14,27 +50,27 @@ OSI的七层体系结构概念清楚,理论也很完整,但是它比较复 结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。 -### 1 应用层(application layer) +### 1 应用层(application layer) **应用层的任务是通过应用进程间的交互来完成特定网络应用。**应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如**域名系统DNS**,支持万维网应用的**HTTP协议**,支持电子邮件的**SMTP协议**等等。我们把应用层交互的数据单元称为报文。 -#### 域名系统(Domain Name System缩写DNS,Domain Name被译为域名) +#### 域名系统(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页面的方法。(百度百科) -### 2 运输层(transport layer) +### 2 运输层(transport layer) **运输层的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务**。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。 -#### 运输层主要使用以下两种协议: +#### 运输层主要使用以下两种协议 1. **传输控制协议TCP**(Transmisson Control Protocol)--提供**面向连接**的,**可靠的**数据传输服务。 2. **用户数据协议UDP**(User Datagram Protocol)--提供**无连接**的,尽最大努力的数据传输服务(**不保证数据传输的可靠性**)。 -#### UDP的主要特点: +#### UDP的主要特点 1. UDP是无连接的; 2. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数); 3. UDP是面向报文的; @@ -42,7 +78,7 @@ OSI的七层体系结构概念清楚,理论也很完整,但是它比较复 5. UDP支持一对一、一对多、多对一和多对多的交互通信; 6. UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。 -#### TCP的主要特点: +#### TCP的主要特点 1. TCP是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接); 2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一); 3. TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达; @@ -50,7 +86,7 @@ OSI的七层体系结构概念清楚,理论也很完整,但是它比较复 5. 面向字节流。TCP中的“流”(stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。 -### 3 网络层(network layer) +### 3 网络层(network layer) **网络层负责为分组交换网上的不同主机提供通信服务。**在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用**IP协议**,因此分组也叫**IP数据报**,简称**数据报**。 @@ -62,13 +98,13 @@ OSI的七层体系结构概念清楚,理论也很完整,但是它比较复 互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做**网际层**或**IP层**。 -### 4 数据链路层(data link layer) +### 4 数据链路层(data link layer) **数据链路层通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。** 在两个相邻节点之间传送数据时,**数据链路层将网络层交下来的IP数据报组装程帧**,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。 -### 5 物理层(physical layer) +### 5 物理层(physical layer) 在物理层上所传送的数据单位是比特。 **物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。**使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。 @@ -77,7 +113,7 @@ OSI的七层体系结构概念清楚,理论也很完整,但是它比较复 上面我们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图总结一下。图片来源:https://blog.csdn.net/yaopeng_2005/article/details/7064869 ![七层体系结构图](https://user-gold-cdn.xitu.io/2018/7/29/164e529309f0fa33?w=1120&h=1587&f=gif&s=225325) -## 二 TCP三次握手和四次挥手(面试常客) +## 二 TCP三次握手和四次挥手(面试常客) 为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。 @@ -93,11 +129,23 @@ OSI的七层体系结构概念清楚,理论也很完整,但是它比较复 - 服务端–发送带有SYN/ACK标志的数据包–二次握手–客户端 - 客户端–发送带有带有ACK标志的数据包–三次握手–服务端 -**为什么要传回SYN(发起一个新链接)?** +### 为什么要三次握手 + +**三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。** + +第一次握手:Client什么都不能确认;Server确认了对方发送正常 + +第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常 + +第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常 + +所以三次握手就能确认双发收发功能都正常,缺一不可。 + +### 为什么要传回SYN(发起一个新链接) 接收端传回发送端所发送的SYN是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。 -**传了SYN,为啥还要传ACK(确认序号有效)?** +### 传了SYN,为啥还要传ACK(确认序号有效) 双方通信无误必须是两者互相发送信息都无误。传了SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要ACK信号来进行验证。 @@ -109,16 +157,70 @@ OSI的七层体系结构概念清楚,理论也很完整,但是它比较复 - 服务器-关闭与客户端的连接,发送一个FIN给客户端 - 客户端-发回ACK报文确认,并将确认序号设置为收到序号加1 + +### 为什么要四次挥手 + +任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。 + +举个例子:A和B打电话,通话即将结束后,A说“我没啥要说的了”,B回答“我知道了”,但是B可能还会有要说的话,A不能要求B跟着自己的节奏结束通话,于是B可能又巴拉巴拉说了一通,最后B说“我说完了”,A回答“知道了”,这样通话才算结束。 + 上面讲的比较概括,推荐一篇讲的比较细致的文章:[https://blog.csdn.net/qzcsu/article/details/72861891](https://blog.csdn.net/qzcsu/article/details/72861891) -### 三 TCP、UDP协议的区别 +## 三 TCP、UDP协议的区别 ![TCP、UDP协议的区别](https://user-gold-cdn.xitu.io/2018/4/19/162db5e97e9a9e01?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) UDP在传送数据之前不需要先建立连接,远地主机在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP确是一种最有效的工作方式(一般用于即时通信),比如: QQ语音 QQ视频 、直播等等 TCP提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP一般用于文件传输、发送和接收邮件、远程登录等场景。 -### 四 在浏览器中输入url地址 ->> 显示主页的过程(面试常客) +## 四 TCP协议如何保证可靠传输 + +1. 应用数据被分割成TCP认为最适合发送的数据块。 +2. **超时重传:** 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。 +3. TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。 +4. **校验和:** TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 +5. TCP的接收端会丢弃重复的数据。 +6. **流量控制:** TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的我数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。 (TCP利用滑动窗口实现流量控制) +7. **拥塞控制:** 当网络拥塞时,减少数据的发送。 +8. **停止等待ARQ协议(stop and wait)** 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。 + +### 超时重传 + +停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重转时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。连续ARQ协议可提高信道利用率。发送维持一个发送窗口,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了。 + +### 停止等待协议 +- 停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。 +- 为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停下来等待对方确认。这样可使信道上一直有数据不间断的在传送。这种传输方式可以明显提高信道利用率。 +### 滑动窗口 + +TCP利用滑动窗口实现流量控制的机制。 + +发送窗口里面的序号表示允许发送的序号。发送窗口后沿的后面部分表示已发送且已收到确认,而发送窗口前沿的前面部分表示不晕与发送。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口的前沿通常是不断向前移动的。一般来说,我们总是希望数据传输更快一些。但如果发送方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。 + +### 流量控制 + +流量控制是为了控制发送方发送速率,保证接收方来得及接收。 + +接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。 + +### 拥塞控制 + +在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。 + +为了进行拥塞控制,TCP发送方要维持一个 **拥塞窗口(cwnd)** 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。 + +TCP的拥塞控制采用了四种算法,即 **慢开始** 、 **拥塞避免** 、**快重传** 和 **快恢复**。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理AQM),以减少网络拥塞的发生。 + +- **慢开始:** 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。 + ![](https://user-gold-cdn.xitu.io/2018/8/10/1652348ada2c8fd0?w=1050&h=560&f=jpeg&s=112611) +- **拥塞避免:** 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1. +- **快重传与快恢复:** + 在TCP/IP中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有FRR,如果数据包丢失了,TCP将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了FRR,就不会因为重传时要求的暂停被耽误。  当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。 + ![快重传与快恢复](https://user-gold-cdn.xitu.io/2018/8/10/165234f0303d174b?w=1174&h=648&f=png&s=109568) + + + +### 五 在浏览器中输入url地址 ->> 显示主页的过程(面试常客) 百度好像最喜欢问这个问题。 > 打开一个网页,整个过程会使用哪些协议 @@ -128,19 +230,19 @@ TCP提供面向连接的服务。在传送数据之前必须先建立连接, -### 五 状态码 +### 六 状态码 ![状态码](https://user-gold-cdn.xitu.io/2018/5/8/1633e19dba27ed00?w=673&h=218&f=png&s=72968) -### 六 各种协议与HTTP协议之间的关系 +### 七 各种协议与HTTP协议之间的关系 一般面试官会通过这样的问题来考察你对计算机网络知识体系的理解。 图片来源:《图解HTTP》 ![各种协议与HTTP协议之间的关系](https://user-gold-cdn.xitu.io/2018/5/8/1633ead316d07713?w=841&h=1193&f=png&s=609513) -### 七 HTTP长连接、短连接 +### 八 HTTP长连接、短连接 在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。 @@ -158,20 +260,8 @@ Connection:keep-alive ## 写在最后 -### 推荐一个自己的开源的后端文档 - -Java-Guide: Java面试通关手册(Java学习指南)Java Interview Customs Manual (Java Study Guide)。 - -👉Github地址:[https://github.com/Snailclimb/Java-Guide](https://github.com/Snailclimb/Java-Guide) - -👊文档定位:一个专门为Java后端工程师准备的开源文档,相信不论你是Java新手还是已经成为一名Java工程师都能从这份文档中收获到一些东西。 - -关于计算机网络基础知识大家可以查看(第一篇基础知识,第二篇偏总结,都很不错): -- [《计算机网络知识总结》](https://github.com/Snailclimb/Java-Guide/blob/master/计算机网络与数据通信/干货:计算机网络知识总结.md)。 -- [面试带你飞:这是一份全面的 计算机网络基础 总结攻略](https://juejin.im/post/5ad7e6c35188252ebd06acfa) - ### 计算机网络常见问题回顾 -计算机网络最常见的问题我觉得应该是这5个了: + - ①TCP三次握手和四次挥手、 - ②在浏览器中输入url地址->>显示主页的过程 - ③HTTP和HTTPS的区别 @@ -181,7 +271,12 @@ Java-Guide: Java面试通关手册(Java学习指南)Java Interview Customs ### 建议 非常推荐大家看一下 《图解HTTP》 这本书,这本书页数不多,但是内容很是充实,不管是用来系统的掌握网络方面的一些知识还是说纯粹为了应付面试都有很大帮助。下面的一些文章只是参考。大二学习这门课程的时候,我们使用的教材是 《计算机网络第七版》(谢希仁编著),不推荐大家看这本教材,书非常厚而且知识偏理论,不确定大家能不能心平气和的读完。 -> 如果想要获取更多我的原创文章,欢迎关注我的微信公众号:"**Java面试通关手册**" 。无套路,希望能与您共同进步,互相学习。 + +参考: + +[https://blog.csdn.net/qq_16209077/article/details/52718250](https://blog.csdn.net/qq_16209077/article/details/52718250) + +[https://blog.csdn.net/zixiaomuwu/article/details/60965466](https://blog.csdn.net/zixiaomuwu/article/details/60965466) + -![](https://user-gold-cdn.xitu.io/2018/7/5/1646a3d308a8db1c?w=258&h=258&f=jpeg&s=27034) -- GitLab