说说OSI 七层、TCP/IP 四层的关系和区别?
OSI 七层从下往上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP 四层从下往上依次是:网络接口层、网络层、传输层、应用层。
特点:
- 层与层之间相互独立又相互依靠
- 上层依赖于下层,下层为上层提供服务
TCP/IP 四层是 OSI 七层的简化版,已经成为实事国际标准。
说说TCP 与 UDP 的区别?
总结:
- TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服务。
- UDP 没有 TCP 传输可靠,但是可以在实时性要求高的地方有所作为。
- 对数据准确性要求高,速度可以相对较慢的,可以选用TCP。
TCP 是如何实现数据的可靠性?
一句话:通过校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制等机制来保证可靠性。
校验和:
- 在数据传输过程中,将发送的数据段都当做一个16位的整数,将这些整数加起来,并且前面的进位不能丢弃,补在最后,然后取反,得到校验和。
- 发送方:在发送数据之前计算校验和,并进行校验和的填充。接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方进行比较。
序列号:
- TCP 传输时将每个字节的数据都进行了编号,这就是序列号。序列号的作用不仅仅是应答作用,有了序列号能够将接收到的数据根据序列号进行排序,并且去掉重复的数据。
确认应答:
- TCP 传输过程中,每次接收方接收到数据后,都会对传输方进行确认应答,也就是发送 ACK 报文,这个 ACK 报文中带有对应的确认序列号,告诉发送方,接收了哪些数据,下一次数据从哪里传。
超时重传:
- 在进行 TCP 传输时,由于存在确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的 ACK 报文,并解析 ACK 报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟都没有接收到接收方传来的 ACK 报文,那么就对刚刚发送的数据进行重发。
连接管理:
- 就是指三次握手、四次挥手的过程。
流量控制:
- 如果发送方的发送速度太快,会导致接收方的接收缓冲区填充满了,这时候继续传输数据,就会造成大量丢包,进而引起丢包重传等等一系列问题。TCP 支持根据接收端的处理能力来决定发送端的发送速度,这就是流量控制机制。
- 具体实现方式:接收端将自己的接收缓冲区大小放入 TCP 首部的『窗口大小』字段中,通过 ACK 通知发送端。
拥塞控制:
- TCP 传输过程中一开始就发送大量数据,如果当时网络非常拥堵,可能会造成拥堵加剧。所以 TCP 引入了慢启动机制,在开始发送数据的时候,先发少量的数据探探路。
说说 TCP 协议如何提高传输效率?
一句话:TCP 协议提高效率的方式有滑动窗口、快重传、延迟应答、捎带应答等。
滑动窗口
- 如果每一个发送的数据段,都要收到 ACK 应答之后再发送下一个数据段,这样的话我们效率很低,大部分时间都用在了等待 ACK 应答上了。
- 为了提高效率我们可以一次发送多条数据,这样就能使等待时间大大减少,从而提高性能。 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。
快重传
- 快重传也叫高速重发控制。
- 那么如果出现了丢包,需要进行重传。一般分为两种情况:
- 情况一:数据包已经抵达,ACK被丢了。这种情况下,部分ACK丢了并不影响,因为可以通过后续的ACK进行确认;
- 情况二:数据包直接丢了。发送端会连续收到多个相同的 ACK 确认,发送端立即将对应丢失的数据重传。
延迟应答
- 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口大小可能比较小。
- 假设接收端缓冲区为1M,一次收到了512K的数据;如果立刻应答,返回的窗口就是512K;
- 但实际上可能处理端处理速度很快,10ms之内就把512K的数据从缓存区消费掉了;
- 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
- 如果接收端稍微等一会在应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;
- 窗口越大,网络吞吐量就越大,传输效率就越高;我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。
捎带应答
- 在延迟应答的基础上,很多情况下,客户端服务器在应用层也是一发一收的。这时候常常采用捎带应答的方式来提高效率,而ACK响应常常伴随着数据报文共同传输。如:三次握手。
你知道 TCP 如何处理拥塞吗?
网络拥塞现象是指到达通信网络中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机制。
拥塞控制的四个阶段:
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
讲一下三次握手和四次挥手全过程
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;