参考资料:
JavaGuide 面试指南
相关面试题:
OSI 七层模型是什么?每一层的作用是什么?
TCP/IP 四层模型是什么?每一层的作用是什么?
为什么网络要分层?
OSI 七层模型 是国际化标准组织 提出的一个网络分层模型:
OSI 的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用,而且有些功能在多个层中重复出现。
需要注意的是,我们并不能将 TCP/IP 四层模型 和 OSI 七层模型完全精确地匹配起来,不过可以简单将两者对应起来,如下图所示
应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。
我们把应用层交互的数据单元称为报文。
常见的应用层 协议:
传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务
运输层主要使用以下两种协议:
网络层负责为分组交换网上的不同主机提供通信服务。
在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。(网络会把上一层的数据分组)
网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。
注:不要把运输层的“用户数据报 UDP”和网络层的“IP 数据报”弄混。
网络层的还有一个任务就是选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。
网络层常见协议 :
IP:网际协议 :网际协议 IP 是TCP/IP协议中最重要的协议之一,也是网络层最重要的协议之一,IP协议的作用包括寻址规约、定义数据包的格式等等,是网络层信息传输的主力协议。目前IP协议主要分为两种,一种是过去的IPv4,另一种是较新的IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
**ARP 协议 ** :ARP协议,全称地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个IP数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但IP地址属于逻辑地址,而MAC地址才是物理地址,ARP协议解决了IP地址转MAC地址的一些问题。
**NAT:网络地址转换协议 ** :NAT协议(Network Address Translation)的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,LAN)内,各主机使用的是同一个LAN下的IP地址,但在该LAN以外,在广域网(WAN)中,需要一个统一的IP地址来标识该LAN在整个Internet上的位置。
数据链路层的作用是将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异
应用层协议:
传输层协议 :
网络层协议 :
网络层协议:
分层的作用:
- 各层之间相互独立
- 提高了整体灵活性
- 大问题化小
(注意这些协议都是 应用层的协议)
使用 TCP 的协议:
使用 TCP 的协议:
HTTP 协议是基于 TCP 协议的,所以发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 三次握手。
相关面试题 :
- 为什么要三次握手?
- 第 2 次握手传回了ACK,为什么还要传回SYN?
- 为什么要四次挥手?
- 为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
- 如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
- 为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
当建立了 3 次握手之后,客户端和服务端就可以传输数据啦!
三次握手是为了建立可靠的通信信道
1、第一次握手,Client 什么都确定不了,Server可以 确定 Client发送正常,自己接收正常
2、第二次握手,Client 确定了:自己可以发送,接收,对方可以发送,接收,Server确认了对方发送正常,自己接收正常
3、第三次握手 :Client 确认了:自己可以发送、接收,对方可以发送、接收;Server 确认了:自己可以发送、接收,对方可以发送、接收
通过三次握手就能确定 双发收功能都正常,缺一不可
Server 传给 Client 的ACK 是微辣告诉 Client:我收到的信息确实就是你发送的。
回传 SYN 则是为了建立并确认从服务端到客户端的通信。
SYN 同步序列编号(Synchronize Sequence Numbers)
- 客户机首先发出一个 SYN 消息,
- 服务器使用 SYN-ACK 应答表示接收到了这个消息,
- 最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。
先关的 服务端 在关的客户端(注意最后一步:客户端发完ACK 进入等待,服务器收到ACK 直接关闭,客户端等待 2MSL (MSL:报文段最长寿命),再关闭)
TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
因为 第二次挥手 和 第三次挥手 之间 服务器还可以发送数据,所以第二次 和 第三次挥手 不能合并在一起。
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
客户端没有收到 ACK 确认,会重新发送 FIN 请求。
MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。
前面我们讲了 UDP 是不可靠的,TCP 是可靠的,会建立连接,有状态,那么TCP是如何保证自己的传输可靠性的呢?
TCP 利用滑动窗口实现流量控制
)。
注意 拥塞控制 和 流量控制 的区别:
拥塞控制 往往是全局性的
流量控制 往往是点对点通信量的控制,是个端到端的
流量控制是为了防止 发送速率 大于 接收速率
阻塞控制是为了防止 请求速率 大于 发送速率(对网络中某一资源的需求超过了该资源所能提供的可用部分)
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
为什么需要流量控制 ?:
因为双方在通信的时,两边的速率可能不一样,如果发送速率太快,会导致接收方处理不过来。 如果处理不过来的话,就把处理不过来的数据存在 接收缓冲区 (Receiving Buffers)(失序的数据包也会被存放在缓存区里)。如果接收缓存区也满啦,那么接收方就会把收到的数据包就掉,浪费资源!!!
要达到一种动态平衡。
这里需要注意的是(常见误区):
TCP 是全双工通信,客户端和服务端既可能是发送端又可能是服务端,两端各有一个发送缓冲区和接收缓冲区,各自维护一个发送窗口和一个接收窗口。 接收窗口大小取决于引用,系统,硬件的限制(TCP 传输速率不能大于应用的数据处理速率),发送窗口和接收窗口的要求一样。
TCP 发送窗口可以划分成四个部分 :
- 已经发送并且确认的TCP段(已经发送并确认);
- 已经发送但是没有确认的TCP段(已经发送未确认);
- 未发送但是接收方准备接收的TCP段(可以发送);
- 未发送并且接收方也并未准备接受的TCP段(不可发送)。
SND.WND :发送窗口。
SND.UNA:Send Unacknowledged 指针,指向发送窗口的第一个字节。
SND.NXT:Send Next 指针,指向可用窗口的第一个字节。
TCP 接收窗口可以划分成三个部分 :
- 已经接收并且已经确认的 TCP 段(已经接收并确认);
- 等待接收且允许发送方发送 TCP 段(可以接收未确认);
- 不可接收且不允许发送方发送TCP段(不可接收)。
TCP接收窗口结构图示 :
接收窗口的大小是根据接收端处理数据的速度动态调整的。 接收端读取数据快,接收窗口可能会扩大
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。
注意 拥塞控制 和 流量控制 的区别:
拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口 (cwnd) 的状态变量。
拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。
发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP 的拥塞控制 有四种算法:
在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1.
快重传 与 快恢复: 在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收方 接收到一个不按顺序的数据段,它会立即给发送方 发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
有 FRR就可以不暂停的 发送丢失的数据包,没有FRR就需要暂停 再去发送数据包
自动重传请求(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认信息 ACK(Acknoledgements),它通常会重新发送,直到收到确认或者重试超过一定的次数。
ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。
停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;
在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。
超时重传 和 快重传与快恢复 要区分开:
超时重传 和 快重传
超时重传:是 发送方没有收到接收方的确认,发送方认为接收方没有接收到(丢失了) 就自动重传
快重传:是接收方 发给 发放方 三个重复确认
,告诉发送方丢失数据,发送方立即 重传丢失的数据段
所以如果接收方收到重复的数据也要给发送方 发送确认ACK
) 确认丢失和确认迟到
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。
缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。