相对与上一个版本的计算机网路面试知识总结,这个版本增长了 “TCP 协议如何保证可靠传输”包括超时重传、中止等待协议、滑动窗口、流量控制、拥塞控制等内容而且对一些已有内容作了补充。html
学习计算机网络时咱们通常采用折中的办法,也就是中和 OSI 和 TCP/IP 的优势,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。git
结合互联网的状况,自上而下地,很是简要的介绍一下各层的做用。程序员
应用层(application-layer)的任务是经过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通讯和交互的规则。对于不一样的网络应用须要不一样的应用层协议。在互联网中应用层协议不少,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。咱们把应用层交互的数据单元称为报文。github
域名系统(Domain Name System缩写 DNS,Domain Name被译为域名)是因特网的一项核心服务,它做为能够将域名和IP地址相互映射的一个分布式数据库,可以令人更方便的访问互联网,而不用去记住可以被机器直接读取的IP数串。(百度百科)例如:一个公司的 Web 网站可看做是它在网上的门户,而域名就至关于其门牌地址,一般域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,相似的还有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco公司的域名是 www.cisco.com 等。面试
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为普遍的一种网络协议。全部的 WWW(万维网) 文件都必须遵照这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。(百度百科)算法
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通讯提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可使用同一个运输层服务。因为一台主机可同时运行多个线程,所以运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。数据库
网络层(network layer)负责为分组交换网上的不一样主机提供通讯服务。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,因为网络层使用 IP 协议,所以分组也叫 IP 数据报 ,简称 数据报。浏览器
这里要注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外,不管是哪一层的数据单元,均可笼统地用“分组”来表示。缓存
网络层的另外一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能经过网络层中的路由器找到目的主机。bash
这里强调指出,网络层中的“网络”二字已经不是咱们一般谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.
互联网是由大量的异构(heterogeneous)网络经过路由器(router)相互链接起来的。互联网使用的网络层协议是无链接的网际协议(Intert Prococol)和许多路由选择协议,所以互联网的网络层也叫作网际层或IP层。
数据链路层(data link layer)一般简称为链路层。两台主机之间的数据传输,老是在一段一段的链路上传送的,这就须要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端可以知道一个帧从哪一个比特开始和到哪一个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端可以检测到所收到的帧中有偏差错。若是发现差错,数据链路层就简单地丢弃这个出了差错的帧,以免继续在网络中传送下去白白浪费网络资源。若是须要改正数据在链路层传输时出现差错(这就是说,数据链路层不只要检错,并且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
在物理层上所传送的数据单位是比特。 物理层(physical layer)的做用是实现相邻计算机节点之间比特流的透明传送,尽量屏蔽掉具体传输介质和物理设备的差别。 使其上面的数据链路层没必要考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来讲,这个电路好像是看不见的。
在互联网使用的各类协中最重要和最著名的就是 TCP/IP 两个协议。如今人们常常提到的TCP/IP并不必定单指TCP和IP这两个具体的协议,而每每表示互联网所使用的整个TCP/IP协议族。
上面咱们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图总结一下。图片来源:blog.csdn.net/yaopeng_200…
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。
漫画图解:
图片来源:《图解HTTP》
简单示意图:
三次握手的目的是创建可靠的通讯信道,说到通信,简单来讲就是数据的发送与接收,而三次握手最主要的目的就是双方确认本身与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
第二次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身接收正常,对方发送正常
第三次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身发送、接收正常,对方发送接收正常
因此三次握手就能确认双发收发功能都正常,缺一不可。
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
双方通讯无误必须是二者互相发送信息都无误。传了 SYN,证实发送方到接收方的通道没有问题,可是接收方到发送方的通道还须要 ACK 信号来进行验证。
SYN 是 TCP/IP 创建链接时使用的握手信号。在客户机和服务器之间创建正常的 TCP 网络链接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通讯传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ])消息响应。这样在客户机和服务器之间才能创建起可靠的TCP链接,数据才能够在客户机和服务器之间传递。
断开一个 TCP 链接则须要“四次挥手”:
任何一方均可以在数据传送结束后发出链接释放的通知,待对方确认后进入半关闭状态。当另外一方也没有数据再发送的时候,则发出链接释放通知,对方确认后就彻底关闭了TCP链接。
举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,可是 B 可能还会有要说的话,A 不能要求 B 跟着本身的节奏结束通话,因而 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。
上面讲的比较归纳,推荐一篇讲的比较细致的文章:blog.csdn.net/qzcsu/artic…
UDP 在传送数据以前不须要先创建链接,远地主机在收到 UDP 报文后,不须要给出任何确认。虽然 UDP 不提供可靠交付,但在某些状况下 UDP 确是一种最有效的工做方式(通常用于即时通讯),好比: QQ 语音、 QQ 视频 、直播等等
TCP 提供面向链接的服务。在传送数据以前必须先创建链接,数据传送结束后要释放链接。 TCP 不提供广播或多播服务。因为 TCP 要提供可靠的,面向链接的运输服务(TCP的可靠体如今TCP在传递数据以前,会有三次握手来创建链接,并且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开链接用来节约系统资源),这一难以免增长了许多开销,如确认,流量控制,计时器以及链接管理等。这不只使协议数据单元的首部增大不少,还要占用许多处理机资源。TCP 通常用于文件传输、发送和接收邮件、远程登陆等场景。
1) 无差错状况:
发送方发送分组,接收方在规定时间内收到,而且回复确认.发送方再次发送。
2) 出现差错状况(超时重传):
3) 确认丢失和确认迟到
确认丢失:确认消息在传输过程丢失
确认迟到 :确认消息在传输过程当中迟到
中止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。所以每发送完一个分组须要设置一个超时计时器,其重转时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。
优势: 简单
缺点: 信道利用率低
连续 ARQ 协议可提升信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组能够连续发送出去,而不须要等待对方确认。接收方通常采用累计确认,对按序到达的最后一个分组发送确认,代表到这个分组为止的全部分组都已经正确收到了。
优势: 信道利用率高,容易实现,即便确认丢失,也没必要重传。
缺点: 不能向发送方反映出接收方已经正确收到的全部分组的信息。 好比:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方没法知道后三个分组的下落,而只好把后三个所有重传一次。这也叫 Go-Back-N(回退 N),表示须要退回来重传已经发送过的 N 个消息。
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种状况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可使网络中的路由器或链路不致过载。拥塞控制所要作的都有一个前提,就是网络可以承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到全部的主机,全部的路由器,以及与下降网络传输性能有关的全部因素。相反,流量控制每每是点对点通讯量的控制,是个端到端的问题。流量控制所要作到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,而且动态变化。发送方让本身的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。在网络层也可使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减小网络拥塞的发生。
百度好像最喜欢问这个问题。
打开一个网页,整个过程会使用哪些协议
图片来源:《图解HTTP》
通常面试官会经过这样的问题来考察你对计算机网络知识体系的理解。
图片来源:《图解HTTP》
在HTTP/1.0中默认使用短链接。也就是说,客户端和服务器每进行一次HTTP操做,就创建一次链接,任务结束就中断链接。当客户端浏览器访问的某个HTML或其余类型的Web页中包含有其余的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会从新创建一个HTTP会话。
而从HTTP/1.1起,默认使用长链接,用以保持链接特性。使用长链接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
复制代码
在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP链接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经创建的链接。Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。实现长链接须要客户端和服务端都支持长链接。
HTTP协议的长链接和短链接,实质上是TCP协议的长链接和短链接。
很是推荐你们看一下 《图解HTTP》 这本书,这本书页数很少,可是内容非常充实,无论是用来系统的掌握网络方面的一些知识仍是说纯粹为了应付面试都有很大帮助。下面的一些文章只是参考。大二学习这门课程的时候,咱们使用的教材是 《计算机网络第七版》(谢希仁编著),不推荐你们看这本教材,书很是厚并且知识偏理论,不肯定你们能不能心平气和的读完。
Java-Guide:一份涵盖大部分Java程序员所须要掌握的核心知识,正在一步一步慢慢完善,期待您的参与。
Github地址:github.com/Snailclimb/…
参考:
你若怒放,清风自来。 欢迎关注个人微信公众号:“Java面试通关手册”,一个有温度的微信公众号。公众号有大量资料,回复关键字“1”你可能看到想要的东西哦!