十年架构师教你:如何搞定计算机网络面试
OSI与TCP/IP各层的结构与功能,都有哪些协议
五层协议的体系结构
学习计算机网络时,我们一般采用折中的办法,中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。接下来结合互联网的情况,自上而下,简要地介绍一下各层的作用。
1、应用层
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用,应用层协议定义的是应用进程间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议,在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等等。我们把应用层交互的数据单元称为报文。
域名系统(Domain Name System)
域名系统是因特网的一项核心服务,它作为将域名和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)的主要任务是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文,“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务,由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能;所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议:
1、传输控制协议 TCP--提供面向连接的,可靠的数据传输服务。
2、用户数据协议 UDP--提供无连接的,尽最大努力的数据传输服务。
UDP 的主要特点:
UDP 是无连接的;
UDP 尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态;
UDP 是面向报文的;
UDP 没有拥塞控制,因此网络出现拥塞不会使主机的发送速率降低;
UDP 支持一对一、一对多、多对一和多对多的交互通信;
UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP 的主要特点:
TCP 是面向连接的(就像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
TCP 提供可靠交付的服务,通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
TCP 提供全双工通信, 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
面向字节流。TCP 中的“流”指流入进程或从进程流出的字节序列;“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
3、网络层
网络层(network layer)负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。
注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混,另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能通过网络层中的路由器找到目的主机。
强调:网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称。互联网是由大量的异构网络通过路由器相互连接起来的,互联网使用的网络层协议是无连接的网际协议和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。
4、数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装程帧,在两个相邻节点间的链路上传送帧,每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。控制信息还使接收端能够检测到所收到的帧中有误差错,如果发现差错,数据链路层就简单地丢弃这个出了差错帧,以避免继续在网络中传送下去白白浪费网络资源;如果需要改正数据在链路层传输时出现差错(数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错,这种方法会使链路层的协议复杂些。
5、物理层(physical layer)
在物理层上所传送的数据单位是比特。物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异,使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
在互联网使用的各种协中最重要和最著名的就是 TCP/IP 两个协议,现在人们经常提到的TCP/IP并不一定单指TCP和IP这两个具体的协议,而往往表示互联网所使用的整个TCP/IP协议族。
以上我们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图。
TCP 三次握手和四次挥手(面试常客)
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。
漫画图解:
简单示意图:
客户端–发送带有 SYN 标志的数据包–一次握手–服务端
服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端
为什么要三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
为什么要传回 SYN
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
传了 SYN,为啥还要传 ACK
双方通信无误必须是两者互相发送信息都无误,传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。
断开一个 TCP 连接则需要“四次挥手”:
客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送
服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
服务器-关闭与客户端的连接,发送一个FIN给客户端
客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1
为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态;当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。
TCP、UDP 协议的区别
UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式,比如: QQ 语音、 QQ 视频 、直播等等
TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接,TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
如果对java微服务、分布式、高并发、高可用、大型互联网架构技术、面试经验交流等等感兴趣的同学,可以关注我,我会不定期免费发放资料链接,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。欢迎分享,欢迎评论,欢迎转发,需要资料的同学Java后端技术群:819940388,或关注微信公众号:Java资讯库,回复“架构”,免费的大型互联网Java技术视频分享给大家。